赌注智能合约
原文:https://docs.elrond.com/validators/staking/staking-smart-contract
# 打桩
当节点的操作者发送一个打桩交易到打桩智能合约时,节点被提升为验证者的角色。通过这个交易,操作者为每个成为验证者的节点锁定(“赌注”)一定数量的他们自己的 EGLD。单个 staking 交易包含 EGLD 和一个或多个节点的 stake 所需的信息。此类交易包含以下内容:
- 操作员正在锁定的节点数
- 属于单个节点的 BLS 键的级联列表
- 每个单独节点的桩数,即节点数× 2500 EGLD
- 气体限值为 6 000 000 气体单位×节点数量
- 可选地,可以指定奖励应该被转移到的单独的地址,而不是交易本身发起的地址。奖励地址必须首先从 Bech32 表示解码为字节,然后重新编码为 base16(十六进制)。
例如,如果一个操作者用 96 字节长的 BLS 键45e7131ba....294812f004
和ecf6fdbf5....70f1d251f7
管理两个单独的节点,那么桩交易将按如下方式构建:
StakingTransaction {
Sender: <account address of the node operator>
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqplllst77y4l
Value: 5000 EGLD
GasLimit: 12000000
Data: "stake" +
"@0002" +
"@45e7131ba....294812f004" +
"@67656e65736973"
"@ecf6fdbf5....70f1d251f7" +
"@67656e65736973"
"@optional_reward_address_HEX_ENCODED"
}
关于参数如何编码的更多细节,点击这里。
因为该交易是对 Staking smart 合约的调用,所以它通过Data
字段传递信息:
stake
是要调用的智能合约函数的名称;0002
是节点数(无符号整数,十六进制编码);- 45e7131ba....294812f004 是第一个节点的 BLS 键,用 192 个字符长的十六进制字符串表示;
67656e65736973
是一个保留的占位符,在每个 BLS 键后都需要;ecf6fdbf5....70f1d251f7
是第二个节点的 BLS 键,表示为 192 个字符长的十六进制字符串;67656e65736973
是前面提到的预留占位符,重复;optional_reward_address_HEX_ENCODED
是帐户的地址,该帐户将接收赌注节点的奖励(从其通常的 Bech32 表示解码为二进制,然后重新编码为十六进制字符串)。
改变奖励地址
验证器节点产生奖励,然后奖励被转移到一个账户。默认情况下,该帐户与提交赌注交易的帐户相同(参见上一节)。在赌注交易中,节点运营商可以选择不同的奖励地址。
奖励地址也可以在以后通过对赌注智能合约的特殊交易来改变。为了正确地计算用于改变奖励地址的 gas 限制,准确地知道在原始赌注交易中指定了多少节点是很重要的。
- 0 埃及镑的数量
- 6,000,000 气体单位的气体限制×奖励地址改变的节点(由原始赌注交易指定)。
- 新的奖励地址。奖励地址必须首先从正常的 Bech32 表示解码为二进制,然后重新编码为 base16(十六进制)。
例如,更改两个节点的奖励地址需要以下交易:
ChangeRewardAddressTransaction {
Sender: <account address of the node operator>
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqplllst77y4l
Value: 0 EGLD
Data: "changeRewardAddress@reward_address_HEX_ENCODED"
GasLimit: 12000000
}
关于参数如何编码的更多细节,点击这里。
【解散】
节点操作者可以通过向 Staking smart contract 发送包含以下内容的拆分交易来将他们的验证者节点降级回观察者状态:
- 0 埃及镑的数量
- 属于要从验证器状态降级的单个节点的 BLS 键的串联列表
- 气体限值为 6 000 000 气体单位×节点数量
注意,降级并不是瞬间发生的:未分配的节点将保持验证者状态,直到网络释放它们,这是一个受各种影响的过程。
此外,之前锁定为股份的 EGLD 数量不会立即返回。只有在预定的回合数之后,它才可用,在此之后,节点操作员可以通过第三次特殊交易索回该金额(参见下一节)。
继续上一节中的示例,两个节点的拆分交易包含以下内容:
UnstakingTransaction {
Sender: <account address of the node operator>
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqplllst77y4l
Value: 0 EGLD
GasLimit: 12000000
Data: "unStake" +
"@45e7131ba....294812f004" +
"@ecf6fdbf5....70f1d251f7"
}
关于参数如何编码的更多细节,点击这里。
请注意:
45e7131ba....294812f004
是第一个节点的 BLS 键,表示为 192 个字符长的十六进制字符串;ecf6fdbf5....70f1d251f7
是第二个节点的 BLS 键,表示为 192 个字符长的十六进制字符串;- 不需要预留占位符,这与桩交易相反(见上文)
解绑
节点操作者可以使用对赌注智能合约的解除绑定交易来收回先前为其验证器节点锁定的赌注。在取消绑定之前,节点操作符必须已经为它们的一些验证器发送了一个拆栈交易,并且在拆栈交易被处理之后,必须已经经过了预定数量的循环。
取消绑定交易处理与拆分交易处理几乎相同,包含以下内容:
- 0 埃及镑的数量
- 属于索回股份的单个节点的 BLS 键的级联列表
- 气体限值为 6 000 000 气体单位×节点数量
按照前面几节中的示例,两个节点的取消绑定交易包含以下信息:
UnbondingTransaction {
Sender: <account address of the node operator>
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqplllst77y4l
Value: 0 EGLD
GasLimit: 12000000
Data: "unBond" +
"@45e7131ba....294812f004" +
"@ecf6fdbf5....70f1d251f7"
}
关于参数如何编码的更多细节,请点击这里。
请注意:
- 45e7131ba....294812f004 是第一个节点的 BLS 键,用 192 个字符长的十六进制字符串表示;
ecf6fdbf5....70f1d251f7
是第二个节点的 BLS 键,表示为 192 个字符长的十六进制字符串;- 不需要预留占位符,这与桩交易相反(见上文)
un jaling
如果节点操作者注意到他们的一些验证器节点由于评级低而被监禁,他们可以通过支付少量罚款将这些节点恢复为活动验证器。这是通过发送到 Staking smart 合约的 unjailing 交易完成的,该交易包含以下内容:
- 每个被监禁节点的金额为 2.5 埃及镑(罚款)——该值必须正确计算;任何其他金额都将导致拒绝 unjail 交易
- 属于要取消联接的单个节点的 BLS 键的串联列表
- 气体限值为 6 000 000 气体单位×节点数量
继续上一节中的示例,如果节点45e7131ba....294812f004
和ecf6fdbf5....70f1d251f7
由于评级低而被关进监狱,则可以通过以下交易解除它们的绑定:
UnjailTransaction {
Sender: <account address of the node operator>
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqplllst77y4l
Value: 5 EGLD
GasLimit: 12000000
Data: "unJail" +
"@45e7131ba....294812f004" +
"@ecf6fdbf5....70f1d251f7"
}
关于参数如何编码的更多细节,请点击这里。
请注意:
45e7131ba....294812f004
是第一个节点的 BLS 键,表示为 192 个字符长的十六进制字符串;ecf6fdbf5....70f1d251f7
是第二个节点的 BLS 键,表示为 192 个字符长的十六进制字符串;- 不需要预留占位符,这与桩交易相反(见上文)
从赌注中认领未使用的代币
如果一个节点运营商发送了一个包含的 EGLD 数量高于交易中所列节点要求的赌注交易,他们可以通过一个简单的索赔交易来索回该金额的剩余部分,该交易包含:
- 0 埃及镑的数量
- 6 00 万气体单位的气体限制
索赔交易的一个例子是:
ClaimTransaction {
Sender: <account address of the node operator>
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqplllst77y4l
Value: 0 EGLD
Data: "claim"
GasLimit: 6000000
}
关于参数如何编码的更多细节,点击这里。
在处理该交易之后,Staking smart contract 将产生一个交易返回到发送者帐户,但是只有在发送者帐户先前已经使用 Staking 交易对节点进行了 staked 的情况下。