Solidity

在智能合約中儲存大數據的最佳實踐是什麼

  • October 21, 2022

合約儲存是一個 32 字節的鍵和一個 32 字節的值。如果我理解正確,它可以支持儲存 2^32 個字節,即 4GB?

我有一個如下所示的契約程式碼。它使用地圖mapping(address => uint256) balances;來儲存使用者的餘額。我擔心的是:

  • 如果系統中有數百萬使用者,會超過最大儲存限制嗎?因為地圖將有數百萬個鍵,每個使用者的地址一個。
  • 在合約中儲存大量數據是非常昂貴的。發送交易時可能會花費非常高的汽油費。

解決此問題的最佳方法是什麼?

// SPDX-License-Identifier: MIT
// Tells the Solidity compiler to compile only from v0.8.13 to v0.9.0
pragma solidity ^0.8.13;

import "./ConvertLib.sol";

// This is just a simple example of a coin-like contract.
// It is not ERC20 compatible and cannot be expected to talk to other
// coin/token contracts.

contract MetaCoin {
   mapping(address => uint256) balances;

   uint256 transactionCount = 0;

   event Transfer(address indexed _from, address indexed _to, uint256 _value);

   constructor() {
       balances[tx.origin] = 10000;
   }

   function sendCoin(address receiver, uint256 amount)
       public
       returns (bool sufficient)
   {
       if (balances[msg.sender] < amount) return false;
       balances[msg.sender] -= amount;
       balances[receiver] += amount;
       transactionCount++;
       emit Transfer(msg.sender, receiver, amount);
       return true;
   }

   function getBalanceInEth(address addr) public view returns (uint256) {
       return ConvertLib.convert(getBalance(addr), 2);
   }

   function getBalance(address addr) public view returns (uint256) {
       return balances[addr];
   }
}

即使您在任何數據庫中有大量數據,查詢也會花費更長的時間,性能會下降並且整體應用程序延遲會很高。為了克服這一點, sharding使用。分片是指將數據水平劃分,基於行,將每個數據劃分(劃分邏輯可以基於範圍或基於鍵)儲存在不同的分片或機器中。

在智能合約中,您可以實施相同的策略。如果您的使用者數量達到 500,您可以部署一個新合約。(也許您可以根據您的智能合約邏輯將請求代理到較新的合約)

或者,如果您可以以某種方式創建可靠的 oracle 服務來將使用者儲存在鏈外並使用 oracle 服務獲取鏈上的數據

在這裡使用區塊鏈技術儲存大量數據將非常昂貴。我建議您使用集中式數據庫而不是區塊鏈技術。集中式數據庫的事務處理速度快,可以處理大量數據,並且保持每個儲存單元的持久性不需要任何費用。

請參閱:我可以在智能合約中儲存多少數據,成本是多少以及如何實施?

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