Ethereum / Solidity Newbie: удобная отправка нескольких транзакций - PullRequest
0 голосов
/ 16 мая 2018

Вопрос новичка Solidity:

Мне нужно разрешить пользователям загружать CSV-файлы в токен на основе эфириума (частная сеть).CSV могут включать в себя сотни и, возможно, тысячи строк.В настоящее время пользователь должен одобрить каждую отдельную транзакцию (например, через MetaMask), что означает, что каждая загрузка может потребовать сотен, а иногда и тысяч кликов для подтверждения.

Мы ищем решение, которое позволяет пользователям утверждатьнесколько транзакций одним кликом.Я пытался использовать createBatch / executeBatch, но, по крайней мере, с Metamask, он все еще просит меня одобрить каждую строку независимо.

Итак, каков стандартный способ сделать это?Есть один?Несколько замечаний:

  • Мы работаем в частной сети, цена на газ не представляет большой проблемы
  • Мы понимаем, что есть аргумент для загрузки всего CSV в виде отдельных транзакций.Мы бы предпочли этого не делать, как из-за возможности поиска, так и для согласованности с данными, не относящимися к CSV, большинство из которых будет загружено в виде 1 транзакции на строку.

Любые мысли приветствуются

1 Ответ

0 голосов
/ 22 июля 2018

Вы могли бы сделать что-то вроде этого. Хотя этот раздув не требуется. Вместо того, чтобы хранить их в массиве, вы можете просто вызвать (address) .transfer (value) для каждой строки csv и развернуть умный контракт для отправки эфира. Остерегайтесь использовать только 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);            
        }
    }
}
...