DAO,是基于区块链核心思想理念(由达成同一个共识的群体自发产生的共创、共建、共治、共享的协同行为)衍生出来的一种组织形态。是区块链解决了人与人之间的信任问题之后的附属产物。DAO具有充分开放、自主交互、去中心化控制、复杂多样以及涌现等特点。
故事结束
一旦达到故事的时间或章节限制,就应该结束故事了。任何人都可以在允许提取股息的日期之后调用结束函数。首先,我们需要一个新的StoryDAO属性和一个事件:
bool public active = true;
event StoryEnded();
然后,构建函数:
function endStory() storyActive external {
withdrawToOwner();
active = false;
emit StoryEnded();
}
简单:它将收集的费用发送给所有者并发出事件后停用故事。但实际上,这并没有真正改变整个DAO中的任何内容:其他功能对它的结束没有反应。那么构建另一个修饰符:
modifier storyActive() {
require(active == true);
_;
}
然后,将此修饰符添加到除withdrawToOwner之外的所有函数中,如下所示:
function whitelistAddress(address _add) storyActive public payable {
如果DAO中遗留了任何代币,将它们取回并接管这些代币的所有权,以便以后能够在另一个故事中使用它们:
function withdrawLeftoverTokens() external onlyOwner {
require(active == false);
token.transfer(msg.sender, token.balanceOf(address(this)));
token.transferOwnership(msg.sender);
}
function unlockMyTokens() external {
require(active == false);
require(token.getLockedAmount(msg.sender) > 0);
token.decreaseLockedAmount(msg.sender, token.getLockedAmount(msg.sender));
}
unlockMyTokens函数用于解锁所有锁定的代币,以防某些锁定代币为特定用户锁定。它不应该发生,并且应该通过大量测试来移除此功能。
股息分配和提款
现在故事已经结束,收集的费用需要分配给所有代币持有者。可以重新使用我们的白名单来标记所有取消费用的人:
function withdrawDividend() memberOnly external {
require(active == false);
uint256 owed = address(this).balance.div(whitelistedNumber);
msg.sender.transfer(owed);
whitelist[msg.sender] = false;
whitelistedNumber--;
}
如果这些股息未在一定时限内撤回,可以抓住其余股息:
function withdrawEverythingPostDeadline() external onlyOwner {
require(active == false);
require(now > deadline + 14 days);
owner.transfer(address(this).balance);
}
部署问题
鉴于合约现在非常大,部署和/或测试它可能会超过以太坊区块的gas限制。这是限制大型应用程序部署在以太坊网络上的原因。无论如何要部署它,在编译期间尝试使用代码优化器,方法是更改truffle.js文件以包含用于优化的solc设置,如下所示:
// ...
module.exports = {
solc: {
optimizer: {
enabled: true,
runs: 200
}
},
networks: {
development: {
// ...
这将在代码中运行优化器200次以查找在部署之前可以缩小,移除或抽象的区域,这将显着降低部署成本。