Mapping

ETH 區塊鏈讀取可擴展性

  • March 24, 2018

快速前提,我對區塊鍊和 Solidity 非常陌生。

我試圖弄清楚從區塊鏈讀取數據的可擴展性含義。我知道閱讀操作是免費的,但是它們是如何工作的呢?從合約中讀取數據的可擴展性限制是什麼?

假設我想從一些“對象”中查詢資訊(這是正確的術語嗎?)並且我在映射上有一個 getter,請求有關 10/100/1000 個對象的資訊的最佳方法是什麼?

編輯:哦,哇,我被否決了(!)

添加一些範常式式碼:

contract TestContact {
   struct Object {
       uint id;
       uint price;
   }

   mapping (uint => Object) private objects; // this is in the 10/100ks range
   mapping (uint => address) private mapObjectToOwners; // this is in the 10/100ks range

   function getPrice(uint id) public view returns(uint price) {
       Object storage object = objects[id];
       return object.price;
   }
}

我當時想獲得 100 件物品的價格,但不確定最好的方法是什麼。我當然可以多次查詢 getPrice,但似乎非常不可擴展,我不確定最好的方法是什麼。

正如您所說,viewpure閱讀”功能是免費的。這樣做的原因是它們只在你自己的節點中執行,而不是廣播到區塊鏈到其他節點。沒有人真正關心您是否從節點讀取了一些數據,因此無需進一步發送該資訊。

這樣你就不必擔心“負擔”區塊鍊或為後續的讀取操作支付高額的 gas 費用。從理論上講,您可以隨意查詢數據,因為您只是在自己的節點上增加負載。

為了您自己的效率,您可以返回具有一些限制的數據數組(請參閱http://solidity.readthedocs.io/en/develop/frequently-asked-questions.html#can-you-return-an-array-or- a-string-from-a-solidity-function-call了解詳細資訊)。

就您的 DApp 而言,區塊鍊是一個本地數據庫,您可以隨意查詢 - 免費!呼叫您的範例合約函式getPrice()只會導致一些本地函式呼叫和 HTTP 查詢 - 不會以任何方式影響網路。

唯一一次像“cryptokitties”那樣產生影響的情況是,如果您要將所有這些查詢作為交易送出給網路。但不要這樣做,因為 a)它會消耗 gas,b)它會給網路帶來可能只是本地呼叫的交易的負擔。

因此,請確保您了解查詢(就像查詢本地文件或數據庫)和事務(更改廣播到網路的區塊鏈狀態的請求)之間的區別。

為了更直接地回答您的問題,如果觸發 100 次本地查詢對您來說太慢或效率低下,並且您可以選擇這樣做,您可以通過合約設計針對此類事情進行優化。在您的範例中,正如@lauri-peltonen 所指出的那樣,除了在數組中進行批處理之外,我不知道如何加快速度。

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