Cpp-Ethereum

如何將代幣發送到大量地址?

  • January 13, 2020

我必須將 221,000 個令牌(ERC20)發送到 6477 個不同的地址。Airdrop 傢伙使用了一些自動發送應用程序,它告訴我們需要 1.94 ETH 作為發送所有這些的大約操作成本。是否有任何應用程序可以在這裡提供幫助並降低成本。1.94 ETH 作為 gas 成本是瘋狂的。

謝謝

不知道您的具體情況的詳細資訊,但這裡有一些技巧可用於在將代幣發送到可能的地址時降低 gas 成本:

  1. 在一筆交易中進行多次轉賬。這將為您每次傳輸節省大約 21000 氣體。
  2. 讓接收者支付 gas 費用,例如通過在鏈下為他們簽署支票,這樣他們將在鏈上兌換這些支票。這將使您免費進行轉賬。
  3. 部署帶有預填充餘額的代幣智能合約,可能已經儲存在鏈上的某個地方。這將花費您每個收件人大約 2000-3000 的 gas。

如果您需要有關其中一些選項的更多詳細資訊,請告訴我。

你需要實現這樣的東西:

pragma solidity 0.4.26;
import './IERC20Token.sol';

contract Airdrop {
   address public owner;
   mapping(address => uint256) public balances;

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

   function transferBatch(IERC20Token _token, address[] _targets, uint256[] _amounts) external {
       require(msg.sender == owner);
       uint256 length = _targets.length;
       require(length == _amounts.length);
       for (uint256 i = 0; i < length; i++) {
           address target = _targets[i];
           uint256 amount = _amounts[i];
           require(balances[target] == 0);
           require(_token.transfer(target, amount));
           balances[target] = amount;
       }
   }
}

然後,您需要部署此合約並將您想要分配的全部金額轉移給它。

最後,您需要確定在單筆交易中要轉移到多少個地址。

每筆交易的地址越多,您的總成本就越低。

但是,您不能超過每筆交易的區塊氣體限制。

此外,為了優化執行速度,您可能希望允許礦工將多個交易壓縮到一個區塊中。因此,例如,如果一筆交易的平均大小略高於區塊氣體限制的 1/2,那麼礦工將無法將多個交易擠入每個區塊;如果一筆交易的平均大小略高於區塊 Gas-limit 的 1/3,那麼礦工將無法在每個區塊中擠入超過兩筆交易;等等。

因此,您需要做一些實驗(例如在 Ganache 上,或者更好 - 出於準確性原因 - 在 Ropsten 上),以便找到最佳批量大小。

從個人經驗來看,每批 100 個地址應該略小於塊氣體限制的 1/3,因此您可能希望將其用作批量大小。


更新:

balances通過刪除變數,您將能夠節省大量氣體(從而降低總體成本) ;但是,請注意,此變數可防止您在每個地址多次分配(檢查該地址的實際餘額對此毫無用處,因為其所有者可以輕鬆地將他/她的代幣從該地址轉移到其他地址)。

引用自:https://ethereum.stackexchange.com/questions/78923