Mina 开发者中文文档
运行质押服务的一个重要部分是预测/确定您可以产生区块的获胜slots,以及支付参与者奖励。Mina协议不会自动向委托者支付报酬,所以运行质押服务的部分工作是手动向参与者支付报酬。
本文档旨在解释管理这些支出时应考虑的不同因素。具体来说,本文档提供了对获胜区块几率的理解,同时从账本中收集数据以供以后使用,并从该数据中计算相关的支付信息。
产生一个区块的coinbase奖励是720个代币。然而,如果一些账户只包含解锁的代币,那么它们将获得2倍的暴击奖励。在质押委托的情况下,是否有额外奖励取决于赢得区块的账户,而不是进行质押和区块生产的账户。
为了计算赢得一个给定epoch区块的概率,或追溯计算给定账户将收到的coinbase奖励,您需要有来自该个epoch的质押账本。Mina守护进程仅为当前epoch和下一个epoch在质押账簿保持不变,所以如果您想为一个epoch获取质押账簿,您需要在那个epoch之前或期间对它进行操作。
mina ledger export
的命令可以用于从正在运行的守护进程中导出账本。它将希望导出的账本的标识符作为参数。下表描述了这些标识符所代表的含义。
标识符 | 描述 |
---|---|
staking-epoch-ledger | 当前epoch的质押账本。 |
next-epoch-ledger | 下一个epoch(当前之后的epoch)的质押帐本。 |
staged-ledger | 最近的分阶段账本(来自该节点的最佳提示)。 |
为了确保您总是有每个质押账本可在epoch过期后使用,我们建议导出每个\dfrac{7140\times3}{60} = 357607140×3 =357小时的质押账本(在一个epoch中有7140个slot,每个slot33分钟)。
默认情况下,账本导出为json数据。请参阅mina ledger export -help
了解将启用其他格式的标志文档。当输出为json时,账本将表示为帐户的数组。下面是一个json中的账户的示例。
{
"pk": "B62qrwZRsNkU39TrGpFwDdpRS2JaCB2yFZKMFNqLFYjcqGE5G5fWA8p",
"balance": "17000",
"delegate": "B62qrwZRsNkU39TrGpFwDdpRS2JaCB2yFZKMFNqLFYjcqGE5G5fWA8p",
"token": "1",
"token_permissions": {},
"receipt_chain_hash": "2mzbV7WevxLuchs2dAMY4vQBS6XttnCUF8Hvks4XNBQ5qiSGGBQe",
"voting_for": "3NK2tkzqqK5spR2sZ7tujjqPksL45M3UUrcA4WhCkeiPtnugyE2x",
"permissions": {
"stake": true,
"edit_state": "signature",
"send": "signature",
"set_delegate": "signature",
"set_permissions": "signature",
"set_verification_key": "signature"
}
}
对于一个正在运行的质押服务,您会对您所控制的账户和向被您控制的账户质押的账户感兴趣的。举个例子,如果我们的质押服务中只有一个账户,我们可以通过如下命令获取我们感兴趣的所有账户:
mina ledger export staking-epoch-ledger | jq "$(cat <<EOF
.[] | \
select( \
.pk == "B62qjwvvHoM9RVt9onMpSMS5rFzhy3jjXY1Q9JU7HyHW4oWFEbWpghe" or \
.delegate == "B62qjwvvHoM9RVt9onMpSMS5rFzhy3jjXY1Q9JU7HyHW4oWFEbWpghe" \
)
EOF
)"
作为质押服务,您想要计算的一个重要细节是,一个账户是否会获得暴击的coinbase奖励,您可能想要在向参与者支付质押服务的权重中包含这些奖励。带有锁定代币的账户(也就是那些没有收到充值奖励的账户)将在其json表示中有一个特殊的"timing"
字段。下面是一个例子:
{
"pk": "B62qmVHmj3mNhouDf1hyQFCSt3ATuttrxozMunxYMLctMvnk5y7nas1",
"balance": "230400",
"delegate": "B62qk2ujo9BoBxCs9BFQUsv3efaJDzbJeLs4YJdZMJzJoVj69ShVdKs",
"timing": {
"initial_minimum_balance": "230400",
"cliff_time": "86400",
"cliff_amount": "230400",
"vesting_period": "1",
"vesting_increment": "0"
}
}
仅仅因为帐户有一个"timing"
字段,并不一定意味着帐户有锁定的代币。时间锁定帐户包含锁定和解锁代币,"timing"
字段描述该帐户中锁定代币的解锁时间表。如果一个帐户有一个"timing"
字段,您可以计算该帐户的代币将完全解锁的slots,之后该帐户将获得暴击奖励。这可以通过确定一个定时帐户将花费多长时间来完全授予它的代币来计算,并将其添加到"cliff_time"
,这是帐户开始授予代币的位置。下面是一些示例python代码,它将根据帐户的定时信息计算解锁时间。
vesting_amount = initial_min_balance - cliff_amount
vesting_time = vesting_amount * math.ceil(vesting_period / vesting_increment)
unlocked_time = cliff_time + vesting_time
每个质押服务决定他们希望如何去计算奖励。重要的是要考虑到暴击激励和不同委托者的权重,这取决于您选择如何支付奖励。
作为计算权益服务支出的一个例子,我们建议看看我们社区的一个成员在docs.minaexplorer.com上整理的文档。
Mina中的区块是在称为“slot”的不同时间间隔内产生的。分类帐中的每个帐户都有机会赢得网络上的每个slot,这允许它们为该slot生成一个区块(或者,在委托的情况下,允许被委托的帐户代表它们生成一个区块)。帐户为每个slot计算一个随机数(通过可验证的随机函数,即VRF),并将该随机数与所需的阈值进行比较,以确定他们是否“赢得”了该slot,并产生一个块。因此,他们赢得slot的机会是由阈值决定的,该阈值是他们在网络中的相对质押的函数。
在确定VRF阈值时采样的质押分布包含在一个称为“质押账本”的特殊账中。质押账本是来自网络中过去epoch的固定账本(epoch是slot的固定跨度;每个纪元有7140个slot)。使用过去固定的账本可以防止恶意的股权(token)持有者通过改变账本(“分阶段账本”)上的股权(token)分配来增加他们在一个epoch中获胜的机会。每个epoch,质押的账本都在变化。由于这个限制,系统上的任何帐户只能检查给定时间内的未来2个epoch内的“获胜slot”。
一旦您知道了将用于给定的epoch的质押账本,就可以为每个帐户计算被用于在该epoch中生成块的所需VRF阈值。我们可以通过将质押账本中账户控制的权益除以权益账本中货币的总量来计算给定账户的权益比率。Ouroboros Genesis第20页的图1提供了计算VRF阈值的原始函数。将Mina的值填入有源slot系数f,得到以下函数:\phi\left(\alpha\right) \ triangleq1 1 - \left(\dfrac{1}{4}\right)^\alpha。这个函数取一个参数\alpha,它是我们为一个帐户计算的股权比率。
由于将每个VRF与这个阈值(在0到1之间)进行比较,并且每个VRF是0到1之间的伪随机数,所以给定帐户的VRF阈值本质上是该帐户赢得slot的概率。因此,我们可以推断出计算VRF阈值的函数来计算我们可以期望给定帐户在一个epoch内获胜的平均块数。这可以仅仅通过对赢得一个epoch的每个slot的所有概率之和来完成,并且由于整个epoch的概率是固定的,计算这个的数学表达式简化为\phi\left(\alpha\right)\times7140。
举个例子,假设网络上有一个账户,在质押账本epoch ep中有10^6(100万)个mina令牌。epoch ep同样的质押账本总供应8\times10^8(8亿)mina代币。我们可以使用\phi\left(\dfrac{10^6}{8\times10^8}\right)=0.0017313674 来计算该账户在ep中赢得单个slot的概率。该帐户将以\sim0.17\%的机会,赢得epoch ep中的每个slot。然后,我们可以通过将结果乘以7140来计算我们期望这个账户为这个epoch产生的块的平均数目,其期望为\sim12.36块。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!