Skip to content

fractal共识介绍

erick yan edited this page Sep 2, 2019 · 5 revisions

fractal 共识介绍

简述

fractal区块链采用委托权益证明dpos共识机制,依赖N个候选人/验证人,M秒随机轮流出块完成共识安全。
出块人列表(有效候选人)依据其投票数从高到低排序,取最高的N个候选人,以及L个候选人作为后备。

创世块初始N个候选人/验证人,作为dpos启动前的出块人列表随机轮流出块。
每7天,以自然周为周期进行记账。

注册候选人需要抵押一定量的持币,这些抵押的币会作为候选人总权重的一部分;另外的部分来自于其他人的投票。所
以更多的抵押意味着更容易当选。不过这些抵押也会在候选人账户出块产生异常或漏掉大量的块时,被当作罚金扣除
掉。

我们这样做的目的主要是希望竞选者有一定的实力能为整个网络提供更好的服务。整个网络的良好运行很大程度上是
依赖各个当选的候选人能够稳定的打包交易,分发区块。我们建议在选择硬件性能足够好的机子作为出块节点的同时,
设置一些代理节点(哨兵架构)。由通过代理节点向网络广播区块,而不是直接接入。我们会参考当选人的表现给予
充足的经济激励,以鼓励其更好的为整个网络贡献力量。为此我们需要设置一个合适的门槛。

另一方面,如果不希望持币被抵押,也可以通过投票给候选人的方式,分得一些投票的奖励。投票人所能投的票的总
数,是通过每周期快照计算出来的。我们以每周日的0点为周期的开始,一直到下一个周的周日0点。在周日0点时,
系统会生成快照,记录每个账户中的非抵押的持币数量。记录的持币数量除以每票所需的单位数量,得到的整数就
是在当前周期内,持币人可以投出票的总数。

持币人可以任意分配票数,投给多个候选人。但每个周期内投出去的票不可撤销,只能等到下个周期再重新分配投票。
每个周期内投的票会被记录在当前周期的记录内,并作为分配当前周期投票奖励的依据。下一个周期开始时,上一个
周期的投票不会顺延,投票数将重新计算,投票也需要持币人重新分配投出,以获取本周期的投票奖励。

关于以快照作为投票计数的设计,我们的初衷是希望有流动性需求的持币人也能够参与到链的运作当中来,所以投票
并不需要持币人抵押任何代币。在周期伊始快照生成的时候,只要持有一定量的币,即使在周期内将持币转账给了其
他账户,在本周期内也可以按照快照计算的投票量投票并分得奖励,但同时在周期内获得的持币并不能被计算为投票
量。
我们在设计时,给予了投票最大的自由。参与注册的候选人亦可以投票给自己或其他的候选人,当然只有抵押之外的
代币会被计算为票数。对于拥有相当数量代币的账户,这个机制可以让其更好的管理自己的资产,而不必把代币分到
多个账户中再进行操作。

待候选人总数及总投票数达到创世块设置的dpos的启动条件时,初始候选人/验证人退出出块人列表。

出块与投票奖励

目前我们的方案中,出块列表里的账户,与后备候选人账户以及所有投票给出块列表里的账户都会收到相应的经济激
励,以鼓励其继续参与区块链的运行,作出更大的贡献。
出块人(矿工)会得到区块中交易的手续费的一部分,其他的部分会分配给资产拥有者以及合约的编写者。
除了手续费的部分,社区还计划以ft可持续挖矿为资金来源,每个周期(自然周7天)给予出块人账户和投票者以奖
励。这部分奖励的分配方式,拟定以周期内出块人出块的统计数据为依据,进行综合排名。其中替补的出块人也会按
其在替补期间应该广播的块数为基础进行评价参与排名。不同名次获得记账奖励的比例不同,所有比例总和为100%

投票者则是根据给出块候选人所公布的分配比例,再乘以自己投票占候选人总票数比例,分配出块人所得的奖励。这
意味着把更多的票,投给表现更稳定的候选人是一个不错的选择。当然下个周期你也可以重新投给别得候选人。

以上所有的奖励都是通过合约的方式,由各个账户发起调用去领取。

共识流程

- 系统管理员单节点出块
- 映射用户资产(erc20),创建映射用户
- 创建用户
- 转账
- 注册候选人/验证人
- 投票候选人/验证人
- dpos正式启动
- 发行资产
- 增发资产
- 发布合约
- 创建用户
- 转账
- 注册候选人/验证人
- 投票候选人/验证人
- 自治恢复

dpos 正式启动前,是否限制资产、合约交易

创世块 genesis.json

{
	"config": {
		"bootnodes": [],
		"chainId": 1,
		"chainName": "fractal",
		"chainUrl": "https://fractalproject.com",
		"accountParams": {
			"level": 0,
			"length": 16,
			"subLength": 8
		},
		"assetParams": {
			"level": 2,
			"length": 16,
			"subLength": 8
		},
		"chargeParams": {
			"assetRatio": 80,
			"contractRatio": 80
		},
		"upgradeParams": {
			"blockCnt": 10000,
			"upgradeRatio": 80
		},
		"dposParams": {
			"maxURLLen": 512,
			"unitStake": 1000,
			"candidateMinQuantity": 10,
			"voterMinQuantity": 1,
			"activatedMinQuantity": 100,
			"blockInterval": 3000,
			"blockFrequency": 6,
			"candidateScheduleSize": 3,
			"backupScheduleSize": 0,
			"epchoInterval": 10800000,
			"freezeEpchoSize": 3,
			"extraBlockReward": 1,
			"blockReward": 5
		},
		"snapshotInterval": 3600000,
		"systemName": "fractal.admin",
		"accountName": "fractal.account",
		"assetName": "fractal.asset",
		"dposName": "fractal.dpos",
		"feeName": "fractal.fee",
		"systemToken": "ftoken"
	},
	"timestamp": 1555776000000,
	"gasLimit": 30000000,
	"difficulty": 131072,
	"allocAccounts": [{
		"name": "fractal.admin",
		"pubKey": "0x047db227d7094ce215c3a0f57e1bcc732551fe351f94249471934567e0f5dc1bf795962b8cccb87a2eb56b29fbe37d614e2f4c3c45b789ae4f1f51f4cb21972ffd"
	}, {
		"name": "fractal.account",
		"pubKey": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
	}, {
		"name": "fractal.asset",
		"pubKey": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
	},{
		"name": "fractal.dpos",
		"pubKey": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
	}, {
		"name": "fractal.fee",
		"pubKey": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
	}],
	"allocCandidates": [],
	"allocAssets": [{
		"name": "ftoken",
		"symbol": "ft",
		"amount": 10000000000000000000000000000,
		"decimals": 18,
		"founder": "fractal.admin",
		"owner": "fractal.admin",
		"upperLimit": 10000000000000000000000000000
	}]
}

dpos 参数详解

  • cadidateScheduleSize

    每轮有效候选人/验证人列表(出块人列表)最大个数,随机轮流出块。依据候选人的投票总数从大到小排序。

  • blockFrequency 有效候选人/验证每轮连续出块个数。可以减少网络延时,提供 tps

  • blockInterval

    出块人出块间隔

  • blockReward

    每个区块增发奖励,奖励给出块候选人/验证人。激励生态发展

  • extraBlockReward

    每个区块额外奖励,根据上一个出块候选人/验证人出块个数,额外奖励给出块候选人/验证人(仅在其第一个区块奖励)。避免候选人恶意推翻上个候选人的区块。

  • delayEcho

    当前出块人列表,延迟轮数获取。因为网络延时的原因,为了保证所有节点可以获取到相同的当前出块人列表,降低分叉,所以当前出块人列表可以使用 N 轮前的出块人列表。

  • maxURLLen 最大 url 长度。候选人可以提供 website url 介绍自己的团队等信息,以获得更多的票。

  • unitStake

    票单位,N 个权益/票。

  • cadidateMinQuantity

    候选人自投票最低票数

  • voterMinQuantity

    持币人/权益人投票最低票数

  • activatedMinQuantity

    dpos 正式启动条件之一,网络最低投票数

  • accountName

    系统 dpos 合约账户名

dpos 交易

  • 注册候选人/验证人
  • 修改候选人/验证人
  • 注销候选人/验证人
  • 投票候选人/验证人

dpos 机制注意事项

  • 投票人投出的票,在本周期不可撤销。
  • 投票人投票计数,在下周期自动清空。
  • 投票人可以多次投票给同一个候选人。
  • 投票人可以投给多个候选人。
  • 候选人亦可投票给其他候选人。
  • dpos 一旦启动成功,不会回退到单节点出块。

dpos 自治

当共识无法工作后或者当共识无法工作后自动接管,系统管理员可通过 rpc 开启系统管理员接管功能,接管后由系统管理员出块,在其出块期间可以接收相关自治交易,待通过自治可恢复共识后,可退出接管,有出块人列表出块。

自治交易(仅在自治期间有效)

  • 设置候选人/验证人进入黑名单
  • 退出接管