Solidity
在智能合約中儲存大數據的最佳實踐是什麼
合約儲存是一個 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 服務獲取鏈上的數據
在這裡使用區塊鏈技術儲存大量數據將非常昂貴。我建議您使用集中式數據庫而不是區塊鏈技術。集中式數據庫的事務處理速度快,可以處理大量數據,並且保持每個儲存單元的持久性不需要任何費用。