Arouse Blockchain [Unity独立区块链]
❗️千万别被误导,上图内容虽然都在项目中可寻,但与目前区块链的业务代码关联不大,仅供宣传作用(总得放些图看着好看)。之所以有以上内容是项目有个目标功能是希望每个用户在区块链上都有一个独一无二的AI虚拟角色,目前角色出来了,但AI还没有训练😂,也没有完全接入区块链😂。So, 至少目前此项目更多的还是以区块链的纯代码为核心,也希望你把代码作为核心学习目标。
- 这是一个学习性质的项目,使用了Unity进行独立区块链的开发。
- 使用此项目,将默认你有一定的Unity基础,如果你是Unity小白,可以先学习Unity,B站有大量的教材。
快捷链接
目录|📖
- Arouse Blockchain [Unity独立区块链]
- 快捷链接
- 二. 项目使用说明🧪
- 1. 背景
- 2. 开发环境说明🏃
- 3. 整体架构
- 3.1 核心模块
- 3.2 业务层
- 3.3 数据层
- 3.4 通讯层
- 3.5 事务层
- 3.6 应用层
- 4. 文件结构
- 5. 功能清单
- 三. 代码使用💻
- 1. 发布服务器版本
- 2. 运行客户端
- 3. 在区块链中添加定制的数据类型
- 4. 添加自定义的网络消息体
- 4.1 自定义数据结构和解析业务
- 4.2 编写请求业务逻辑
- 4.3 响应业务逻辑
- 5. 添加自定义的配置文件
- 6. 完善Unity UI和业务代码
- 7. 代码声明
- 四. 区块链关键概念🌍
- 1. 👫P2P对等网络
- 2. 🚫不可逆加密
- 3. ⚖️共识机制
- 4. 📺分布式储存
- 一. 项目状态说明⛳️
- 1. 徽章
- 2. 相关仓库
- 3. 如何贡献❤️🌟
- 贡献者
- 4. 使用许可
二. 项目使用说明🧪
对 项目背景、开发环境、整体架构、文件结构、关键代码和功能解释方面进行展示说明。
1. 背景
都2023年了,区块链在当下的时代热浪下都已经是即将燃尽的火苗了,市面上关于区块链相关新闻咨询少了很多,而ChatGPT、Stable Diffusion等AI产品已经完成无缝接力,成为当下风口和热浪。
而区块链作为上一任浪热下的余晖,被打上“衍金融产品“的标签后,并没有对我们普通人的生活有什么改变。但潮水退去,不代表着它不会留下任何痕迹,目前区块链在国内更多作为信用链存在,用于法律签约、物流运输、商务合作、加密合约等等公共底层方面。
然而除了以艺术藏品方式可以被C端用户直接接触外,还有其他什么方向可以利用呢?其次作为产品经理,我需要对这些崭新的技术保持强力的热度与了解力。但买了很多区块链的书籍,也搜了很多文章,那些似是而非的内容,用了大量非技术的角度解说区块链,加上时间有限,总感觉自己对它的了解不够深刻,深刻到那种我可以一听到需求,就知道如何改进如果调整他们。那么如何深刻理解,我选择的方式即是:直接自己编程。
自己编程除了能深度了解技术原理,更重要的是你会容易沉浸其中,精力和时间不会容易分散,是适合短时间内深度了解一个事物的一种方式。当然,你还可以通过写书、开设论坛、融入相关群体天天交流等方式,都可以达到这个目的。
基于背景,这个项目也赋予了以下特性:
- 属于自学型项目,使用Unity和相关Unity插件重头编辑一个自己的区块链和P2P网络。
- 属于教学型项目,对于Unity、C#开发人员有很好的教学价值。
- 属于非专业的项目,给予教学目标,代码无法直接用于专业的商用。
- 属于非完全的项目,项目还在开发中,加上我并不是特别强的开发人员,所以项目中会有大量的瑕疵,请勿喷。
项目的目的:
- 国内技术能力日益增长,希望有更多开发者在闲暇之余,能研究区块链或其他的技术,做处一些有意义的项目,实现自身价值。
- 以及交流学习,提升自身。
如果你也是开发人员,如果你恰好还是Unity开发人员,那么同学,请收藏此仓库🌟,给个星星🌟。虽然当前项目不算完善,但你的一个小小的赞,是我们继续完善下去的最直接最强有力的动力。也希望这个鼓励❤️能延续传递下去,让更多的技术人员作出有意义的项目。
2. 开发环境说明🏃
为了避免不必要的错误,使用的Unity版本请不要大于或者小于此项目版本的2个版本。
基础说明 | 版本 | 其他 |
---|---|---|
Unity版本 | 2021.3.18f1c1 | |
数据库 | LiteDB.5.0.16 | 区块链数据都是保存在Peer设备的本地,区别与哪些设备有权保存。关于LiteDB |
P2P网络协议 | UDP | 以太坊也是使用的UDP协议 |
多线程工具 | UniTask | 关于UniTask |
网络插件 | SuperNet | 关于SuperNet |
3. 整体架构
3.1 核心模块
区块链概念中的“区块“,即是指一种数据结构,传统的数据在物理结构上就是把数据分别保存在不同的集中式数据服务器上,数据呈现是扁平型类,好处是数据统一管理方便存取,坏处是数据量增大时,就得增大对应的服务器设施。而区块链是把特定的数据一批批的打包加密好之后进行保存,并且包和包之间存在着不可断开的强联系,这种链式的数据结构称为区块链,而每次打包的数据体称为区块。这种链式结构的好处是每个包体相对独立又强烈依赖,每个包体的容量有限方便传输,但同时也带来了更多的难点,而区块链的其他模块即是针对这些问题而采取的技术手段。
其中“区块“模块,需要负责每个区块(也就是数据包)的打包、认证、加密、解析等等操作。
“交易/通讯“模块,主要负责用户之间的数据交互,之所以也用了“通讯“的命名,是因为“交易“是金融型区块链常用的命名,但其实对于程序来说它只是一种通讯数据类型,既然我们的是使用区块链应用于其他行业,所以用通讯交换更加贴切。
“交易/通讯池“模块,区块的打包只能去打包有效、正确合法的数据,所以用户之间的通讯信息不能直接就打包,需要先缓存在讯通池中,等有用户完成了特定事件,进行打包的时候再统一从池子里面获取通讯数据,进行验证后再打包。
“质押“模块,质押模块是POS权益证明类型的概念,属于区块链共识机制之一。无论是POW工作量证明还是POS权益,本质都是为了解决一个问题,谁有权益去打包,如果大家都可以无时间无条件限制的打包,那就产生了“先用谁的“和“谁的对“的问题。而共识机制即通过算法规则,让这种权利自动化的方式。在本项目代码中,你可以同时看到POW相关算法代码,也可以看到POW相关代码,且由于POW太消耗设备,所以此项目采用POS机制,当前我们知道了它的作用,你用其他机制甚至自研机制也可以,但是切记一个好的机制是赏罚分明且平衡,并且最主要是无法被恶意破坏。还有其他机制可以自行搜索。
“Peer节点“模块,区块链中重要的三个重要角色:用户、矿工、节点。这三个角色中由于权限、责任和保存数据的不同进行了划分。其中节点即是区块链P2P网络中的Peer,代表着网络中的一个节点,它有根据保存数据的多少分为全节点和SPV节点,全节点很好理解就是保存所以区块的数据,而SPV节点只是保存区块的索引信息,就好像是全节点保存了所有的书,而SPV只是保存了书的名字和位置,但没有书里面的内容。而矿工也是节点的一种类似,区块链会有一些社区自建的节点,而社区的扩展需要发展更多的节点,所以有了矿工,他们通过平台的共识机制通过付出一些成本,然后获取保存数据称为节点的存在,然后获取到对应的报酬。并且节点还其中中继器的左右,中继器就是一个中间人,在P2P网络中我要去和B进行通信,需要一个公网的中继服务帮我联系到对应的B,从而进行通信。最后就是用户了,用户很简单,即是区块链应用层的使用者。
在此学习项目中,我们将不区分用户、矿工、和节点,他们统一都是以节点存在,有着节点的责任和义务。
“Peer储仓“模块,储仓是此项目的概念,此项目希望区块链不只是保存数字类型的数据,同时可以保存字符、图片、模型、动画等等这些游戏中使用的数据。那传统的金融区块链的金额保存和计算方式将无法使用,金融区块链计算一个人的资金额度数据,需要通过获取所有区块内交易的数据进行统计,实质上就是通过区块中所有的交易数额的加减的方式进行计算。而加减只适合数字,像字符、图片、模型等等属于唯一性质的虚拟物品文件,就无法通过区块的数字加减得出,所以有了储仓的概念。它的目的是保存非数字类型无法加减计算的数据,并且进行对物品文件数据进行加密打包和映射的工作。当然NFT等数字藏品也使用了类似的方式,只是它们不这么命名,而且区块链的储仓 最好是保存物品数据的唯一映射索引,而物品文件数据保存在传统数据服务中即可,不然庞大的数据量会让区块链臃肿无法使用。区块链它并不能代替什么传统的结构,它只是一种新的细分产业的技术方案,就像C#、Python、C++都是一种编程方案,它们各有千秋,各有自己擅长的领域,所以不要陷入技术和舆论的误区,错误认为区块链是一种什么巅峰性的方案。
“钱包“模块,所有玩过区块链的用户,应该都知道钱包,其实就是钱包就是保存你进去区块链的一个凭证,更简单的说就是保存了你的银行卡号,它可以让你方便的访问区块链中属于你的数据。这里的钱包也相对比较简单,项目本意是想通过“BIP44规范“来实现钱包功能的,但是基于时间和需求量,暂时还是简单的钱包功能。而且这里的钱包生成的助记词采用的是“中文“🇨🇳。 (那必须得是中文!!)
3.2 业务层
业务层需要结合下文的[文件结构](#文件结构)来阅读。
上面讲述了区块链中几个关键的模块,而在Base文件夹下的代码即是对这几个模块的封装。具体功能需要查看代码,代码大部分都是中文注释。
3.3 数据层
数据层也需要结合下文的[文件结构](#文件结构)来阅读。
数据层和业务层承上启下,代码均在“DB文件夹“中,是对应模块进行数据库操作的对应代码。
由于区块链概念中没有中央服务器,那也没有中央数据库,这也是为什么区块链采用的P2P网络形式,所有的数据都是保存在各个节点的本地。而此项目的所有终端都是节点,所以都需要本地数据库,而这里采用了LiteDB数据库,它是一种简洁快捷本地数据库方案,更多关于此数据库的信息可以阅览对应官网。
3.4 通讯层
网络通讯协议采用的是UDP,不用担心它会导致数据丢失,基于Unity插件社区的强大,使用的SuperNet网络插件,它提供了可靠的UDP链接,再保留了部分传输速度和传输便捷性的同时也保存了数据的稳定性。
根据GRPC通讯以及Unity Unet通讯的架构,这里对通讯层的代码进行了二次封装,使其更好的区分请求和响应的业务,程序会自动处理数据的分发和解析,开发者只需要完善业务逻辑处理即可,当然想要完善特殊业务,还是需要进一步修改的。
其中Services
文件夹保存的对应的数据字段定义,这些定义的类,即用于数据库的保存,同时也用于网络传输,同时这里面也需要定于对于业务的处理机制,机制包括请求和响应的数据。
[弃用,由于请求接口相对业务逻辑简单,直接可在Services文件夹定义脚本的时候根据固定方式实现]。ClientImpl
文件夹保存了对应请求接口的实现。
ServiceImpl
文件夹保存了对应的业务和数据的响应与处理脚步,简单说就是实现了Services
文件夹中对应类的抽象响应方法。
3.5 事务层
事务管理层主要就是使用了简单的Facade模式来实现区块链的高层接口,方便后续开发方便对接。除了区块链对应的几个核心模块的功能,还有本身数据库事务管理、矿工挖矿的事务管理和应用层面用户钱包业务的相关管理。
3.6 应用层
更多区块链信息可以直接跳转到区块链概念简述,了解区块链基本概念。
如果你对区块链有了一定的了解了,就会知道它其实就是一种采用P2P网络的新式网络服务架构,不依赖于中央服务器和数据库,可以更好的把数据的权利分发给用户,也可以减少企业的服务器运营和维护成本。但最大的劣势很明显,不适合保存体积过大的数据。
但不管它怎么改变,他其实还是一种网络服务。对于我们用户,数据保存在哪里?怎么保存?怎么链接网络?我们是无法直接感受到变化的。我们注重还是产品本身的价值,比如它是能帮我节省流量?还是它能让我的账户更安全?还是它能让我的权益得道更好的保证?还是它能给我生活提升什么便利?亦或是它能让我通过数据挣钱?而恰恰我们在意的点在目前的区块链技术中无法体验。 区块链的金融属性比较特殊,这里不加评论,但简单来说它不具有传统的用户价值,至少目前是的。除非哪天赌博属于有价值的致富方式。
这一无法给用户带来直观价值的要素决定了区块链的局限性,它目前以信任链的作用更多用于一些ZhengFu或者大厂的基础设施的改革和实验,但也是局部范围的。
当然这一呈否定的认知,只是让我们站在落地的角度认清区块链就是一种网络服务,而不去过度神化,这样才能保持冷静的思考它的可用性。并且我们还没有说 智能合约
这一利器,并不能彻底否定它的存在。
这里也给出了一些应用方面的可能性:
积分权益: 区块链的共识机制和不可破坏的社区规则,恰恰可以用于社区服务,目前行业内社区服务的权益激励确实还存在很大的空缺。如果针对社区权益使用区块链进行Saas化,方便其他三方平台进行参与,为社区用户提供更多的生态转化、更多样的价值体现,将会有联合社区一样的形态存在,集合起来服务用户。当然这也需要区块链具备
智能合约
的功能。当然这里只是提供假设,具体实施肯定有更多问题。但假设你开发的产品进行宣传的时候告知用户,你继承了XXX社区链可以共享权益,应该会有很多用户因为之前的存量权益特意去你的产品里面进行体现的。提现有金融性质,体现是通过某种性质或现象通过某一事物具体表达表现出来,可能会更宽泛的形容这一兑换的行为
。
正负奖励训练数据: AI实在是太火了,而且由于AI的特性,未来数据的价值会越显重要。假设我们想要开发一套AI无人驾驶飞行算法,传统的方式即是通过大量的现实实验和少量的虚拟实验进行训练。而如果使用游戏化的方式,通过让玩家在游戏中操作无人机进行娱乐,并且在这个过程中收集操作数据,并且给予训练服务进行训练,可能会极大的节省AI训练的成本也就是数据来源的成本。当然这只是不专业的假设,具体实施起来,会发现实际的AI无法驾驶和虚拟的驾驶环境相差过大,模型的泛化能会很低很低,并且还涉及到摄像头的视觉识别,导致虚拟化可能性降低和成本变高。但目前仅是假设,具体实施可行性需要交给未来。
[最新咨询显示英伟达NVLink互连技术已经实现了144 TB内存的共享显卡的调用,对于未来AI领域的发展有着重要的推动作用]
用户行为数据: 也是一种能为用户带来直接利益的方式,基于未来数据的价值,如果企业需要进行新市场的研究,或者新运营手段,用户数据能为相关策略提供直接价值。而目前行业中并没有这种用户通过出售个人数据来进行盈利的产品,一是你的数据其实不是你的数据,它们都是保存是对应企业的中央服务器,二是他们会把数据归于他们所有,其实理论上不归你所有,因为你无法利用到它,其次就算你的数据可以交易,但目前也没有网络架构无法为此提供保障。而区块链可以很好的提供此服务,对于任意方,大家数据不可篡改,即保护了数据的完整和真实性,也确保用户的权益。如果有天,你可以通过下载一个APP,然后APP有一个收集你健康数据的征集任务,任务标明了收集的数据明细以及最终收益,你是否会卖自己的数据呢?
个体价值数据: 这个和积分权益差不多,就是把个体用户的数据价值体验出来。也是这个游戏项目想要实现的目标,设想你购买的王者荣耀的皮肤、装备、特效、模型以及你的游戏好友数据真是意义上是属于你的,你还可以把它用于吃鸡或者其他游戏 ,是不是感觉很酷。
4. 文件结构
方便开发者快速定位到项目中区块链的代码
以下⬇️是所有Assets资源下的文件夹
文件夹 | 说明 |
---|---|
Adaptive Performance | Unity手机模版自带,不解释,自查 |
AMyML | 未来做AI训练的测试文件夹 |
ArouseBlockchain | 本项目区块链相关的所有代码 |
Best HTTP | 未来做Http请求,方便网页展示的 |
Editor | 不解释,自查 |
InfinityPBR | 目前项目中那个果冻形象的相关资源文件夹 |
ML-Agents | Unity AI 角色训练的相关代码 |
MobileDependencyResolver | 不解释,自查 |
Plugins | 不解释,自查 |
Resources | 不解释,自查 |
Scenes | 不解释,自查 |
StreamingAssets | 不解释,自查 |
SuperNet | 目前项目中网络通信的核心代码 |
TextMesh Pro | 不解释,自查 |
TutorialInfo | 不解释,自查 |
UltimateCleanGUIPack | 目前项目中UI的素材插件 |
Unity-Logs-Viewer | 用于手机平台进行Log打印的插件 |
Unity.VisualScripting.Generated | 不解释,自查 |
以下⬇️是ArouseBlockchain/Scripts
脚步文件夹列表。
文件/文件夹 | 路径 | 说明 |
---|---|---|
ArouseBlockchain/ | …/Assets/ArouseBlockchain/… | 区块链核心代码,核心代码尽量和Unity代码分离开来,很小的工作量就可以彻底独立出来,方便你用于其他非Unity的C#项目 |
Base/ | …/ArouseBlockchain/Scripts/… | 区块链核心代码 |
Common/ | 同上 | 区块链公共代码 |
DB/ | 同上 | 数据保存业务处理 |
P2PNet/ | 同上 | P2P网络通信类 |
Solve/ | 同上 | Facade模式的高层接口类,用于统筹和对公业务 |
…/Scenes/ArouseBlockchain.unity | …/ArouseBlockchain/Scenes/… | 客户端场景 |
…/Scenes/Server.unity | 同上 | 服务端运行场景,如何使用? |
5. 功能清单
✅ 已完成 ⏯️ 进行中 🚩 计划中
现有特征 包括已有和在本期开发计划中的 | 未来规划 未来可能会实现的功能 |
---|---|
✅ 以及区块链基本算法和功能(除了挖矿和矿工的概念) | 🚩 开通三方接口给游戏方 (使用接口下载用户3D素材,打通游戏壁垒,是否可以实现商业目的完全看用户体量) |
✅ P2P网络链接 (持续性检索Peer对等端) | 🚩 对接中心化服务器,托管与任何官方的管理体系 |
✅ UDP通信 | 🚩 加入游戏类型AI,用户帮助训练AI模型 (赛车游戏、飞行器游戏等等机械操作类和其他) |
✅ 自定义NFT支持 (区块支持模型、贴图、动画的交换) | 🚩 加入更多中继服务器 |
✅ 冷钱包支持 (BIP44分层HD规则的自定义钱包) | 🚩 创建H5前段展示功能,可供查看区块情况,以及H5进行区块操作 |
✅ 中文助记词采用 | …. (或者你来提议,我来选择?) |
✅ 支持 IP6 通讯 | |
✅ 简单游戏化运营思维的权益证明 | |
✅ 去货币概念 (不与数字货币有任何关联 ) | |
⏯️ 虚拟形象的集成 | |
⏯️ P2P双人小游戏支持 | |
⏯️ AI模块集成 (Unity的机器学习ML-Agents) |
三. 代码使用💻
本教程只能把一些重点进行讲解,无法对每个脚步和代码都进行一行行说明,所以肯定会有遗漏,如有你无法明天的,可以留言私信。
1. 发布服务器版本
服务器版本需要选中且只能Server场景,然后切换到Dedicated Server
发布平台,点击Build
即可发布出没有任何渲染画面的服务器软件,可以发布到 Linux、Window、Mac平台。
发布成功后,即可以部署在对应公网服务设备后,并操作设备的防护墙,打开特定的端口44824
,端口号可以在对应脚步中修改⬇️
- 关于如果部署自己的服务设备,需要自己学习,可行的方案是阿里云 + 宝塔 即可,把打包后的代码上传,作为程序运行即可。如果端口权限无误,应该就可以直接访问了。当然如果作为测试,也可以本地运行。
- 其中
44824
是所有中继节点的唯一端口号,客户端Peer通过此端口访问公共的中继节点,以此作为桥梁,和其他客户端Peer进行P2P网络通讯。 - 客户端Peer是不需要固定的端口号的,都是随机的。其中 端口号为
0
即是代表着端口随机。
2. 运行客户端
依据上图的文件路径找到,客户端场景,运行即可。
区块链的核心代码均在ArouseBlockchain
对象上,主要代码即ABlockChain
,可以看到上面会有一些测试按钮,从上到下分别对应的 1. 通过公钥地址发送交易(币)
、2. 通过公钥地址发送物品(图片...)
、3. 获取对应地址的余额和物品列表
、4. 获取历史的交易列表
、5. 展示钱包信息
、6. 展示创世区块和最后一个块的信息
。
而ANetworkHost 和 NetworkManager的配置说明可以查看相关文档。
3. 在区块链中添加定制的数据类型
如果需要定义自己的区块数据,需要在NetStorageItem.cs
中添加自己数据对象的类,目前已有了StorageNumberItem
数字型对象,可以进行积分、经验等等数字类型的数据; 以及StorageObjItem
对象型对象,理论上你的数据类型不是特别复杂完全可以用此对象作为交易数据对象,当然也可以继承重构。
当你定制了你自己的数据类型之后,还要在AStorageItem.cs
⬆️代码中修改铸造方法,让代码适应你的数据类型。这样,区块链上进行的数据交互就可以有更多的可能性。
4. 添加自定义的网络消息体
其中P2P网络中,服务器和客户端的边界是相对模糊的,这里代码会进行分开命名主要是为了方便理解。但在业务处理中,服务和客户端的业务处理和传统的方式不同。理论上P2P的客户端也可以是服务器,服务器也可以是客户端,我们统一都称呼为 Host。
4.1 自定义数据结构和解析业务
⬆️上图所示是区块模块需要进行网络通信的代码。设计和构造需要去NetBlock.cs
脚步中进行编写,此脚步中代码主要分为两部分,一部分是数据传输过程中的结构和类型定义,一部分是讯通请求和响应的业务处理。
其中数据定义需要同时符合数据库和网络接口的规范,具体规范可以看数据库定义规范和网络接口规范。
并且响应方法,如上图的abstract class BlockServer
一定需要继承INetServerSendComponent
接口,这样主程序会根据你的数据类型自动识别业务方法进行调用,会少去一些工作量。
另外,这里的代码框架是可以优化的,最好的方式是像GRPC.Tools一样解析.proto文件即可完成代码的自动构建。对此感兴趣的话可以自行百度相关资料。
需要特别说明是网络传输时数据类型的定义,如下。由于网络通信的信息体需要表明类型,以此说明这个信息体是什么,才能方便业务进行处理。所以这些类型一定不能重复,也就是 byte的数值不能有重复,并且数值需要在 0~255之间。如下我们定义了TransferRequest = 246
意思是交易的请求类型的246,那么其他类型就不能再用246了。
//byte :0~255
public enum TransactionMessageType : byte
{
// 1.发送一笔交易,Host接受到之后,保存到交易池子中,并广播出去
// 2.所有的Peer进行对交易的Pool保存
// 3.当其中一个Peer构建块的时候,把这个交易放入块中,并同步块。
TransferRequest = 246,
TransferResponse = 245,
TransactionListRequest = 244,
TransactionListResponse = 243,
}
4.2 编写请求业务逻辑
其中请求业务逻辑相对比较固定,下面是进行交易的请求接口,作为案例讲解。
CResponseAsyncComponent _TransferRequest_Obj;
public async Task<TransferResponse> TransferRequest_Obj(string sender, string recipient, string obj_Hash, int fee, CancellationTokenSource cancellationToken)
{
// 第一步:创建一个异步组建用于进行异步P2P访问,并防止访问失效之前重复访问
if (_TransferRequest_Obj != null && _TransferRequest_Obj.IsWaitResponse_Connect)
{
ALog.Error("请勿重复访问!!");
return default;
}
if (_TransferRequest_Obj == null) _TransferRequest_Obj = new CResponseAsyncComponent();
// 第二步:开发进行P2P请求,并指定特定的请求数据类型和响应数据类型以及请求的Peer类
// 这里会进行异步等待,当有返回结果则返回 TransferResponse 类型的响应数据体,里面包含了你定义的数据内容,解析即可。
// 其中cancellationToken是统筹管理线程,并用来控制线程的响应超时时间的。如果不设置此数值,Unity主线程不会帮助你释放对应线程的,这会导致很多错误。
TransferResponse _ResponseMessage = await _TransferRequest_Obj.CRequest<TransferRequest, TransferResponse>(Peer,
new TransferRequest()
{
Sender = sender,
Recipient = recipient,
item_type = StorageItemType.NumberBase,
num_Amount = 0,
obj_Hash = obj_Hash,
Fee = fee
},
cancellationToken.Token);
return _ResponseMessage;
}
如上述代码注释:
- 第一步:创建一个异步组建用于进行异步P2P访问,并防止访问失效之前重复访问
- 第二步:开始进行P2P请求,并指定特定的请求数据类型和响应数据类型以及请求的Peer类。
这里会进行异步等待,当有返回结果则返回 TransferResponse 类型的响应数据体,里面包含了你定义的数据内容,解析即可。
其中cancellationToken是统筹管理线程,并用来控制线程的响应超时时间的。如果不设置此数值,Unity主线程不会帮助你释放对应线程的,这会导致很多错误。
4.3 响应业务逻辑
响应的业务逻辑会繁杂,所以需要单独的类中进行集成和实现。上图是现实了NetTransaction.TransactionServer
交换服务响应业务的方法。根据此逻辑实现你的业务逻辑即可。
5. 添加自定义的配置文件
如上图⬆️,可以通过目前我自己的一个云服务器获取到一个系统配置文件,以下是其中一个配置文件的内容。如图⬇️所示,此配置文件记录了一些社区管理人信任的初始节点BootSrtapPeers
列表(目前有些节点是本地测试的) ,它可以帮助新用户提供初次接入区块链,后面的节点程序会自己从新记录更多有效的节点。其中PublicIPServices
是公网验证的地址,目前是为了验证用户设备的公网地址,方便中继服务进行P2P打洞链接,并且还可以帮助判断是否多个设备处于同一局域网,如果局域网的设备会自动进行局域网通信,而不是公网,这对于游戏互动来说非常方便。
如果你需要添加自己的配置文件,也还是阿里云 + 宝塔 方案,可以方便的让你部署自己的配置文件。
6. 完善Unity UI和业务代码
为了更好的独立区块链的代码,方便你移植用于其他用途,这里会把Unity的代码放在单独的文件夹,即../Assets/ArouseBlockchain/Unity..
中,里面包括了UI素材和大量UI的代码。由于UI的工作量不是区块链的核心,这里的UI并没有很完善,只是做了适当的展示,没有进行美化。如果你有兴趣可以进行修改。
7. 代码声明
- 我不确定会有多少人用的到此项目代码,如果未来关注的人多了,大家提到关于代码的问题也多了,这里会继续完善。目前先写这么多,由于初次发布,也不清楚大家会提什么问题。
- 我的开发能力不是很强,如果大大神路过,发现代码中有不合适甚至很幼稚部分,请及时沟通。
- 我承认代码中还有很多为完成的部分,包括多余的代码、写了一半的程序、没有打通的业务、不够严谨的逻辑。希望有喜欢此项目的大神也可以直接进行共同完善。毕竟一个人的时间不是那么多,为了生计已经话费了太多时间。当然各位的支持也是完善下去的动力。
四. 区块链关键概念🌍
关于区块链概念中一些基础内容的简述
1. 👫P2P对等网络
传统的网络通讯结构是 C/S 形式的,S 就是一个以上负责通讯转发的服务器Server,C就是我们一个个的客户端Client。你现在手机上用的99%的APP都是这种网络结构,比如聊天软件,你要给朋友发送讯息,得先把讯息发给服务器,然后服务器找到你的朋友,再转发给你的朋友,这种需要中心服务器转发消息的网络架构就是C/S 架构。而P2P则完全不同,”P”即是 “Peer”,这里我给予技术解释为“对等端”,对等端可以理解为在一个业务体系中,同处于一个级别的所有端的全体的总称,简单来说的比如我们都是使用聊天工具的用户,我们每个用户就是同等级的对等端,而作为工作人员的聊天软件的运营人员又有着不同的权限和职责,它们又成为了新的同等级的对等端,且这个不同的等级的分界并不是那么统一的,这取决于你服务的业务。
当然上面说的是P2P的宏观定义,而P2P具体的技术实现架构就是一个让所有的对等端可以直接通讯,不需要中心服务器进行转发的网络架构。这也并不是什么新的技术了,迅雷的视频下载就提供了P2P,它的好处就是越多人下载,理论上你就有个越多的资源服务器,然后资源的下载速度就会快。这种方式一方面减少中心服务器的压力,一方面提升了用户的体验。
P2P的网络链接,也并不是完全不需要中心服务器,不然P和P一开始都不知道对方,也无从谈链接了。所以这里还会有一个以上的中继服务器的存在,中继服务器的作用之一就是帮助每个对等端建立开始时的链接,之后的通讯它们自己完成就可以。[而理论上中继服务器越多,整个业务系统也会更完善,这也预示着需要鼓励一些对等端成为中继,而这个问题则衍生了”共识机制”。虚拟**的解决方案就是矿工,用挖矿来激励更多端作为中继。]
2. 🚫不可逆加密
加密技术在目前行业里面已经应用的很广泛了,具体的技术细节就不多加赘述。简单来说,加密本质就是把一些人可以直接看懂的数据,利用技术手段使其变为乱码。而目前行业里区块链使用最多的是“SHA-256” 哈希算法,这种非对称加密算法的最大特点就是,加密后的数据无法或者极其困难反向推算出原始数据。(公钥私钥暂时不加赘述)这也导致直接结果是哪怕我自己私钥加密的数据,我也无法把加密后的数据进行反向推算。这种加密方式虽然说是“数据加密”,而且常识情况下人们也容易理解成你的数据加密后让别人无法看,但千万记住其实你自己其实也无法看。但它的价值就是在当下技术瓶颈下会非常安全,而作为持有公钥和私钥的你,就相当有了唯一的凭据,来证明这个数据是你的。
加密后,不可逆的特性也引申出了区块链是一种 “信任链”的概念。目前国内我们不知不觉的产业和业务都根据这一特性进行着改革。更多内容可以看中科院的相关文献。[上面还有量子通信、数字孪生、汽车行业等等相关行业技术发展的白皮书]
中国信通院:2022年区块链白皮书
随着数字经济时代到来,区块链与其他新一代信息技术交叉融合,其 信任价值将被进一步激发,通过充分融合公有链与联盟链技术优势, 为信任科技积蓄能量。信任科技以区块链等多技术融合为核心,着力 打造数字化信任基础设施。其既是数字经济新时代对于数据要素全流 程可信管理的必然要求,也是 Web3.0 发展中解决互联网数据要素权 属和交易流通问题的重要创新。
3. ⚖️共识机制
共识机制是整个区块链里面最不算技术的技术方案了,但又是最最重要的内容,涉及到你的区块链要怎么改造?区块链是否真的能帮助你的业务或产业等问题。当然,说它不是技术,是因为本身共识机制是结合社会学、人性、责任、惩戒、激励等等和人相关的内容,更像是一系列的运营规则。(当然也并不只局限于人,机器和机器也可以,技术只是工具)
讲一下共识机制,得再次着重声明下“共识”,共识是指达成一个各个分歧方所接受的解决方案(即使有时只是勉强接受,甚至只是搁置争议),而共识机制即这个方案的规则,当这个规则达成一致,会让本来混乱无章的系统更加稳定平衡且向上发展,这种机制我们生活中随处可以,公司考勤机制、城市管理规章、王者荣耀的铭文机制、交通红绿灯… 都是共识机制,且我们都默许并遵守着。由于目前行业没有较好且资料很多的区块链应用可以参考,我们可以先以虚拟**的共识机制进行讨论。
在说明虚拟的共识机制之前,得科普一个技术要素,那就是任何互联网产品,无论怎么更新迭代,都不能没有 网络通讯和数据库两个最基础的东西。而虚拟是以去中心服务器和P2P网络通讯的方式运行的互联网产品,那数据库保存在哪里很重要,但它又没有中心服务器,那只能选择保存在用户的终端上,那选择谁去保存呢?如果谁都可以随便随时无成本的保存,那它只需要购买N个服务器然后保存,就可以保存80%的数据,那最终裁决权就归属这个人了,这打破了平等的规则,肯定不行。这个时候这就引申出了矿工这一用户群体,行业里面说的质押、挖矿、工作量证明Pow、权益证明Pos其实就是通过不同的机制筛选出一些用户的终端,作为数据库的作用,用一定的成本来为区块链打工,并且换取更多的激励,并且还有其他的机制,比如如何证明谁的区块之间哪个是最新的,是正确的,谁付出的更多,如何解决区块的冲突等问题,也有着相应的机制。
上述我们参考了虚拟的共识机制,可以看出 机制就是碰到一个阻挡目标的问题而衍生出的解决方案,每个程序里面都有的自己的机制。但还有最重要的“共识”,因为你必须让参与解决方案的所有方认同并且依照这个规则,且也无法打破,才能更好的维护整个区块。办法也很简单,虚拟的方式就是加密和计算机程序来判决,而不是人去控制和判定。所以你的产业或者业务机制如果需要区块链来改进,那首先需要看本身业务的规则和规律是否稳定统一,并且可以用技术的方式去自动化。
我在创建这个博客的时候,ChatGPT 已经到了第四版本了,我有幸之前也参与过机器学习的项目,并且也在研究Unity的ML-Agents。结合区块链,感觉未来区块链结合AI一定是最强搭档,AI如果充当区块链共识机制检察长,在机制和共识两个方面都会有质的改进。
4. 📺分布式储存
上文说到互联网产品无法避免的两大基础要素,网络和数据库。由于P2P的网络结构把网络通讯99%的对接直接交给了每个对等端自己,那没有中心服务器,数据在哪里保存就是个问题了。这就对应了分布式储存,其实就是既然对等端自己对接,那数据它们来保存吧。
而保存数据需要的条件和要求不同,就延伸出了不同的区块链(联盟链、私有链、公链、 作侧链),其实它们主要区别就是保存数据的人/组织是谁有多少。但公链是最早由虚拟**引申出来的,但那时候这种颠覆传统的网络模式的改变,在利益的驱使下被赋予了敏感意义“去中心化”,因为公链就是所有人都有可以保存数据,在某些领域没有监管和高纬度的制度,这带来的只是另一种混乱。
那在讲区块链这种分布式储存架构之前,就得提到“集中式”和“分布式”概念,无论是系统和组织,都会面对集中式在系统扩张到一定规模后无法适应,分布式在又存在管理和成本的问题,系统小的时候无法支持。对于整体系统,集中式在前期易于管理,可以产生更好更快速的同步,并且很少会有子系统之间信息的矛盾和丢失,但劣势也很明显,在体量大到一定程度,事务的量和复杂度成指数提升,就会加重整体系统的负担,影响主系统的决策质量,且整体再去调整和整顿会有较大成本,子系统的均衡性(积极主动)也会减弱,慢慢的会导致整体系统缺乏外部环境的适应能力。而分布式呢,通常都是有了一定体积之后采取的扩张途径,太早期的话浪费成本又不会有太大价值,容易导致效率延缓,特别是前期不稳定的情况下容易无法凝聚,但体量大了之后就会形成稳固的规范规则,在这种规则规范下相对集中式会有效提高子系统参与和均衡,并且对于局部不断变化的需求很是有利,同时减轻了主系统的负担,使其精力更集中于重大事务的决策和处理。
所以长远来看,分布式有着它独有的价值,但代价也很明显,成本很高。就服务器和数据库来说,采用这种结构的都是大厂。而区块链恰恰是一种低成本的分布式解决方案,职责分散平等了,对应的成本也相应分散了,并且由于其透明公开、无法伪造的安全前提,更有助中心系统去观察和管理,最终会更方便有效的帮助整体业务的流通和运营。
当然虚拟**由于其那方便的特性,他只能作为公链才能得以被大众认同,但社会上其他业务和行业不同,可以根据区块链几大特点,可做拆解也可做加减 ,取能对自己有价值的即可。
一. 项目状态说明⛳️
1. 徽章
如果本项目对您的工作有着帮助,非常希望你能把这个徽章加入你的项目说明页面中。放心,此项目完全开源,在你的项目说明中加入此徽章,只是方便其他人访问到这个项目并也能使用到 Arouse Blockchain
,这对于行业内的开发大环境有着积极的影响,也会促进更多独立开发者有更强劲的动力做出好的项目。 ⚠️加入徽章并非强制的。
加入徽章到 Markdown 文本里面,可以使用以下代码:
//github仓库
[![Arouse区块链徽章](https://img-blog.csdnimg.cn/8cef8d1ca11a4151897a7ff54c87fcb6.jpeg =180x)](https://github.com/KitStarLee/ArouseBlockchain_Unity)
//gitee仓库
[![Arouse区块链徽章](https://img-blog.csdnimg.cn/8cef8d1ca11a4151897a7ff54c87fcb6.jpeg =180x)](https://gitee.com/KitStarLee_admin/arouse-blockchain)
2. 相关仓库
- UbudKusCoin — 💌 使用C#进行区块链编程的教程,给予了本项目很大的启发。此文没有针对编程有过多的教学,这个仓库可以弥补,对于技术人员有很大帮助。
3. 如何贡献❤️🌟
非常欢迎你的加入!提一个 Issue、提交一个 Pull Request 或者给予重要的建议, 即可对此项目做出贡献。
贡献者
感谢以下参与项目的人:
4. 使用许可
Eclipse Public License © KitStarLee