Bounty

原文:http://zeppelin-solidity.readthedocs.io/en/latest/bounty.html

这个例子结合了Truffle框架,如果你不知道如何集成,可以先看看,还挺方便的:http://me.tryblockchain.org/obust-smart-contracts-with-openzeppelin.html

要为你的合约创建一个赏金项目。需要继承父类Bounty,提供一个deployContract(),来返回新的合约地址即可:

import {Bounty, Target} from "./zeppelin/Bounty.sol";
import "./YourContract.sol";

contract YourBounty is Bounty {
    function deployContract() internal returns(address) {
        return new YourContract()
      }
}

接下来,实现你的不应该在任何情况下发生变化的逻辑。你的主合约应该继承自Target,并且实现对某些不应该在任何情况下发生变化的情况的检查。这个函数要实现的就是检查某些假设,某些在任何时候都应该是true的假设。如果这些函数返回false,那么这说明你的合约有可能被攻破了,当前处于不稳定的状态。这正是安全专家为得到赏金而尝试做的。

import {Bounty, Target} from "./zeppelin/Bounty.sol";
contract YourContract is Target {
  function checkInvariant() returns(bool) {
    // Implement your logic to make sure that none of the invariants are broken.
  }
}

然后,部署你的主合约与赏金合约。通过修改migrations/2_deploy_contracts.js

module.exports = function(deployer) {
  deployer.deploy(YourContract);
  deployer.deploy(YourBounty);
};

向你们的赏金合约中增加奖励。是在合约部署后,向你的赏金合约中发送奖励基金。

可以使用truffle console

bounty = YourBounty.deployed();
address = 0xb9f68f96cde3b895cc9f6b14b856081b41cb96f1; // your account address
reward = 5; // reward to pay to a researcher who breaks your contract

web3.eth.sendTransaction({
  from: address,
  to: bounty.address,
  value: web3.toWei(reward, "ether")
})

如果有研究人员攻破了合约,他们可以申明赏金。

对于哪些想hack这些合约获得赏金的,可以查看这里了解更多。

最后,如果你的合约没有问题,没有任何人攻破,你可以回收你的赏金。要结束赏金项目,你可以销毁合约,这样所有赏金将退回给所有者:

bounty.destroy();