以太坊/ Solidity Newbie:方便地发送多个交易

时间:2018-05-16 06:17:42

标签: ethereum solidity web3

Solidity newbie question:

我需要允许用户将CSV上传到基于以太网的(私有网络)令牌。 CSV可能包含数百行甚至数千行。目前,用户必须批准每个单独的交易(例如:通过MetaMask),这意味着每次上传都需要数百个&偶尔会有数千次批准点击。

我们正在寻求实施一种解决方案,允许用户只需点击一下即可批准多笔交易。我尝试过使用createBatch / executeBatch,但至少在Metamask中,它仍然要求我独立批准每一行。

那么,标准的解决方法是什么?有吗?几点说明:

  • 我们在私人网络上运行,汽油价格并不是一个巨大的问题
  • 我们意识到将整个CSV上传为单个交易存在争议。我们宁愿不这样做,为了可搜索性和与非CSV数据的一致性,其中大部分将被上传为每行1个事务。

赞赏任何想法

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作。虽然不需要肿。 无需将它们存储在数组中,您只需为csv的每一行调用(address).transfer(value)并部署一个智能合约即可发送以太币。 当心在一次调用中仅使用100次传输,否则您可能会遇到blockgaslimit。

pragma solidity ^0.4.24;


contract SendBCF {
    address public owner;

    struct OldToken {
        uint256 value;
        address member;
    }

    event FundsReceived(uint256 amount);

    event PaymentSent(address addr, uint256 amount);

    OldToken[] public oldTokenList;

    constructor() public {
        owner = msg.sender;
    }

    function () public payable onlyOwner {
        /* Determine how much to pay each shareholder. */
        emit FundsReceived(msg.value);
    }

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    function send2() public {
        oldTokenList.push(OldToken({ value:120000000000000000, member:0x6Dc44076Ee3E3fAdC3DF35fF047eA5E5D59B2Caa}));
        oldTokenList.push(OldToken({ value:120000000000000000, member:0x4a3e34cE7E79c47638c9053A776127271a1fFfe9}));
        oldTokenList.push(OldToken({ value:120000000000000000, member:0xeE088601eA16C61974dD737Ca742342D6D8a3271}));
        oldTokenList.push(OldToken({ value:120000000000000000, member:0xDf1D8265EA5E858322e1fd1b67f2D4AC63A31FC3}));
        oldTokenList.push(OldToken({ value:120000000000000000, member:0xa9DE9B27958bd66259368376FCca53fe2A12dd9D}));
    }

    function kill() public onlyOwner {
        require(msg.sender == owner);
        selfdestruct(owner);
    }

    function sendPayment() public {
        for (uint256 i = 0; i < oldTokenList.length; i++) {
            oldTokenList[i].member.transfer(oldTokenList[i].value);
            emit PaymentSent(oldTokenList[i].member, oldTokenList[i].value);            
        }
    }
}