Skip to content

Miner Management

lyszhang edited this page Mar 29, 2019 · 3 revisions

矿工管理机制

挖矿机器要求

目前Usechain的独特挖矿机制对机器本身没有太大的要求,普通的家用电脑即可作为Usechain链上的矿工节点。在未来,我们会进一步优化代码,以适配嵌入式设备和移动端设备。 由于高tps下的交易校验、合约执行和频繁的p2p等,会对机器的内存有一定的要求。在一般的linux机器上,长时间维持10个左右P2P链接,大约会占用1.5G~2G的内存空间,所以建议使用4G以上内存、10Mbps的机器作为矿工节点,以保证良好的区块同步效率。

奖励机制

目前平均下来5~7秒出一个块,每年大概出14400*365 = 5,256,000个块,每出一个块15个use,每年根据区块奖励增发78840000USE;未来会根据社区投票和委员会意见,来调整增发比例

矿工注册

由于伪随机的挑选矿工进行出块,所以要保证被挑选出的矿工极大可能保持在线,否则网络出块效率没有办法进行保证。同时为了提高恶意矿工的攻击成本,需要对矿工进行一定的约束和门槛限定。

Usechain系统中矿工挖矿地址必须是主地址(一个真实身份只会拥有一个主地址),且必须经过缴纳押金,在矿工列表合约中进行注册才可以进行出块。

进行矿工注册时,用户需要缴纳一定数量的USE代币作为抵押金,数量暂为10000use,目前Alpha版本为了用户参与体验,调整为50USE,具体金额会根据整个网络中矿工人数和区块收益进行及时的调整,且挖矿有一定时间周期,时间周期为5256000块(大约360天),到期后矿工需要重新注册,且之前缴纳的押金不返还,作为下一轮挖矿周期的奖励。在每一轮的挖矿周期内,矿工可以中途选择退出,返还部分押金,返还押金计算公式为:

其中,为从注册成功至退出经历的区块数量,为初始押金,为应返还的押金金额,σ为固定金额,暂定为。σ的存在是为了保证矿工不至于频繁的进行注册和注销操作。

之所以引入矿工注册缴纳押金和押金流损机制,一方面是为了及时知晓网络中挖矿人数(上限),另一方面是为了从经济上要求矿工维护好节点的正常运行,保证矿工的在线率,同时提高作恶者的做恶成本。同时整个押金流损机制会根据矿工人数和矿工收益进行动态调整,保证矿工足够收益,只要矿工正常在线,就可以获得高于押金的收益;反之,若矿工长时间不在线,则无法获得区块奖励,同时还面临损失押金的风险。

矿工管理合约

采用智能合约来进行矿工注册的管理,合约的基本功能包括了矿工注册、押金管理、矿工注销和矿工列表管理。

矿工注册实现上需要首先验证矿工的资质,通过查询矿工的身份验证等级确定是否符合要求,同时需要收取矿工押金。矿工注册通过矿工注册交易实现;

矿工注销则需要计算用户剩余押金,进行注销状态更新,返还用户剩余押金,同时设置退出缓冲期进行安全保证;

押金管理上需要注意资金的安全保护,确保出入资金的安全性;

而在矿工列表处理上,需要注意在进行目标矿工ID计算时,公式

其中的N代表的是r-1区块高度上的矿工总数的状态。

  • 若r-1高度的矿工,通过调整发送矿工注册或者矿工注销交易,调整矿工列表让矿工数量N变化,使得是自己所期望的矿工。如何解决?

首先矿工注册和矿工注销交易是需要手续费的,其次通过矿工注销交易是有押金损耗的(尤其是固定损耗σ),矿工注册尽管不会有押金损耗,但是需要缴纳足够的押金(长时间不能提取),并且还需要有真实身份才能注册。

另外矿工列表L的更新可以做成周期性的更新(例如每100个区块更新一次),而不是每出一个块就更新一次,来避免恶意的攻击。

另外需要注意,矿工通过交易形式进行注册,这也就意味着如果所有老矿工联合起来不打包任何矿工注册交易,那么就无法添加新的矿工

由候选人来进行唱票本身就是不合理的,类似问题也会出现在DPOS算法中,可惜暂时没有发现更好的矿工更新方案。不过幸运的是,这种联合做恶可以被网络任何节点观测到,同时100%做恶矿工的可能性比较小,只要有一名诚实矿工接受注册交易,作恶者就无法成功。

所以设计上会将矿工注册交易手续费提高,提高打包者的收益,鼓励矿工多打包矿工注册交易,另一方面,手续费提高也同时提高了作恶者的成本。

可能存在的问题

重复出块

尽管Qr值、时间惩罚机制可以避免任何人获得出块机会,可是对Qr匹配上的矿工来说,实际上他可以在获得出块权的高度,产生无数的区块(同一高度)。 首先进行这类攻击,对于矿工是没有任何系统内的收益的,这些同一高度的分叉并不会为矿工带来收益,也不会使得该矿工的块被纳入到主链的几率变大,所以我们默认网络大部分矿工不会进行此类攻击。

其次,如何去防范此类攻击,避免无限制产生区块导致整个网络的拥塞?假设做恶矿工为A。第一,在区块同步时,若已同步矿工A产生的区块,同一高度下又收到A的区块(两个区块高度一样,父区块一样,其他信息不一样),则抛弃新的区块并且不转发新的区块。杜绝做恶区块的无限制广播。第二, 任何人可以收集此类区块,提交证据到管理合约,合约校验证据属实,可以没收矿工押金,并踢出矿工。

矿工列表调整空间及如何避免

在前文提到,矿工挖矿通过公式

计算而来,可以看到在前一个区块已确定的情况下,下一个区块的出块权就是确定的。但是,有没有可能前一个矿工通过调整部分参数,使得自己或者合作矿工获得下一个区块的出块权?为了简单解释,假定往前第二个矿工没有进行作恶。 实际上,前一个矿工参数调整空间十分有限, coinbase,r-1,Sig 均无法调整,coinbase为矿工地址,r-1为区块高度,Sig-r-1是对确定值的签名,所以是没有任何调整空间的。

但是需要注意到,矿工列表长度N是可以调整的,假设作恶团体拥有多个矿工账号,前一个矿工在获得出块权后,调整部分地址注册矿工或者注销矿工,以此调整的长度,使得的值落到作恶群体内。这种作恶手段是很容易实现的,也会驱使矿工内部进行联合。

  • 如何解决?

一种办法是在值的取值上,采用前一个检查点位置的值;

另一种办法是提高矿工注册和注销的成本,使得进行矿工数量的调整代价是高昂的。

Clone this wiki locally