Solidity

哪個更快:合約內循環或交易循環?

  • July 1, 2019

我有這個契約:

pragma solidity 0.5;
pragma experimental ABIEncoderV2;
contract TestStruct {

     struct User {
       string name;
       uint256 age;
    }

   mapping (bytes32 => User) users;

   function addManyUsers (User [] memory _users) public {

       for (uint i = 0; i < _users.length; i++) {

          bytes32 hash = keccak256(abi.encode(_users[i].name));
          users[hash] = _users[i];

       }
   }

   function addOneUser (User memory _user) public {

        bytes32 hash = keccak256(abi.encode(_user.name));

          users[hash] = _user;


   }

   function getUser (string memory username) public view returns (User memory) {

       bytes32 hash = keccak256(abi.encode(username));

       return users[hash];
   }
}

假設我們有一個包含 100 個使用者的列表,

在執行方面哪個更快:一個一個插入(使用addOneUser)或一次插入所有一個(使用addManyUsers)?

使用它會更快(更便宜)addManyUsers()

在速度方面,區塊鏈同時處理所有復雜性的交易(每個區塊)。您應該關心的是 gas 成本和發送的交易數量。


在從交易選擇中確定最佳選擇時,您應該考慮這些交易的總 gas 成本。請記住,交易中的每個操作碼都有一定的相關成本。

要考慮的另一件事是交易數量。一般來說,更多的交易會花費更多,因為每筆新的交易都有很大的前期 gas 成本。正因為如此,執行addManyUsers()2-3 次以上的交易會便宜得多(一次完成所有交易可能會導致你達到塊 gas 限制),而不是addOneUser()100 次,因為 100 次交易的交易成本將大於2-3 筆交易。

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