问题是,我如何在智能契约中实现一个可以跟踪所有涉众的特性。我之所以问这个问题,是因为我希望这份合同能支付股息。到目前为止,我能想到的唯一方法是将每个涉众的地址存储在一个动态数组中。唯一让我担心的是,我一直在努力寻找这个问题的答案:一个稳定的动态数组的最大大小或容量是多少?还有,我是在浪费时间吗?有没有更好的方法来解决这个问题?
发布于 2017-08-03 09:38:11
在这种情况下,另一种存储地址的方法是在映射中维护地址计数和保存地址。每次在映射中添加新地址时,也要增加计数。
mapping (unit => address) AddressStorage;当你想把令牌发送到这些地址时,只需像这样迭代到count属性和访问地址-
AddressStorage[count]这不是一个优化的解决方案,而是另一种存储方法,而不是在动态数组中存储。
希望这能有所帮助。
发布于 2017-08-03 01:01:05
一种方法是利用dApp扫描块链中的块,以查找令牌生成的传输事件。然后,您可以积累一个具有令牌余额的地址列表,然后您可以积累一个令牌持有者列表。它不会在网络中执行,也不会花费任何气体来执行。
如果您想在合同内部执行此操作,则内存开销将非常大。因此,dApp可能是前进的道路。
如果意图是以已发行的令牌的形式支付红利,则可以反转逻辑,并要求涉众通过向您公开的方法发出事务来“收集”他们的红利。
您可以以一种保持所有者=>余额映射的方式来实现这一点。在第二个映射中,您可以对已经/尚未收到红利的金额进行分类。此外,每次发放股息时都使用增量标识符,这样他们就可以同时收集过去的股息。
如果您使用这种方法,那么您可以保护任何基于交易的方法为该所有者,甚至可以自动更新帐户持有人派息的时间。
下面是一个实现此方法基础的示例:
pragma solidity ^0.4.0;
contract DividendToken {
address contractOwner = msg.sender;
uint[] dividendsAwarded;
mapping(address => mapping(uint => uint)) balances;
function awardDividends(uint _percent) {
require(msg.sender==contractOwner);
dividendsAwarded.push(_percent);
}
function balanceOf(address _stakeHolder) constant returns(uint balance) {
mapping(uint => uint) stakeHolderBalances = balances[_stakeHolder];
uint balanceToApplyDividend;
uint dividendAward;
for(uint i=0;i<dividendsAwarded.length;i++) {
balanceToApplyDividend += stakeHolderBalances[i];
dividendAward = (balanceToApplyDividend * dividendsAwarded[i]) / 100;
balance += balanceToApplyDividend + dividendAward;
}
balance += stakeHolderBalances[dividendsAwarded.length];
}
function transfer(address _to, uint _amount) returns(bool success) {
collectDividends(msg.sender);
balances[msg.sender][dividendsAwarded.length] -= _amount;
balances[_to][dividendsAwarded.length] += _amount;
return true;
}
function collectDividends(address _stakeHolder) {
mapping(uint => uint) stakeHolderBalances = balances[_stakeHolder];
uint newBalance = balanceOf(_stakeHolder);
for(uint i=0;i<dividendsAwarded.length;i++) {
delete stakeHolderBalances[i];
}
stakeHolderBalances[dividendsAwarded.length] = newBalance;
}
function giveTokens(uint _amount) {
balances[msg.sender][dividendsAwarded.length] = _amount;
}
}https://ethereum.stackexchange.com/questions/23574
复制相似问题