基于联盟链虚拟财产跨平台交易架构

背景

这个项目主要是区块链的练手项目,底层中实现了基于base58编码的地址生成,交易及区块的序列化和反序列化,联盟链的共识协议,数据的持久化,文件的网络传输方法等等。后端使用的是python 3.9, Django 3.2.13,前端使用的是Vue3。其他框架使用较少,本项目主要以造轮子为主。

为什么要做这个项目?最早接触区块链是因为阅读了O’Reilly 的《Programming Bitcoin》。这本书讲了如何使用python从底层实现比特币的细节部分。后来我开始思考为什么区块链需要挖矿,仔细分析发现矿工其实做了两件事情,一是通过寻找一个哈希值证明它获得了区块奖励,二是打包用户的交易并保存在区块中。因为公有链是完全公开的,所以在不可信网络中达成协议的最佳方法就是算力竞争,即挖矿。如果使用低算力消耗的共识算法,那么部署在公网的区块链系统非常容易受到攻击。于是我暂时放弃了公网部署的想法,并且利用区块链的特性,尝试做一个联盟链系统。

为什么需要联盟链?联盟链是由可信度高的几个节点组成,一般不对外开放。联盟链可以做很多定制化特性,例如头部公司只需分配一块服务器保证其正常运行即可,其余时间并不需要操作和管理。这类似于一个契约,只提供服务器做部署,不对内容做更改,所有数据流通过程序自动运转。另外一个理想的方案是政府相关部门也能加入节点监管,提高联盟链的可信度。

这里存在另一个疑问,头部公司和政府部门加入联盟链的动机是什么?我认为有两个好处,一个是通过提供联盟链服务收取交易的手续费,另一个是提升自身品牌信用。在商业活动中,我认为信用的价值比其研发产品的使用价值更大。对于政府部门来说,提供服务同时能够参与监管和审查,我想这也个也满足了需求。

这个项目是短期个人创意想法,是否适用于现实场景还有待研究。

项目展示

这个系统的逻辑是启动两个进程,一个是django作为后端,另一个是自己编写了Zerg区块链程序作为链端核心。Zerg对外暴露两个端口,其中一个用于不同节点之间通信,例如广播交易,验证区块,共识协议验证等等,另一个端口和本地后端进行通信。使用的是原始TCP短连接的方式,原因是当时技术储备不足,实际应该使用gRPC和http方式更合理。

工具类

首先我做了一个区块链工具,这个工具可以用来管理节点的公私钥,创建地址,创建交易序列。底层的算法原理和输入输出格式都与比特币一致,我在交易序列化的细节上做了些简易的处理,主要是通过数据结构转成json再转化为字节的形式。

下面是生成公私钥的程序,因为使用联盟链,节点广播必须使用RSA加密和验证通信内容。点击生成公私钥后会生成两个文件,RSA_PIV,RSA_PUB。把PUB发送给其他节点的Key目录下就能启动共识算法中的验证步骤。

图一

下面是生成地址的程序,类似与用户的区块链钱包。助记词只是影响随机数种子,并不能直接计算得到地址和私钥。完整的输入是加盐哈希,时间戳等信息组合得到的,并且这是离线计算,安全性完全可以保证。

图二

下面是生成交易的程序,类似与用户的区块链钱包。这将会把交易信息序列化为一个长串数字,节点可以解析这串数字用于验证交易的合法性。用户的虚拟财产通过节点验证后会产生一个财产ID。如果一个区块链地址拥有这个财产ID,那么就会保存在数据库和区块链文件中。

图三

Web

下面两张图的界面显示的是用于节点公私钥管理和区块查询。每个虚拟财产都有一个认证节点用于溯源,认证的节点需要对虚拟财产的真实性和有效性负责。第二张图是区块链查询,显示的是已经由至少一个节点确认的交易。由于只是在测试,定义3个交易产出一个区块,当然区块的创建也可以设置时间定时产出。

图4
图5

这张图展示的是作为用户上传虚拟财产的功能,上传后将会把文件保存在节点的Temporary目录。

图6

下面是管理员界面,管理员可以查看文件的合法性,如果点击接受,那么文件就会永久保存并且交易写入到区块。如果拒绝,那么临时文件区就会删除这个文件,同时给用户返回被拒绝的信息。第二张图界面供查看已经审核通过的虚拟财产。

图7
图8

下面的界面为用户交易的广播通道,这段交易十六进制编码存储了发送者地址,接受者地址,虚拟财产ID,发送者数字签名。序列号内容通过“钱包”生成而来。为什么要设计成这样,主要是因为参考了比特币最原始的广播交易网站。基于椭圆曲线密码学原理,离线签署数字签名,证明拥有者的数字财产。服务器节点接收这段代码后,会解码成完整的原始交易对象,首先验证这个地址是否拥有该数字资产,然后验证数字签名是否为此地址,所有的验证通过后则广播给其他节点,并存储在本地。

图9
图10

持久化

图10

关于系统的持久化主要有两部分,一个是数据库上的存储,一个是区块文件的存储。为了确保后加入的节点能够快速同步到主链上,所以可以通过解析区块文件来填充数据库。在项目中设置了一个主节点,每隔10秒会向所有节点发送一致性检测请求。请求头包含区块文件数量,时间戳,请求体包含区块文件的哈希值。如果节点缺失部分区块文件,主节点会直接发送原始区块文件。目前只实现了基本的传输和检测功能,可优化的地方有很多,例如使用类似于默克尔树的结构,使用2的n次方数量检测合并的区块文件。减小主节点的网络I/O,可以使用对等节点传输文件。

总结

本人独立完成项目的所有内容,由于开发时间较短,部分功能与设计并不完善。项目的初衷是实现半匿名形式的交易平台,证明财产属权,例如游戏账号交易,各种具备价值的虚拟产品交易。如果交易者发生纠纷,那么平台承担证明者的职能,提供完整的法律证据支持,以解决互联网交易中的信任危机。不足之处在于开发时技术储备不足,没能提供一个类EVM来实现智能合约。至于为什么不做成一个公有链,有两个原因。第一,无挖矿(Pow)的公有链太脆弱极易遭受网络攻击,系统未必稳定运行。第二,没有找到矿工参与的激励机制,因为本质上系统不存在代币,只是现实中虚拟财产的映射。

0%