以太坊/Solidity 新手:方便地发送多笔交易

Posted

技术标签:

【中文标题】以太坊/Solidity 新手:方便地发送多笔交易【英文标题】:Ethereum/Solidity Newbie: Sending multiple transactions conveniently 【发布时间】:2018-10-26 01:57:44 【问题描述】:

Solidity 新手问题:

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

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

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

我们在专用网络上运行,gas 价格不是一个大问题 我们意识到将整个 CSV 作为单个事务上传是有争议的。为了便于搜索和与非 CSV 数据保持一致,我们宁愿不这样做,其中大部分将作为每行 1 个事务上传。

任何想法表示赞赏

【问题讨论】:

【参考方案1】:

你可以做这样的事情。虽然这种膨胀不是必需的。 您可以简单地为 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);            
        
    

【讨论】:

以上是关于以太坊/Solidity 新手:方便地发送多笔交易的主要内容,如果未能解决你的问题,请参考以下文章

以太坊 solidity pure view 交易执行之后不会生成区块

基于以太坊的智能合约solidity学习日记

发送以太坊交易,Web3.js 没有源地址,但有源私钥?

基于以太坊的开发,教你如何节省手续费

Solidity智能合约开发 — 1-以太坊开发工具和部署

第119篇 笔记-solidity中的ABI