nest3.0从架构解析到克隆二(从token到mapping)

nest3.0相对于2.0做了全新的开发,尽管里面的很多源码都是复用的,但结构发生了翻天覆地的变化。其中一共非常关键的内容就是mapping的变化。本文将从token讲到mapping,并对其源码进行中文注释。帮助阅读者从框架上掌握更多的内容。

[返回总章](https://learnblockchain.cn/article/2125) 我们在上篇文章对nest3.0的架构做了一下解析,我们在本文继续讲解。 nest3.0相对于2.0做了全新的开发,尽管里面的很多源码都是复用的,但结构发生了翻天覆地的变化。其中一共非常关键的内容就是mapping的变化。 # IBNEST与token设计 NEST的token是在2019年就设计完毕了。其宣传的是报价挖矿得币,猛一看有点像比特币,但其实区别非常的大。NEST的token在早期就一次性都出来了,只不过是存在一个专门的地址,而每一次的报价就通过函数调用而获得一次打款。 这种灵活的方式其实非常值得借鉴,就是我们在做很多token的时候,不一定太依赖于某种新的方案。我们往往采用的是成熟的方案,与折中的行为来完成。 # Nest_3_VoteFactory与mapping 预言机是一套非常复杂的智能合约,如何来进行相关合约的升级呢?在nest2.0当中有一个专门的mapping来存储这些合约的地址。简单说就是,当某一个合约升级后,将其对应的合约地址更新一下就可以了。 但在nest3.0里面却找不到这个mapping了。其实这只是层窗户纸罢了,我在这里告诉大家,只是换了个地方,改了一个名字而已。 现在合约名称叫Nest_3_VoteFactory,位于VoteContract里面的Nest_3_VoteFactory.sol文件。 ## Nest_3_VoteFactory的结构 主要分四部分: 第一部分是基本定义,对需要的相关变量进行定义; 第二部分是做智能合约的映射,以及各种权限的修改; 第三部分是进行投票的设定和使用; 第四部分是紧急事件处理; ## Nest_3_VoteFactory的变量定义 ``` using SafeMath for uint256; uint256 _limitTime = 7 days; // Vote duration投票持续时间 uint256 _NNLimitTime = 1 days; // NestNode raising time NestNode筹集时间 uint256 _circulationProportion = 51; // Proportion of votes to pass 通过票数比例 uint256 _NNUsedCreate = 10; // The minimum number of NNs to create a voting contract创建投票合约最小 NN 数量 uint256 _NNCreateLimit = 100; // The minimum number of NNs needed to start voting开启投票需要筹集 NN 最小数量 uint256 _emergencyTime = 0; // The emergency state start time紧急状态启动时间 uint256 _emergencyTimeLimit = 3 days; // The emergency state duration紧急状态持续时间 uint256 _emergencyNNAmount = 1000; // The number of NNs required to switch the emergency state切换紧急状态需要nn数量 ERC20 _NNToken; // NestNode Token守护者节点Token(NestNode) ERC20 _nestToken; // NestToken mapping(string => address) _contractAddress; // Voting contract mapping投票合约映射 mapping(address => bool) _modifyAuthority; // Modify permissions修改权限 mapping(address => address) _myVote; // Personal voting address我的投票 mapping(address => uint256) _emergencyPerson; // Emergency state personal voting number紧急状态个人存储量 mapping(address => bool) _contractData; // Voting contract data投票合约集合 bool _stateOfEmergency = false; // Emergency state紧急状态 address _destructionAddress; // Destroy contract address销毁合约地址 ``` ## Nest_3_VoteFactory的合约映射 这个里面主要是3个内容。 第一个是修改超级用户; 第二个是增加智能合约地址与name的对应; 第三个是将相关的智能合约进行刷新。 ``` constructor () public { _modifyAuthority[address(msg.sender)] = true; //将修改权限者(也叫超级用户)。 } ``` ``` /** nest * @dev Reset contract 重置合约 */ function changeMapping() public onlyOwner { _NNToken = ERC20(checkAddress("nestNode")); _destructionAddress = address(checkAddress("nest.v3.destruction")); _nestToken = ERC20(address(checkAddress("nest"))); } //这个地方刷新nestnode,nest.v3.destruction,以及nestnode ``` ``` // Check address function checkAddress(string memory name) public view returns (address contractAddress) { return _contractAddress[name]; } //查看合约地址 // Add contract mapping address function addContractAddress(string memory name, address contractAddress) public onlyOwner { _contractAddress[name] = contractAddress; } //将合约名称与地址对应 // Add administrator address function addSuperMan(address superMan) public onlyOwner { _modifyAuthority[superMan] = true; } //增加管理地址 function addSuperManPrivate(address superMan) private { _modifyAuthority[superMan] = true; } // Delete administrator address //删除管理地址 function deleteSuperMan(address superMan) public onlyOwner { _modifyAuthority[superMan] = false; } function deleteSuperManPrivate(address superMan) private { _modifyAuthority[superMan] = false; } //解除合约管理员权限 // Delete voting contract data //删除投票合约集合 function deleteContractData(address contractAddress) public onlyOwner { _contractData[contractAddress] = false; } // Check whether the administrator //查看是否管理员 function checkOwners(address man) public view returns (bool) { return _modifyAuthority[man]; } // Administrator only //仅管理员操作 modifier onlyOwner() { require(checkOwners(msg.sender), "No authority"); _; } ``` ## Nest_3_VoteFactory的投票管理 主要是三个内容: 1.创建普通投票 2.创建NN投票 3.查看投票 ``` /** * @dev Create voting contract 创建投票合约 * @param implementContract The executable contract address for voting 投票可执行合约地址 * @param nestNodeAmount Number of NNs to pledge 质押 NN 数量 */ function createVote(address implementContract, uint256 nestNodeAmount) public { require(address(tx.origin) == address(msg.sender), "It can't be a contract"); require(nestNodeAmount >= _NNUsedCreate); Nest_3_VoteContract newContract = new Nest_3_VoteContract(implementContract, _stateOfEmergency, nestNodeAmount); //建立一个新的投票,这里主要是初始化一个Nest_3_VoteContract结构体 require(_NNToken.transferFrom(address(tx.origin), address(newContract), nestNodeAmount), "Authorization transfer failed"); //传输nn数量 _contractData[address(newContract)] = true; //新投票成立 emit ContractAddress(address(newContract)); //监听新合约地址事件 } /** * @dev Use NEST to vote 使用nest投票 * @param contractAddress Vote contract address 投票合约地址 */ function nestVote(address contractAddress) public { require(address(msg.sender) == address(tx.origin), "It can't be a contract"); require(_contractData[contractAddress], "It's not a voting contract"); //先检测地址是否合法 require(!checkVoteNow(address(msg.sender))); //如果投票未结束,或者发送者投票为0则继续 //检查投票者 Nest_3_VoteContract newContract = Nest_3_VoteContract(contractAddress); //建立一个用于投票的合约 newContract.nestVote(); //投票 _myVote[address(tx.origin)] = contractAddress; //我的投票地址为contractAddress } /** * @dev Vote using NestNode Token 使用 nestNode 投票 * @param contractAddress Vote contract address 投票合约地址 * @param NNAmount Amount of NNs to pledge 质押 NN 数量 */ function nestNodeVote(address contractAddress, uint256 NNAmount) public { require(address(msg.sender) == address(tx.origin), "It can't be a contract"); require(_contractData[contractAddress], "It's not a voting contract"); Nest_3_VoteContract newContract = Nest_3_VoteContract(contractAddress); //建立一个用于投票的合约 require(_NNToken.transferFrom(address(tx.origin), address(newContract), NNAmount), "Authorization transfer failed"); //将币传输到合约地址 newContract.nestNodeVote(NNAmount); } /** * @dev Excecute contract 执行投票 * @param contractAddress Vote contract address 投票合约地址 */ function startChange(address contractAddress) public { require(address(msg.sender) == address(tx.origin), "It can't be a contract"); require(_contractData[contractAddress], "It's not a voting contract"); Nest_3_VoteContract newContract = Nest_3_VoteContract(contractAddress); //获得这个地址的智能合约 require(_stateOfEmergency == newContract.checkStateOfEmergency()); //检测是不是状态一致 addSuperManPrivate(address(newContract)); //使得这个地址获取超级用户权力 newContract.startChange(); //运行(但目前没有这个接口文件) deleteSuperManPrivate(address(newContract)); //解除超级用户权限 } ``` ``` /** * @dev Check my voting 查看我的投票 * @param user Address to check 参与投票地址 * @return address Address recently participated in the voting contract address 是否正在参与投票 */ function checkMyVote(address user) public view returns (address) { return _myVote[user]; } // Check the voting time //检查投票时间 function checkLimitTime() public view returns (uint256) { return _limitTime; } ``` ## Nest_3_VoteFactory紧急事件处理 一般出现了严重的问题,比如token出现严重bug,或者有大量的币被盗,才启用。 一般来说,需要守护者节点2/3以上的同意才行。 基本原则就是快速完成映射,然后锁死合约。 ``` /** * @dev Switch emergency state-transfer in NestNode Token 切换紧急状态-转入NestNode * @param amount Amount of NNs to transfer 转入 NestNode 数量 */ function sendNestNodeForStateOfEmergency(uint256 amount) public { //单独调用的函数 require(_NNToken.transferFrom(address(tx.origin), address(this), amount)); //用户将自己的nn转入到这个合约地址里面 _emergencyPerson[address(tx.origin)] = _emergencyPerson[address(tx.origin)].add(amount); //_emergencyPerson数组里面的该地址的nn增加。 } /** * @dev Switch emergency state-transfer out NestNode Token 切换紧急状态-取出NestNode */ function turnOutNestNodeForStateOfEmergency() public { require(_emergencyPerson[address(tx.origin)] > 0); require(_NNToken.transfer(address(tx.origin), _emergencyPerson[address(tx.origin)])); //检测本地址是否应该有币要转移,然后把nn转移到本地址 _emergencyPerson[address(tx.origin)] = 0; uint256 nestAmount = _nestToken.balanceOf(address(this)); //检测本地址有多少nest require(_nestToken.transfer(address(_destructionAddress), nestAmount)); //一并销毁 } /** * @dev Modify emergency state 修改紧急状态 */ function changeStateOfEmergency() public { if (_stateOfEmergency) { require(now > _emergencyTime.add(_emergencyTimeLimit)); //now为当前时间戳 _stateOfEmergency = false; _emergencyTime = 0; //如果为紧急状态,看是否结束,结束则赋值为false } else { require(_emergencyPerson[address(msg.sender)] > 0); //本人是否为注册 require(_NNToken.balanceOf(address(this)) >= _emergencyNNAmount); //总量是否达标, _stateOfEmergency = true; //然后就执行 _emergencyTime = now; // } } ``` ``` // Check the NestNode raising time //查看NestNode筹集时间 function checkNNLimitTime() public view returns (uint256) { return _NNLimitTime; } // Check the voting proportion to pass //查看通过投票比例 function checkCirculationProportion() public view returns (uint256) { return _circulationProportion; } // Check the minimum number of NNs to create a voting contract //查看创建投票合约最小 NN 数量 function checkNNUsedCreate() public view returns (uint256) { return _NNUsedCreate; } // Check the minimum number of NNs raised to start a vote //查看创建投票筹集 NN 最小数量 function checkNNCreateLimit() public view returns (uint256) { return _NNCreateLimit; } // Check whether in emergency state //查看是否是紧急状态 function checkStateOfEmergency() public view returns (bool) { return _stateOfEmergency; } // Check the start time of the emergency state //查看紧急状态启动时间 function checkEmergencyTime() public view returns (uint256) { return _emergencyTime; } // Check the duration of the emergency state //查看紧急状态持续时间 function checkEmergencyTimeLimit() public view returns (uint256) { return _emergencyTimeLimit; } // Check the amount of personal pledged NNs //查看个人 NN 存储量 function checkEmergencyPerson(address user) public view returns (uint256) { return _emergencyPerson[user]; } // Check the number of NNs required for the emergency // 查看紧急状态需要 NN 数量 function checkEmergencyNNAmount() public view returns (uint256) { return _emergencyNNAmount; } // Verify voting contract data //验证投票合约 function checkContractData(address contractAddress) public view returns (bool) { return _contractData[contractAddress]; } // Modify voting time //修改投票时间 function changeLimitTime(uint256 num) public onlyOwner { require(num > 0, "Parameter needs to be greater than 0"); _limitTime = num; } // Modify the NestNode raising time //修改NestNode筹集时间 function changeNNLimitTime(uint256 num) public onlyOwner { require(num > 0, "Parameter needs to be greater than 0"); _NNLimitTime = num; } // Modify the voting proportion //修改通过投票比例 function changeCirculationProportion(uint256 num) public onlyOwner { require(num > 0, "Parameter needs to be greater than 0"); _circulationProportion = num; } // Modify the minimum number of NNs to create a voting contract //修改创建投票合约最小 NN 数量 function changeNNUsedCreate(uint256 num) public onlyOwner { _NNUsedCreate = num; } // Modify the minimum number of NNs to raised to start a voting //修改创建投票筹集 NN 最小数量 function checkNNCreateLimit(uint256 num) public onlyOwner { _NNCreateLimit = num; } // Modify the emergency state duration //修改紧急状态持续时间 function changeEmergencyTimeLimit(uint256 num) public onlyOwner { require(num > 0); _emergencyTimeLimit = num.mul(1 days); } // Modify the number of NNs required for emergency state //修改紧急状态需要 NN 数量 function changeEmergencyNNAmount(uint256 num) public onlyOwner { require(num > 0); _emergencyNNAmount = num; } ``` # 简单总结 Nest_3_VoteFactory是除了报价部分外最重要的部分,他将token,公投,以及合约映射无缝连接到了一起。 我曾经一度奇怪为什么要这么做,把mapping分开单独不可以吗? 后来大概有点明白开发小组的意思了,他们的目的是将紧急处理部分与mapping合在一起,以免最糟糕的情况发生,就是mapping也被黑客掌握了。 而目前的这种情况的,随着后期将所有权限都转交给投票系统后,整个系统将变得更加的安全。

返回总章 我们在上篇文章对nest3.0的架构做了一下解析,我们在本文继续讲解。 nest3.0相对于2.0做了全新的开发,尽管里面的很多源码都是复用的,但结构发生了翻天覆地的变化。其中一共非常关键的内容就是mapping的变化。

IBNEST与token设计

NEST的token是在2019年就设计完毕了。其宣传的是报价挖矿得币,猛一看有点像比特币,但其实区别非常的大。NEST的token在早期就一次性都出来了,只不过是存在一个专门的地址,而每一次的报价就通过函数调用而获得一次打款。 这种灵活的方式其实非常值得借鉴,就是我们在做很多token的时候,不一定太依赖于某种新的方案。我们往往采用的是成熟的方案,与折中的行为来完成。

Nest_3_VoteFactory与mapping

预言机是一套非常复杂的智能合约,如何来进行相关合约的升级呢?在nest2.0当中有一个专门的mapping来存储这些合约的地址。简单说就是,当某一个合约升级后,将其对应的合约地址更新一下就可以了。 但在nest3.0里面却找不到这个mapping了。其实这只是层窗户纸罢了,我在这里告诉大家,只是换了个地方,改了一个名字而已。 现在合约名称叫Nest_3_VoteFactory,位于VoteContract里面的Nest_3_VoteFactory.sol文件。

Nest_3_VoteFactory的结构

主要分四部分: 第一部分是基本定义,对需要的相关变量进行定义; 第二部分是做智能合约的映射,以及各种权限的修改; 第三部分是进行投票的设定和使用; 第四部分是紧急事件处理;

Nest_3_VoteFactory的变量定义

   using SafeMath for uint256;

    uint256 _limitTime = 7 days;                                    //  Vote duration投票持续时间
    uint256 _NNLimitTime = 1 days;                                  //  NestNode raising time NestNode筹集时间
    uint256 _circulationProportion = 51;                            //  Proportion of votes to pass 通过票数比例
    uint256 _NNUsedCreate = 10;                                     //  The minimum number of NNs to create a voting contract创建投票合约最小 NN 数量
    uint256 _NNCreateLimit = 100;                                   //  The minimum number of NNs needed to start voting开启投票需要筹集 NN 最小数量
    uint256 _emergencyTime = 0;                                     //  The emergency state start time紧急状态启动时间
    uint256 _emergencyTimeLimit = 3 days;                           //  The emergency state duration紧急状态持续时间
    uint256 _emergencyNNAmount = 1000;                              //  The number of NNs required to switch the emergency state切换紧急状态需要nn数量
    ERC20 _NNToken;                                                 //  NestNode Token守护者节点Token(NestNode)
    ERC20 _nestToken;                                               //  NestToken
    mapping(string => address) _contractAddress;                    //  Voting contract mapping投票合约映射
    mapping(address => bool) _modifyAuthority;                      //  Modify permissions修改权限
    mapping(address => address) _myVote;                            //  Personal voting address我的投票
    mapping(address => uint256) _emergencyPerson;                   //  Emergency state personal voting number紧急状态个人存储量
    mapping(address => bool) _contractData;                         //  Voting contract data投票合约集合
    bool _stateOfEmergency = false;                                 //  Emergency state紧急状态
    address _destructionAddress;                                    //  Destroy contract address销毁合约地址

Nest_3_VoteFactory的合约映射

这个里面主要是3个内容。 第一个是修改超级用户; 第二个是增加智能合约地址与name的对应; 第三个是将相关的智能合约进行刷新。

    constructor () public {
        _modifyAuthority[address(msg.sender)] = true;
        //将修改权限者(也叫超级用户)。
    }
    /** nest
    * @dev Reset contract
    重置合约
    */
    function changeMapping() public onlyOwner {
        _NNToken = ERC20(checkAddress("nestNode"));
        _destructionAddress = address(checkAddress("nest.v3.destruction"));
        _nestToken = ERC20(address(checkAddress("nest")));
    }
    //这个地方刷新nestnode,nest.v3.destruction,以及nestnode
   //  Check address
    function checkAddress(string memory name) public view returns (address contractAddress) {
        return _contractAddress[name];
    }
    //查看合约地址

    //  Add contract mapping address
    function addContractAddress(string memory name, address contractAddress) public onlyOwner {
        _contractAddress[name] = contractAddress;
    }
    //将合约名称与地址对应

    //  Add administrator address 
    function addSuperMan(address superMan) public onlyOwner {
        _modifyAuthority[superMan] = true;
    }
    //增加管理地址

    function addSuperManPrivate(address superMan) private {
        _modifyAuthority[superMan] = true;
    }

    //  Delete administrator address
    //删除管理地址
    function deleteSuperMan(address superMan) public onlyOwner {
        _modifyAuthority[superMan] = false;
    }
    function deleteSuperManPrivate(address superMan) private {
        _modifyAuthority[superMan] = false;
    }
    //解除合约管理员权限

    //  Delete voting contract data
    //删除投票合约集合
    function deleteContractData(address contractAddress) public onlyOwner {
        _contractData[contractAddress] = false;
    }

    //  Check whether the administrator
    //查看是否管理员
    function checkOwners(address man) public view returns (bool) {
        return _modifyAuthority[man];
    }

    //  Administrator only
    //仅管理员操作
    modifier onlyOwner() {
        require(checkOwners(msg.sender), "No authority");
        _;
    }

Nest_3_VoteFactory的投票管理

主要是三个内容: 1.创建普通投票 2.创建NN投票 3.查看投票

   /**
    * @dev Create voting contract
    创建投票合约
    * @param implementContract The executable contract address for voting
    投票可执行合约地址
    * @param nestNodeAmount Number of NNs to pledge
    质押 NN 数量
    */
    function createVote(address implementContract, uint256 nestNodeAmount) public {
        require(address(tx.origin) == address(msg.sender), "It can't be a contract");
        require(nestNodeAmount >= _NNUsedCreate);
        Nest_3_VoteContract newContract = new Nest_3_VoteContract(implementContract, _stateOfEmergency, nestNodeAmount);
        //建立一个新的投票,这里主要是初始化一个Nest_3_VoteContract结构体
        require(_NNToken.transferFrom(address(tx.origin), address(newContract), nestNodeAmount), "Authorization transfer failed");
        //传输nn数量
        _contractData[address(newContract)] = true;
        //新投票成立
        emit ContractAddress(address(newContract));
        //监听新合约地址事件
    }

    /**
    * @dev Use NEST to vote
    使用nest投票
    * @param contractAddress Vote contract address
    投票合约地址
    */
    function nestVote(address contractAddress) public {
        require(address(msg.sender) == address(tx.origin), "It can't be a contract");
        require(_contractData[contractAddress], "It's not a voting contract");
        //先检测地址是否合法
        require(!checkVoteNow(address(msg.sender)));
        //如果投票未结束,或者发送者投票为0则继续
        //检查投票者
        Nest_3_VoteContract newContract = Nest_3_VoteContract(contractAddress);
        //建立一个用于投票的合约
        newContract.nestVote();
        //投票
        _myVote[address(tx.origin)] = contractAddress;
        //我的投票地址为contractAddress
    }

    /**
    * @dev Vote using NestNode Token
    使用 nestNode 投票
    * @param contractAddress Vote contract address
    投票合约地址
    * @param NNAmount Amount of NNs to pledge
    质押 NN 数量
    */
    function nestNodeVote(address contractAddress, uint256 NNAmount) public {
        require(address(msg.sender) == address(tx.origin), "It can't be a contract");
        require(_contractData[contractAddress], "It's not a voting contract");
        Nest_3_VoteContract newContract = Nest_3_VoteContract(contractAddress);
        //建立一个用于投票的合约
        require(_NNToken.transferFrom(address(tx.origin), address(newContract), NNAmount), "Authorization transfer failed");
        //将币传输到合约地址
        newContract.nestNodeVote(NNAmount);
    }

    /**
    * @dev Excecute contract
    执行投票
    * @param contractAddress Vote contract address
    投票合约地址
    */
    function startChange(address contractAddress) public {
        require(address(msg.sender) == address(tx.origin), "It can't be a contract");
        require(_contractData[contractAddress], "It's not a voting contract");
        Nest_3_VoteContract newContract = Nest_3_VoteContract(contractAddress);
        //获得这个地址的智能合约
        require(_stateOfEmergency == newContract.checkStateOfEmergency());
        //检测是不是状态一致
        addSuperManPrivate(address(newContract));
        //使得这个地址获取超级用户权力
        newContract.startChange();
        //运行(但目前没有这个接口文件)
        deleteSuperManPrivate(address(newContract));
        //解除超级用户权限
    }
    /**
    * @dev Check my voting
    查看我的投票
    * @param user Address to check
    参与投票地址
    * @return address Address recently participated in the voting contract address
    是否正在参与投票
    */
    function checkMyVote(address user) public view returns (address) {
        return _myVote[user];
    }

    //  Check the voting time
    //检查投票时间
    function checkLimitTime() public view returns (uint256) {
        return _limitTime;
    }

Nest_3_VoteFactory紧急事件处理

一般出现了严重的问题,比如token出现严重bug,或者有大量的币被盗,才启用。 一般来说,需要守护者节点2/3以上的同意才行。 基本原则就是快速完成映射,然后锁死合约。

    /**
    * @dev Switch emergency state-transfer in NestNode Token
    切换紧急状态-转入NestNode
    * @param amount Amount of NNs to transfer
    转入 NestNode 数量
    */
    function sendNestNodeForStateOfEmergency(uint256 amount) public {
        //单独调用的函数
        require(_NNToken.transferFrom(address(tx.origin), address(this), amount));
        //用户将自己的nn转入到这个合约地址里面
        _emergencyPerson[address(tx.origin)] = _emergencyPerson[address(tx.origin)].add(amount);
        //_emergencyPerson数组里面的该地址的nn增加。
    }

    /**
    * @dev Switch emergency state-transfer out NestNode Token
    切换紧急状态-取出NestNode
    */
    function turnOutNestNodeForStateOfEmergency() public {
        require(_emergencyPerson[address(tx.origin)] > 0);
        require(_NNToken.transfer(address(tx.origin), _emergencyPerson[address(tx.origin)]));
        //检测本地址是否应该有币要转移,然后把nn转移到本地址
        _emergencyPerson[address(tx.origin)] = 0;
        uint256 nestAmount = _nestToken.balanceOf(address(this));
        //检测本地址有多少nest
        require(_nestToken.transfer(address(_destructionAddress), nestAmount));
        //一并销毁
    }

    /**
    * @dev Modify emergency state
    修改紧急状态
    */
    function changeStateOfEmergency() public {
        if (_stateOfEmergency) {
            require(now > _emergencyTime.add(_emergencyTimeLimit));
            //now为当前时间戳
            _stateOfEmergency = false;
            _emergencyTime = 0;
            //如果为紧急状态,看是否结束,结束则赋值为false
        } else {
            require(_emergencyPerson[address(msg.sender)] > 0);
            //本人是否为注册
            require(_NNToken.balanceOf(address(this)) >= _emergencyNNAmount);
            //总量是否达标,
            _stateOfEmergency = true;
            //然后就执行
            _emergencyTime = now;
            //
        }
    }
   //  Check the NestNode raising time
    //查看NestNode筹集时间
    function checkNNLimitTime() public view returns (uint256) {
        return _NNLimitTime;
    }

    //  Check the voting proportion to pass
    //查看通过投票比例
    function checkCirculationProportion() public view returns (uint256) {
        return _circulationProportion;
    }

    //  Check the minimum number of NNs to create a voting contract
    //查看创建投票合约最小 NN 数量
    function checkNNUsedCreate() public view returns (uint256) {
        return _NNUsedCreate;
    }

    //  Check the minimum number of NNs raised to start a vote
    //查看创建投票筹集 NN 最小数量
    function checkNNCreateLimit() public view returns (uint256) {
        return _NNCreateLimit;
    }

    //  Check whether in emergency state
    //查看是否是紧急状态
    function checkStateOfEmergency() public view returns (bool) {
        return _stateOfEmergency;
    }

    //  Check the start time of the emergency state
    //查看紧急状态启动时间
    function checkEmergencyTime() public view returns (uint256) {
        return _emergencyTime;
    }

    //  Check the duration of the emergency state
    //查看紧急状态持续时间
    function checkEmergencyTimeLimit() public view returns (uint256) {
        return _emergencyTimeLimit;
    }

    //  Check the amount of personal pledged NNs
    //查看个人 NN 存储量
    function checkEmergencyPerson(address user) public view returns (uint256) {
        return _emergencyPerson[user];
    }

    //  Check the number of NNs required for the emergency
    // 查看紧急状态需要 NN 数量
    function checkEmergencyNNAmount() public view returns (uint256) {
        return _emergencyNNAmount;
    }

    //  Verify voting contract data
    //验证投票合约
    function checkContractData(address contractAddress) public view returns (bool) {
        return _contractData[contractAddress];
    }

    //  Modify voting time
    //修改投票时间
    function changeLimitTime(uint256 num) public onlyOwner {
        require(num > 0, "Parameter needs to be greater than 0");
        _limitTime = num;
    }

    //  Modify the NestNode raising time
    //修改NestNode筹集时间
    function changeNNLimitTime(uint256 num) public onlyOwner {
        require(num > 0, "Parameter needs to be greater than 0");
        _NNLimitTime = num;
    }

    //  Modify the voting proportion
    //修改通过投票比例
    function changeCirculationProportion(uint256 num) public onlyOwner {
        require(num > 0, "Parameter needs to be greater than 0");
        _circulationProportion = num;
    }

    //  Modify the minimum number of NNs to create a voting contract
    //修改创建投票合约最小 NN 数量
    function changeNNUsedCreate(uint256 num) public onlyOwner {
        _NNUsedCreate = num;
    }

    //  Modify the minimum number of NNs to raised to start a voting
    //修改创建投票筹集 NN 最小数量
    function checkNNCreateLimit(uint256 num) public onlyOwner {
        _NNCreateLimit = num;
    }

    //  Modify the emergency state duration
    //修改紧急状态持续时间
    function changeEmergencyTimeLimit(uint256 num) public onlyOwner {
        require(num > 0);
        _emergencyTimeLimit = num.mul(1 days);
    }

    //  Modify the number of NNs required for emergency state
    //修改紧急状态需要 NN 数量
    function changeEmergencyNNAmount(uint256 num) public onlyOwner {
        require(num > 0);
        _emergencyNNAmount = num;
    }

简单总结

Nest_3_VoteFactory是除了报价部分外最重要的部分,他将token,公投,以及合约映射无缝连接到了一起。 我曾经一度奇怪为什么要这么做,把mapping分开单独不可以吗? 后来大概有点明白开发小组的意思了,他们的目的是将紧急处理部分与mapping合在一起,以免最糟糕的情况发生,就是mapping也被黑客掌握了。 而目前的这种情况的,随着后期将所有权限都转交给投票系统后,整个系统将变得更加的安全。

区块链技术网。

  • 发表于 2021-01-31 12:13
  • 阅读 ( 581 )
  • 学分 ( 12 )
  • 分类:NEST

评论