首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我有兴趣创建一个新的令牌,并有几个问题

我有兴趣创建一个新的令牌,并有几个问题
EN

Ethereum用户
提问于 2017-08-02 23:07:20
回答 2查看 408关注 0票数 0

问题是,我如何在智能契约中实现一个可以跟踪所有涉众的特性。我之所以问这个问题,是因为我希望这份合同能支付股息。到目前为止,我能想到的唯一方法是将每个涉众的地址存储在一个动态数组中。唯一让我担心的是,我一直在努力寻找这个问题的答案:一个稳定的动态数组的最大大小或容量是多少?还有,我是在浪费时间吗?有没有更好的方法来解决这个问题?

EN

回答 2

Ethereum用户

回答已采纳

发布于 2017-08-03 09:38:11

在这种情况下,另一种存储地址的方法是在映射中维护地址计数和保存地址。每次在映射中添加新地址时,也要增加计数。

代码语言:javascript
复制
mapping (unit => address) AddressStorage;

当你想把令牌发送到这些地址时,只需像这样迭代到count属性和访问地址-

代码语言:javascript
复制
AddressStorage[count]

这不是一个优化的解决方案,而是另一种存储方法,而不是在动态数组中存储。

希望这能有所帮助。

票数 1
EN

Ethereum用户

发布于 2017-08-03 01:01:05

跟踪涉众

一种方法是利用dApp扫描块链中的块,以查找令牌生成的传输事件。然后,您可以积累一个具有令牌余额的地址列表,然后您可以积累一个令牌持有者列表。它不会在网络中执行,也不会花费任何气体来执行。

如果您想在合同内部执行此操作,则内存开销将非常大。因此,dApp可能是前进的道路。

支付股息

如果意图是以已发行的令牌的形式支付红利,则可以反转逻辑,并要求涉众通过向您公开的方法发出事务来“收集”他们的红利。

您可以以一种保持所有者=>余额映射的方式来实现这一点。在第二个映射中,您可以对已经/尚未收到红利的金额进行分类。此外,每次发放股息时都使用增量标识符,这样他们就可以同时收集过去的股息。

如果您使用这种方法,那么您可以保护任何基于交易的方法为该所有者,甚至可以自动更新帐户持有人派息的时间。

下面是一个实现此方法基础的示例:

代码语言:javascript
复制
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;
    }
}
票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/23574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档