Skip to main content

PoSRegister

简介

PoSRegister合约主要为PoW用户在PoS上注册提供了相应的通道。通过质押与锁仓一定数量的代币后调用合约中的方法从而使得PoW账户与PoS账户进行绑定。绑定后在锁仓代币数量足够的前提下实现增加与减少投票权重的功能。该合约主要实现的功能有:注册(绑定)PoS全节点;增加,减少投票权重;查询PoS节点当前投票权重;PoS地址与PoW地址间的互相转换

前提概念

  1. conflux有两条链,一条PoW链,主要处理事务;一条PoS链,对PoW的区块进行验证
  2. 质押并锁仓的CFX的个数最少为1000
  3. 1 PoS 投票权重 = 1000 CFX
  4. 增加,减少投票权重的单位是 vote power
  5. 锁定到提现有一个时间限制,在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);
}