Cpp-Ethereum
如何將代幣發送到大量地址?
我必須將 221,000 個令牌(ERC20)發送到 6477 個不同的地址。Airdrop 傢伙使用了一些自動發送應用程序,它告訴我們需要 1.94 ETH 作為發送所有這些的大約操作成本。是否有任何應用程序可以在這裡提供幫助並降低成本。1.94 ETH 作為 gas 成本是瘋狂的。
謝謝
不知道您的具體情況的詳細資訊,但這裡有一些技巧可用於在將代幣發送到可能的地址時降低 gas 成本:
- 在一筆交易中進行多次轉賬。這將為您每次傳輸節省大約 21000 氣體。
- 讓接收者支付 gas 費用,例如通過在鏈下為他們簽署支票,這樣他們將在鏈上兌換這些支票。這將使您免費進行轉賬。
- 部署帶有預填充餘額的代幣智能合約,可能已經儲存在鏈上的某個地方。這將花費您每個收件人大約 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
通過刪除變數,您將能夠節省大量氣體(從而降低總體成本) ;但是,請注意,此變數可防止您在每個地址多次分配(檢查該地址的實際餘額對此毫無用處,因為其所有者可以輕鬆地將他/她的代幣從該地址轉移到其他地址)。