Gas

大循環的氣體使用量

  • November 5, 2019

Solidity 中的循環有多貴?(就氣體使用而言)。我需要遍歷〜1000個錢包地址,並向每個人發送一些代幣。

我的程式碼:

struct User {
   uint32 frozenAt ; 
   uint earnedTokens;
   bool isValid;
}

mapping(address => User) users;
address[] public usersAddresses;


uint reciversLength = usersAddresses.length;
for (uint i = 0; i < reciversLength; i++) {
   User storage theUser = users[usersAddresses[i]];

   // transfer(usersAddresses[i], theUser.earnedTokens);
}

我應該擔心天然氣的使用嗎?我能做些什麼來優化這個循環?

也許我應該做幾個映射而不是每個使用者的結構?(我在某處讀到這更有效)

我想知道是否更好的方法是從 node.js 伺服器獲取數據,並使用 tronweb 為每個使用者發送令牌。這樣做值得嗎?

任何幫助,將不勝感激

循環本身並不像將一些令牌發送到多個地址那樣昂貴。

通常,為了將一些代幣發送到某個地址,您需要更新至少兩個儲存槽:發送方餘額和接收方餘額。雖然在同一發送者在一筆交易中進行多次轉賬的情況下更新發送者的餘額可能會得到優化,但如果原始價值為零,接收者的餘額更新將花費 20K 天然氣。

如果您transfer從代幣智能合約本身以外的合約呼叫,該呼叫也將消耗大量gas。

如果有一種方法可以從收款人地址計算轉賬金額,那麼以惰性方式實現轉賬可能會更便宜,因此只有當收款人第一次嘗試使用代幣時,才會將代幣存入收款人地址。

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