使用Unity开发一个独立的区块链

news2024/11/29 12:32:32

Arouse Blockchain [Unity独立区块链]

  1. 这是一个学习性质的项目,使用了Unity进行独立区块链游戏的开发。
  2. 使用此项目,将默认你有一定的Unity基础,如果你是Unity小白,可以先学习Unity,B站有大量的教材。

内容列表

项目的状态说明

  • 徽章
  • 维护者
  • 如何贡献
  • 使用许可

项目的使用说明
如果你是区块链小白,请跳转 [区块链概念简述] 或者其他区块链概念解说的文章。

  • 背景
  • 安装
  • 使用说明
    • 生成器

区块链概念简述

  • 徽章

未来趋势

  • 徽章

项目说明

对 项目背景、开发环境、整体架构、文件结构、关键插件、关键代码和功能解释方面进行展示说明。

背景

都2023年了,区块链在这此时代热浪下都已经是即将燃尽的火苗了,市面上关于区块链相关新闻咨询少了很多,而ChatGPT、Stable Diffusion等AI产品已经完成无缝接力,成为当下风口和热浪。
而区块链作为上一任浪热下的余晖,被打上“衍金融产品“的标签后,并没有对我们普通人的生活有什么改变。但潮水退去,不代表着它不会留下任何痕迹,目前区块链在国内更多作为信用链存在,用于法律签约、物流运输、商务合作、加密合约等等公共底层方面。

然而除了以艺术藏品方式可以被C端用户直接接触外,还有其他什么方向可以利用呢?其次作为产品经理,我需要对这些崭新的技术保持强力的热度与了解力。但买了很多区块链的书籍,也搜了很多文章,那些似是而非的内容,用了大量非技术的角度解说区块链,加上时间有限,总感觉自己对它的了解不够深刻,深刻到那种我可以一听到需求,就知道如何改进如果调整他们。那么如何深刻理解,我选择的方式即是:直接自己编程。

自己编程除了能深度了解技术原理,更重要的是你会容易沉浸其中,精力和时间不会容易分散,是适合短时间内深度了解一个事物的一种方式。当然,你还可以通过写书、开设论坛、融入相关群体天天交流等方式,都可以达到这个目的。

基于背景,这个项目也赋予了以下特性:

  1. 属于自学型项目,使用Unity和相关Unity插件重头编辑一个自己的区块链和P2P网络。
  2. 属于教学型项目,对于Unity、C#开发人员有很好的教学价值。
  3. 属于非专业的项目,给予教学目标,代码无法直接用于专业的商用。
  4. 属于非完全的项目,项目还在开发中,加上我并不是特别强的开发人员,所以项目中会有大量的瑕疵,请勿喷。

项目的目的:

  1. 国内技术能力日益增长,希望有更多开发者在闲暇之余,能研究区块链或其他的技术,做处一些有意义的项目,实现自身价值。
  2. 以及交流学习,提升自身。

如果你也是开发人员,如果你恰好还是Unity开发人员,那么同学,请收藏此仓库🌟,给个星星🌟。虽然当前项目不算完善,但你的一个小小的赞,是我们继续完善下去的最直接最强有力的动力。也希望这个鼓励❤️能延续传递下去,让更多的技术人员作出有意义的项目。


环境说明🏃

为了避免不必要的错误,使用的Unity版本请不要大于或者小于此项目版本的2个版本。

基础说明版本其他
Unity版本2021.3.18f1c1
数据库LiteDB.5.0.16区块链数据都是保存在Peer设备的本地,区别与哪些设备有权保存
P2P网络协议UDP以太坊也是使用的UDP协议
多线程工具UniTask关于UniTask
网络插件SuperNet关于SuperNet

整体架构

在这里插入图片描述

核心模块

区块链概念中的“区块“,即是指一种数据结构,传统的数据在物理结构上就是把数据分别保存在不同的集中式数据服务器上,数据呈现是扁平型类,好处是数据统一管理方便存取,坏处是数据量增大时,就得增大对应的服务器设施。而区块链是把特定的数据一批批的打包加密好之后进行保存,并且包和包之间存在着不可断开的强联系,这种链式的数据结构称为区块链,而每次打包的数据体称为区块。这种链式结构的好处是每个包体相对独立又强烈依赖,每个包体的容量有限方便传输,但同时也带来了更多的难点,而区块链的其他模块即是针对这些问题而采取的技术手段。

其中“区块“模块,需要负责每个区块(也就是数据包)的打包、认证、加密、解析等等操作。

“交易/通讯“模块,主要负责用户之间的数据交互,只所以也用了“通讯“的命名,是因为“交易“是金融型区块链常用的命名,但其实对于程序来说它只是一种通讯数据类型,既然我们的是使用区块链应用于其他行业,所以用通讯交换更加贴切。

“交易/通讯池“模块,区块的打包只能去打包有效、正确合法的数据,所以用户之间的通讯信息不能直接就打包,需要先缓存在讯通池中,等有用户完成了特定事件,进行打包的时候再统一从池子里面获取通讯数据,进行验证后再打包。

“质押“模块,质押模块是POS权益证明类型的概念,属于区块链共识机制之一。无论是POW工作量证明还是POS权益,本质都是为了解决一个问题,谁有权益去打包,如果大家都可以无时间无条件限制的打包,那就产生了先用谁的谁的对的问题。而共识机制即通过算法规则,让这种权利自动化的方式。在本项目代码中,你可以同时看到POW相关算法代码,也可以看到POW相关代码,且由于POW太消耗设备,所以此项目采用POS机制,当前我们知道了它的作用,你用其他机制甚至自研机制也可以,但是切记一个好的机制是赏罚分明且平衡,并且最主要是无法被恶意破坏。还有其他机制可以自行搜索。

“Peer节点“模块,区块链中重要的三个重要角色:用户、矿工、节点。这三个角色中由于权限、责任和保存数据的不同进行了划分。其中节点即是区块链P2P网络中的Peer,代表着网络中的一个节点,它有根据保存数据的多少分为全节点和SPV节点,全节点很好理解就是保存所以区块的数据,而SPV节点只是保存区块的索引信息,就好像是全节点保存了所有的书,而SPV只是保存了书的名字和位置,但没有书里面的内容。而矿工也是节点的一种类似,区块链会有一些社区自建的节点,而社区的扩展需要发展更多的节点,所有有了矿工,他们通过平台的共识机制通过付出一些成本,然后获取保存数据称为节点的存在,然后获取到对应的报酬。并且节点还其中中继器的左右,中继器就是一个中间人,在P2P网络中我要去和B进行通信,需要一个公网的中继服务帮我联系到对应的B,从而进行通信。最后就是用户了,用户很简单,即是区块链应用层的使用者。

再次学习项目中,我们将不区分用户、矿工、和节点,他们统一都是以节点存在,有着节点的责任和义务。

“Peer储仓“模块,储仓是此项目的概念,此项目希望区块链不只是保存数字类型的数据,同时可以保存字符、图片、模型、动画等等这些游戏中使用的数据。那传统的金融区块链的金额保存和计算方式将无法使用,金融区块链计算一个人的资金额度数据,需要通过获取所有区块内交易的数据进行统计,实质上就是通过区块中所有的交易数额的加减的方式进行计算。而加减只适合数字,像字符、图片、模型等等属于唯一性质的虚拟物品文件,就无法通过区块的数字加减得出,所以有了储仓的概念。它的目的是保存非数字类型无法加减计算的数据,并且进行对物品文件数据进行加密打包和映射的工作。当然NFT等数字藏品也使用了类似的方式,只是它们不这么命名,而且区块链的储仓 最好是保存物品数据的唯一映射索引,而物品文件数据保存在传统数据服务中即可,不然庞大的数据量会让区块链臃肿无法使用。区块链它并不能代替什么什么结构,它只是一种新的细分产业的技术方案,就像C#、Python、C++都是一种编程方案,它们各有千秋,各有自己擅长的领域,所以不要陷入技术和舆论的误区,错误认为区块链是一种什么巅峰性的方案。

“钱包“模块,所有玩过区块链的用户,应该都知道钱包,其实就是钱包就是保存你进去区块链的一个凭证,更简单的说就是保存了你的银行卡号,它可以让你方便的访问区块链中属于你的数据。这里的钱包也相对比较简单,项目本意是想通过“BIP44规范“来实现钱包功能的,但是基于时间和需求量,暂时还是简单的钱包功能。而且这里的钱包生成的助记词采用的是“中文“🇨🇳。 (那必须得是中文!!)

业务层

业务层需要结合下文的文件结构来阅读。

上面讲述了区块链中几个关键的模块,而在Base文件夹下的代码即是对这几个模块的封装。具体功能需要查看代码,代码大部分都是中文注释。

数据层

数据层也需要结合下文的文件结构来阅读。

数据层和业务层承上启下,代码均在“DB文件夹“中,是对应模块进行数据库操作的对应代码。
由于区块链概念中没有中央服务器,那更没有中央数据库,这也是为什么区块链采用的P2P网络形式,所有的数据都是保存在各个节点的本地。而此项目的所有终端都是节点,所以都需要本地数据库,而这里采用了LiteDB数据库,它是一种简洁快捷本地数据库方案,更多关于此数据库的信息可以阅览对应官网。

通讯层

网络通讯协议采用的是UDP,不用担心它会导致数据丢失,基于Unity插件社区的强大,使用的SuperNet网络插件,它提供了可靠的UDP链接,再保留了部分传输速度和传输便捷性的同时也保存了数据的稳定性。

根据GRPC通讯以及Unity Unet通讯的架构,这里对通讯层的代码进行了二次封装,使其更好的区分请求和响应的业务,程序会自动处理数据的分发和解析,开发者只需要完善业务逻辑处理即可,当然想要完善特殊业务,还是需要进一步修改的。

其中Services文件夹保存的对应的数据字段定义,这些定义的类,即用于数据库的保存,同时也用于网络传输,同时这里面也需要定于对于业务的处理机制,机制包括请求和响应的数据。

ClientImpl文件夹保存了对应请求接口的实现。 [弃用,由于请求接口相对业务逻辑简单,直接可在Services文件夹定义脚本的时候根据固定方式实现]。

ServiceImpl文件夹保存了对应的业务和数据的响应与处理脚步,简单说就是实现了Services文件夹中对应类的抽象响应方法。

事务层

事务管理层主要就是使用了简单的Facade模式来实现区块链的高层接口,方便后续开发方便对接。除了区块链对应的几个核心模块的功能,还有本身数据库事务管理、矿工挖矿的事务管理和应用层面用户直观看到的到的钱包相关管理。

应用层

更多区块链信息可以直接跳转到区块链概念简述,了解区块链基本概念。

如果你对区块链有了一定的了解了,就会知道它其实就是一种采用P2P网络的新式网络服务架构,不依赖于中央服务器和数据库,可以更好的把数据的权利分发给用户,也可以减少企业的服务器运营和维护成本。但最大的劣势很明显,不适合保存体积过大的数据。

但不管它怎么改变,他其实还是一种网络服务。对于我们用户,数据保存在哪里?怎么保存?怎么链接网络?我们是无法直接感受到变化的。我们注重还是产品本身的价值,比如它是能帮我节省流量?还是它能让我的账户更安全?还是它能让我的权益得道更好的保证?还是它能给我生活提升什么便利?亦或是它能让我通过数据挣钱?而恰恰我们在意的点在目前的区块链技术中无法体验。 区块链的金融属性比较特殊,这里不加评论,但简单来说它不具有传统的用户价值,至少目前是的。除非哪天赌博属于有价值的致富方式。

这一无法给用户带来直观价值的要素决定了区块链的局限性,它目前以信任链的作用更多用于一些政府或者大厂的基础设施的改革和实验,但也是局部范围的。

当然这一呈否定的认知,只是让我们站在落地的角度认清区块链就是一种网络服务,而不去过度神化,这样才能保持冷静的思考它的可用性。并且我们还没有说 智能合约这一利器,并不能彻底否定它的存在。

这里也给出了一些应用方面的可能性:

积分权益: 区块链的共识机制和不可破坏的社区规则,恰恰可以用于社区服务,目前行业内社区服务的权益激励确实还存在很大的空缺。如果针对社区权益使用区块链进行Saas化,方便其他三方平台进行参与,为社区用户提供更多的生态转化、更多样的价值体现,将会有联合社区一样的形态存在,集合起来服务用户。当然这也需要区块链具备
智能合约的功能。当然这里只是提供假设,具体实施肯定有更多问题。但假设你开发的产品进行宣传的时候告知用户,你继承了XXX社区链可以共享权益,应该会有很多用户因为之前的存量权益特意去你的产品里面进行体现的。提现有金融性质,体现是通过某种性质或现象通过某一事物具体表达表现出来,可能会更宽泛的形容这一兑换的行为

正负奖励训练数据: AI实在是太火了,而且由于AI的特性,未来数据的价值会越显重要。假设我们想要开发一套AI无人驾驶飞行算法,传统的方式即是通过大量的现实实验和少量的虚拟实验进行训练。而如果使用游戏化的方式,通过让玩家在游戏中操作无人机进行娱乐,并且在这个过程中收集操作数据,并且给予训练服务进行训练,可能会极大的节省AI训练的成本也就是数据来源的成本。当然这只是不专业的假设,具体实施起来,会发现实际的AI无法驾驶和虚拟的驾驶环境相差过大,模型的泛化能会很低很低,并且还涉及到摄像头的视觉识别,导致虚拟化可能性降低和成本变高。但目前仅是假设,具体实施可行性需要交给未来。

[最新咨询显示英伟达NVLink互连技术已经实现了144 TB内存的共享显卡的调用,对于未来AI领域的发展有着重要的推动作用]

用户行为数据: 也是一种能为用户带来直接利益的方式,基于未来数据的价值,如果企业需要进行新市场的研究,或者新运营手段,用户数据能为相关策略提供直接价值。而目前行业中并没有这种用户通过出售个人数据来进行盈利的产品,一是你的数据其实不是你的数据,它们都是保存是对应企业的中央服务器,二是他们会把数据归于他们所有,其实理论上不归你所有,因为你无法利用到它,其次就算你的数据可以交易,但目前也没有网络架构无法为此提供保障。而区块链可以很好的提供此服务,对于任意方,大家数据不可篡改,即保护了数据的完整和真实性,也确保用户的权益。如果有天,你可以通过下载一个APP,然后APP有一个收集你健康数据的征集任务,任务标明了收集的数据明细以及最终收益,你是否会卖自己的数据呢?

个体价值数据: 这个和积分权益差不多,就是把个体用户的数据价值体验出来。也是这个游戏项目想要实现的目标,设想你购买的王者荣耀的皮肤、装备、特效、模型以及你的游戏好友数据真是意义上是属于你的,你还可以把它用于吃鸡或者其他游戏 ,是不是感觉很酷。


文件结构

在这里插入图片描述

文件/文件夹路径说明
ArouseBlockchain/…/Assets/ArouseBlockchain/…区块链核心代码,核心代码尽量和Unity代码分离开来,很小的工作量就可以彻底独立出来,方便你用于其他非Unity的C#项目
Base/…/ArouseBlockchain/Scripts/…区块链核心代码
Common/同上区块链公共代码
DB/同上数据保存业务处理
P2PNet/同上P2P网络通信类
Solve/同上Facade模式的高层接口类,用于统筹和对公业务
ArouseBlockchain.unity…/ArouseBlockchain/Scenes/…客户端场景
Server.unity同上服务端运行场景,如何使用?

生成器


区块链简述

区块链的基础知识简述

  • 背景

未来趋势

区块链未来趋势的展望

  • 背景

想要使用生成器的话,请看 generator-standard-readme。
有一个全局的可执行文件来运行包里的生成器,生成器的别名叫 standard-readme

徽章

如果你的项目遵循 Standard-Readme 而且项目位于 Github 上,非常希望你能把这个徽章加入你的项目。它可以更多的人访问到这个项目,而且采纳 Stand-README。 加入徽章并非强制的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wiwejzP6-1686712315271)(null)]

为了加入徽章到 Markdown 文本里面,可以使用以下代码:

[![standard-readme compliant](https://img.shields.io/badge/readme%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme)

示例

想了解我们建议的规范是如何被应用的,请参考 example-readmes。

相关仓库

  • Art of Readme — 💌 写高质量 README 的艺术。
  • open-source-template — 一个鼓励参与开源的 README 模板。

维护者

@RichardLitt。

如何贡献

非常欢迎你的加入!提一个 Issue 或者提交一个 Pull Request。

标准 Readme 遵循 Contributor Covenant 行为规范。

贡献者

感谢以下参与项目的人:

使用许可

MIT © Richard Littauer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/646274.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

武职301-day01

文章目录 实现永和小票页面效果图问题分析开发分析开发步骤order.html页面 问题:HTML代码和CSS样式代码混杂在一起网页中使用样式style修饰常用2种方式自定义样式表base.css 作业 实现永和小票页面 效果图 问题分析 把一个大的开发任务,先进行任务分析…

web前端-ES6语法学习

Vue3.0的学习 ES6的模块化语法ES6 模块化规范的概述ES6 模块化的体验默认导出与默认导入按需导出 和 按需导入直接导入并执行模块中的代码 Promiseasync/awaitEventLoop宏任务和微任务 ES6的模块化语法 ES6中文教程网:https://www.w3cschool.cn/escript6/ ES6 模块…

Makerbase SimpleFOC ESP32 例程8 电机旋钮控制测试

Makerbase SimpleFOC ESP32 例程8 电机旋钮控制测试 第一部分 硬件介绍 1.1 硬件清单 序号品名数量1ESP32 FOC V1.0 主板12YT2804电机2312V电源适配器14USB 线156pin杜邦线2 注意:YT2804是改装的云台无刷电机,带有AS5600编码器,可实现360连续运转。 …

基于java springboot+mybatis OA办公自动化系统设计和实现

基于java springbootmybatis OA办公自动化系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方…

利用fiddler测试APP及高级应用

我们经常需要用到Fiddler做代理服务器对Web、APP应用进行抓包,以便我们对接口功能进行测试调试,定位问题等。这篇将讲述怎么通过Fiddler对APP进行抓包,以及简单介绍一些高级应用场景。 首先,附上Fiddler使用的环境配置清单&#…

社会心理学(2) 社会心理学的研究方法

下面我们来说 社会心理学的研究方法 那么 首先 要说方法论 有些心理学者 他不分方法和方法论 但是 我们还是将他分开 一般的理解 方法论和方法 具体做法不同 方法论 我们定义为 研究心理学的最高或最原则 指导思想 有了这个指导思想 我们就可以更好的决定 对研究的问题 用…

扫码点餐小程序是什么?为什么现在餐厅都在用扫码点餐?

开餐厅的你有没有遇见一种有这样的情况 爆单的时间点就那么一小段,但是人一多呢,出品和点单很容易混乱,从而流失很多客户。 针对与这种情况,便有了扫码点餐。 小程序是一种为餐饮商家提供的解决方案,它可以帮助商家…

k8s集群删除master节点

1.在另外的master节点执行以下命令 kubectl get node #查看需要删除的节点名称 kubectl delete node k8s-master01 #删除名为k8s-master01的节点 2.在k8s-master01清空集群配置信息 kubeadm reset --cri-socketunix:///var/run/cri-dockerd.sock #因为我使用的是1.…

Redis - 数据结构类型及使用场景详解

一. 简介 Redis 是由 Salvatore Sanfilippo 编写的一个key-value存储系统,是跨平台的非关系型数据库。Redis是一个开源的,使用C语言编写的,遵守BSD协议,支持网络,可基于内存,分布式,可选持久性的…

基于Java健身房管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

搭建Jmeter分布式压测与监控,轻松实践

对于运维工程师来说,需要对自己维护的服务器性能瓶颈了如指掌,比如我当前的架构每秒并发是多少,我服务器最大能接受的并发是多少,是什么导致我的性能有问题;如果当前架构快达到性能瓶颈了,是横向扩容性能提…

很详细的Django开发入门详解(图文并茂)

1.Django概述 Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。 Django 框架的核心组件有: 用于创建模型的对象关系映射;为最终用户设计较好的管理界面;…

一些可以参考的文档集合12

之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合4_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合5_…

C语言设计实现十六进制与十进制数之间的相互转换

一、十六进制数转为十进制数 1.设计一个C语言代码实现十六进制数例如0xFEFF转为十进制 以下是一个C语言代码示例&#xff0c;用于将十六进制数转换为十进制&#xff1a; #include <stdio.h> #include <stdlib.h>int main() {char hexNum[10]; // 存储输入的十六…

操作系统:详解物理内存与虚拟内存,用户空间与内核态空间

目录 0、基础知识&#xff1a;磁盘与物理内存 1、 通过虚拟地址访问物理内存 1.1 虚拟内存&#xff1a; 1.2 虚拟内存的优势&#xff1a; 1.3 举例说明&#xff1a; 2、用户空间与内核态空间 2.1 为什么进程的寻址空间要划分为用户空间与内核态空间两部分&#xff1f;&am…

装饰者模式(十一)

请相信自己&#xff0c;请再次相信自己&#xff0c;请一定要相信自己 上一章简单介绍了桥接模式(十), 如果没有看过, 请观看上一章 一. 装饰者模式 引用 菜鸟教程里面的装饰者模式介绍: https://www.runoob.com/design-pattern/decorator-pattern.html 装饰器模式&#xff0…

什么是开源工作流平台?

在办公职场中&#xff0c;有没有一款软件是实现提质增效的平台&#xff1f;如果让办公实现流程化管理&#xff0c;引用什么平台产品较为合适&#xff1f;低代码开发平台是近些年较为流行的办公软件平台&#xff0c;可以有效管理数据资源&#xff0c;制作表格可视化操作更简便&a…

Qt Quick系列(6)—多风格UI页面

&#x1f680;作者&#xff1a;CAccept &#x1f382;专栏&#xff1a;Qt Quick 文章目录 前言桌面版本的UI界面代码示例相关知识点 移动版风格的UI界面代码示例 嵌套页面代码示例相关知识点 并排页面代码示例相关知识点 前言 Qt Quick控件用于创建由标准化组件&#xff08;…

OpenCV迭代去畸变undistortPoints 与vins的迭代不同 vins前端与imu预积分

OpenCV去畸变undistortPoints原理解析 不动点迭代法—单变量非线性方程近似根matlab求解 淦VINS-MONO源码 03–openCV与VINS中去畸变方法的不同 这里用的方法和openCV不同&#xff0c;假设现在求A点的去畸变坐标&#xff0c;那么我们将A的坐标直接代入畸变模型中&#xff0c;求…

Pytest教程__用例执行顺序(5)

在unittest中&#xff0c;测试用例的执行顺序与测试用例的名称有关&#xff0c;按照名称的ascii码排序的&#xff0c;并不是按照用例的编写顺序执行的。 pytest默认是按用例的编写顺序执行的 我们可以通过第三方包 pytest-ordering 来自定义我们用例的执行顺序。 方法是使用装…