PoSRegister
简介
PoSRegister合约主要为PoW用户在PoS上注册提供了相应的通道。通过质押与锁仓一定数量的代币后调用合约中的方法从而使得PoW账户与PoS账户进行绑定。绑定后在锁仓代币数量足够的前提下实现增加与减少投票权重的功能。该合约主要实现的功能有:注册(绑定)PoS全节点;增加,减少投票权重;查询PoS节点当前投票权重;PoS地址与PoW地址间的互相转换
前提概念
- conflux有两条链,一条PoW链,主要处理事务;一条PoS链,对PoW的区块进行验证
- 质押并锁仓的CFX的个数最少为1000
- 1 PoS 投票权重 = 1000 CFX
- 增加,减少投票权重的单位是 vote power
- 锁定到提现有一个时间限制,在staking合约中调用
voteLock()
时需要指定解锁时间
前置条件
- 通过
staking
合约进行质押并锁仓 - 锁仓金额不小于1000CFX
方法阐述
register
概念
PoW账户与PoS账户进行绑定的通道, 当PoW账户的锁仓金额达到1000CFX时,可以调用该方法来为PoS节点与PoW建立连接,目前1000CFX可以换取1 vote power
前置条件
- 有一个正在运行的PoS本地节点
- 在本地调用
conflux rpc local pos register --power 1
, 并复制第一个数据以供调用register
使用
输入参数
- indentifier: PoS节点的标识符
- votePower: 注册时需要换取的投票权重
- blsPubKey: PoS节点的blsPubKey
- vrfPubKey: PoS节点的vrfPubKey
- blsPubKeyProof: PoS节点的blsPubKeyProof
输出参数
无
increaseStake
概念
在PoW账户与PoS账户建立连接, 若用户有提高自己投票权重的需要, 可以调用该方法将锁仓后的CFX置换为投票权重
前置条件
- PoW账户与PoS账户建立了连接
- 新锁仓的CFX大于1000CFX
输入参数
- votePower: 需要提高的投票权重
输出参数
无
retire
概念
在PoW账户与PoS账户建立连接, 若PoW账户有解除和PoS账户相绑定的需要,可调用该方法通过部分或全部解除锁仓来实现绑定的解除功能
前置条件
- PoW账户与PoS账户建立了连接
输入参数
- votePower: 需要减少的投票权重
输出参数
无
getVotes
概念
通过调用该方法来获取质押的token的votes和解除锁仓后的token的votes
前置条件
- PoW账户与PoS账户建立了连接
输入参数
- identifier: PoS节点的标识
输出参数
- totalStakedVotes: 质押的token的votes
- totalUnlockedVotes: 解除锁仓后的token的votes
identifierToAddress
概念
根据PoS账户地址获取对应的PoW地址
前置条件
- PoW账户与PoS账户建立了连接
输入参数
- identifier: PoS账户的地址
输出参数
- address:PoW地址
addressToIdentifier
概念
根据PoW账户地址获取对应的PoS地址
前置条件
- PoW账户与PoS账户建立了连接
输入参数
- address: PoW账户的地址
输出参数
- identifier:PoS地址
代码
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
interface PoSRegister {
/**
* @dev Register PoS account
* @param indentifier - PoS account address to register
* @param votePower - votes count
* @param blsPubKey - BLS public key
* @param vrfPubKey - VRF public key
* @param blsPubKeyProof - BLS public key's proof of legality, used to against some attack, generated by conflux-rust fullnode
*/
function register(
bytes32 indentifier,
uint64 votePower,
bytes calldata blsPubKey,
bytes calldata vrfPubKey,
bytes[2] calldata blsPubKeyProof
) external;
/**
* @dev Increase specified number votes for msg.sender
* @param votePower - count of votes to increase
*/
function increaseStake(uint64 votePower) external;
/**
* @dev Retire specified number votes for msg.sender
* @param votePower - count of votes to retire
*/
function retire(uint64 votePower) external;
/**
* @dev Query PoS account's lock info. Include "totalStakedVotes" and "totalUnlockedVotes"
* @param identifier - PoS address
*/
function getVotes(bytes32 identifier) external view returns (uint256, uint256);
/**
* @dev Query the PoW address binding with specified PoS address
* @param identifier - PoS address
*/
function identifierToAddress(bytes32 identifier) external view returns (address);
/**
* @dev Query the PoS address binding with specified PoW address
* @param addr - PoW address
*/
function addressToIdentifier(address addr) external view returns (bytes32);
/**
* @dev Emitted when register method executed successfully
*/
event Register(bytes32 indexed identifier, bytes blsPubKey, bytes vrfPubKey);
/**
* @dev Emitted when increaseStake method executed successfully
*/
event IncreaseStake(bytes32 indexed identifier, uint64 votePower);
/**
* @dev Emitted when retire method executed successfully
*/
event Retire(bytes32 indexed identifier, uint64 votePower);
}
No Comments