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();
处于某些特定的环境下,可以看到评论框,欢迎留言交流^_^。