版权声明:Copyright Reserved © 2018-2020 https://blog.csdn.net/lyq13573221675/article/details/81501978
北京时间8月10日,墨客区块链底层节点更新到Nuwa v1.0.2,墨客子链(MicroChain)功能正式上线。
用户在下载和安装好SCS软件(或者购买SCS硬件盒子)后,可以注册到子链节点矿池(SCS pool)中参与子链挖矿,并获得挖矿收益。
用户也可以在墨客区块链创建并拥有自己的子链,运行自己的区块链业务。
本文不含任何代码,让每个人都能读懂墨客子链。
1.墨客子链的初衷
简单说,就是提供去中心化、安全且可扩展的区块链底层技术。
1.1 对DAPP友好
当前区块链底层技术对DAPP不够友好,主要表现在:
- 对于区块链的小白来说,DAPP的用户的学习曲线非常陡峭;
- 维护DAPP运行的成本不公平的偏向于DAPP的创建者。DAPP的创建者不需要为系统的维护支付任何费用,而是把消耗系统资源的成本转嫁到了DAPP的用户身上;
- 不利于构建DAPP的生态。
基于墨客区块链的DAPP可以做到跟传统的DAPP一样,用户从APP store下载了之后就可以立刻免费或者以很低的成本使用APP。而不需要关心底层的区块链是什么样的,也根本不需要关心如何获得和支付gas费。
1.2 共享
目前主流区块链的分配方式是通过挖矿。其理想是每个拥有计算机和网络的人都可以参与挖矿,并获得虚拟货币。这样,使得资产的分配过程去中心化,让更多的人可以获得并使用它,而不是控制在初始的少数人手里。但现实是挖矿已经变得非常昂贵,只有支付得起巨额的矿机和昂贵电力费用的人才能在这个分配过程中受益。
墨客区块链通过子链技术,使得更多的人、用更少的成本能够参与进来,从而实现有效的、更加去中心化的二次分配过程。
1.3 增加TPS
通过子链技术成百倍地增加TPS,使区块链应用真正能够落地。
2.墨客子链的实现技术
2.1 分层架构
墨客区块链采用分层架构。底层(节点称为VNODE)采用POW的共识协议,解决全局一致性的问题。上层(节点称为SCS)采用分片技术,通过POS、PBFT或者自定义共识协议的方式实现子链功能。同时,子链采用定期刷新的机制将自己状态的hash写入底层区块链,以实现一致性。
通过分层,底层主要处理全局交易和合约,以及对子链的调用,用户的业务逻辑在上层的子链中执行,提高系统TPS至100倍。
2.2 分片技术

墨客区块链是通过分片技术实现子链的。分片是把网络中大量的SCS节点分成较小的、能灵活组合和更容易管理的小组。
墨客区块链分片采用合约驱动的模式。一个合约对应于一个系统分片,也就是一条子链。
采用面向节点的分片,可以使得处理能力与节点数量线性相关。SCS节点越多,分片就可以越多,子链也就可以越多,当然TPS就越高。
2.3 工作机制

墨客区块链子链工作机制灵活高效,其特点包括:
- 每个分片有自己的存储,就是子链;
- 可以有不同于底层的共识方式,比如pos,pbft、或者自定义共识方式;
- 区块生成时间可以与底层不一致,比如可以采用快速的区块周期来进一步提高处理速度;
- 子链周期性的向底层flush结果,从而获得阶段性的全局一致性。
举例来说,用户可以根据自身DAPP的需要,通过参数设置实现:
- 需求SCS节点数21个,pbft共识机制,15秒一个区块;
- 需求SCS节点数50个,pos共识机制,30秒一个区块;
- 需求SCS节点数60个,自定义共识机制,60秒一个区块。
2.4 挖矿机制
整个系统的处理速度上去之后,会对VNODE的要求更高。体现在两个方面,一个是网络的带宽,另一个是存储的容量。当然还有每个节点的GPU运算能力。对于普通用户而言,因为有SCS可以参与挖矿,并不一定需要部署一个VNODE,只要有信任的VNODE可以连就可以。这样墨客系统就形成两个层次的挖矿节点:
- 大量运算能力强大、高网络带宽、大存储的VNODE,执行POW,并提供SCS接入服务,维持整个网络必须的挖矿能力,这个数量在一万到十万。
- 海量cpu–based的SCS用于处理合约的执行并获得收益。针对子链的共识多样性,这样的SCS节点甚至可以是手机等移动设备。在目前的架构下,可以有几十万甚至几百万的SCS参与,而不会影响系统的性能。
3.墨客系统中的角色

USER:使用子链DAPP的用户
DAPP SERVER:DAPP项目方或开发者
MINER VNODE:主网挖矿节点
PROXY VNODE:主网代理节点,用于提高子链节点的稳定性
SCS:子链矿工节点,参与子链业务逻辑
MONITOR SCS: 只用于查询子链业务状态,不参与共识
智能合约: 此处仅解释与子链相关的智能合约:
- 子链矿池智能合约subchainprotocol:用于子链SCS节点矿工加入矿工池;
- 代理智能合约vnodeprotocol:用于主网VNODE提供代理功能,加入代理池;
- 子链控制合约subchainbase:用于子链控制逻辑,子链生成前和生成后的一系列控制逻辑;
- 子链DAPP智能合约dappcontract:用于部署子链业务逻辑的合约;
DAPP用户部署子链时,只需要关注子链控制合约和子链DAPP智能合约。
4.如何参与子链挖矿
用户参与到墨客子链的挖矿中来,有两种方式:
4.1 作为SCS矿工参与子链的节点建设
要成为SCS矿工有两种途径:
- 购买SCS硬件盒子,联网运行;该硬件盒子由第三方商家提供,用户可以自行购买;
- 下载SCS节点文件,联网运行;点击下载。
SCS节点运行时需要自行操作的步骤(以SCS软件节点为例)包括:
- 配置矿工收益账号Beneficiary,用于接收挖矿收益;
- 注册到SCS矿池,用户可以自己建一个矿池,不过此处建议加入官方提供的矿池地址,以确保安全性;
- SCS注册时需要提供押金(MC),此处押金必须大于矿池合约的设置值;提交押金越多,能参与的子链越多;
- 配置SCS需要连接的VNODE,这样SCS之间才能进行通讯;可以是自己的节点,也可以连接到其他代理节点。
SCS矿工的前期工作完成后,如果被选中参与子链的运行,将会在子链刷新之后,在Beneficiary中看到收益。
注意:SCS运行后不可频繁掉线,否则可能会被视为作假,被剔除出子链并扣除押金。
4.2 作为PROXY VNODE参与子链的信息传递
主链节点注册到VNODE矿池,变成PROXY VNODE,通过提供子链调用合约服务和子链历史数据中转服务,获取收益。
PROXY VNODE需要在vnodeconfig.json的VnodeBeneficialAddress里设置收益账号。
- 提供子链调用合约服务时,交易中的via字段,需要设置和VnodeBeneficialAddress相同,否则该节点将不会工作;
- 提供子链历史数据中转服务时,PROXY VNODE是被随机选中为子链进行服务的。
5.部署子链的流程

5.1 公共矿池合约部署
- 部署Vnode协议合约:也就是Vnode Proxy矿池,允许Vnode来注册,并为子链提供服务获取收益;
- 部署子链协议合约:也就是SCS矿池,允许SCS来注册,被选中为子链提供服务,并获取收益。
这两个合约,官方会部署,并提供相应的服务;第三方也可以部署,公开信息后,为dapp方提供服务。
5.2 DAPP业务逻辑
1.部署子链合约:子链控制合约是DAPP用户使用子链的基本合约,其提供子链运行前和运行中的一些必要接口。
通常来说,子链控制合约需要设置:
- 一个好用的Vnode Proxy矿池合约地址;
- 一个好用的SCS矿池合约地址;
- 子链运行后需要的SCS的最小数量和最大数量;
- 子链刷新周期(以母链block生成数量为准),小于100的值,合约会自动置为100。
2.选择SCS:子链控制合约部署成功后,会开放注册,符合条件的SCS都可以来注册,此时可以查看注册情况;
3.创建子链:如果注册的SCS数量达到要求,关闭注册后,创建子链完成并开始出块;如果没有足够的SCS来注册,需要重新开始该进程;
4.部署子链业务合约:通过directcall方式进行子链业务合约的部署与调用,directcall以向VNODE PROXY节点发送交易的方式完成自己的任务。
通常来说,子链业务合约需要设置:
- 子链控制合约的地址;
- shardingflag标志位:必须填写1,(0表示主链交易,1表示子链交易);
- 发送交易VNODE节点config中的地址;仅配置了该地址的VNODE PROXY才会处理子链业务合约的部署与调用。
6.子链SCS的选择
6.1 子链的SCS的节点选择通过三个步骤实现:
- 子链设定一个需要选择的SCS节点数范围[min,max]。然后调用子链协议合约的getSelectionTarget(),根据当前的注册的SCS总数,得到一个selection target;
- Vnode比较子链地址和与自己相连的SCS地址的距离,如果小于selection target,则通知SCS;
- SCS得到register的通知,如果符合条件,则调用子链的RegisterAsSCS来确定自己参与到该子链。
6.2 通过这样的选择方法,可以实现:
- 选择的过程是随机的,因为SCS的地址和子链地址都是随机生成的;
- SCS的选择根据当前的SCS节点总数自动调整,因为SCS与子链地址之间的距离符合正态分布;
- SCS的显示确认保证SCS当前是活跃的。
6.3 两个地址的距离(hash_dist)由RangeIndex[]定义的位数 index_range 来确定

该实例中,index_range为第2和第3位。
7.子链的刷新(flush)
7.1 子链刷新的参数设置
在子链控制合约subchainbase.sol中设置子链刷新参数:
- 刷新周期Round数值:定义子链经过多少区块后刷新。假如子链有100个节点,每个节点按POS共识机制依次产生block,定义Round数为5,则每过500block 刷新一次;
- 当前刷新id 索引:指定下次刷新的id 在SCSList中 的索引值;
- 刷新过期数值expiration:指定的id在block [0, 2*expiration]必须完成刷新,否则由下一个id重新发起刷新;
- 刷新作假惩罚:如果节点在propose,dispute,或者vote阶段作假,将从预先缴纳的押金中扣除相应的惩罚数额,并被踢出SCSList。
7.2 子链刷新的流程
Proposal的格式如下:

- 刷新周期到的时候,SCS节点调用子链合约的createProposal,发起一个刷新请求交易flushTX;
- V-node接收到flushTX后,处理相应的逻辑,并将消息推送到SCSList中的scs node,告知有新的proposal;
- 如果SCS node发现没有问题,它们不需要反应;
- 如果SCS node发现这个proposal 有问题,它可以发起一个新的proposal,并通过TX调用disputeProposal,之后触发V-node将消息推送到相应的scs node。此时所有的SCS必须响应,一个SCS只能对其中的一个进行投票(由合约保证);
- 最初发起proposal和发起dispute的SCS节点设置timer,在指导的时间内,获得投票的结果。如果得票超过50%,那么这个节点就发起一个TX来调用子链合约的Approval function。
- 合法的proposal被接受,并被记录到区块链中,错误的proposal和对错误的proposal进行投票的人将被扣掉相应的保证金。
7.3 奖励与惩罚
参与者的付出:
- 作为SCS矿工,需要在注册时付出一定数量的押金(由矿工池决定),来进入矿工池等待参与子链运行;
- SCS启动后,scsid需要存入1个moac作为调用费用;
- 作为DAPP方,在部署子链控制合约的时候,需要给合约账号打入一定数量的运行费用,用于矿工奖励;
- 作为proxy Vnode,需要在注册的时候交押金。
刷新的时候:
- 一旦被选中参与子链运行,SCS矿工将会在子链刷新的时候获得回报,参与的子链越多,获得的回报越多;
- 如果SCS节点的网络不稳定,或者尝试捣乱,该SCS将会被标记为坏节点,继而被踢出子链的运行,并扣除押金;
- proxy Vnode获得提供子链合约调用的节点收益。