Storage

從合約儲存中讀取和解釋資訊

  • April 23, 2017

我知道乙太坊區塊鏈上的合約儲存沒有以任何方式加密或私有。區塊鏈上的所有數據都是公開可見的。甚至聲明為的變數的值private也可以通過與區塊鏈同步並讀取合約儲存來獲知。我的問題是——在不知道資料結構(即數據是如何組織的)的情況下,讀取合約的儲存數據並從中提取一些資訊有多簡單或複雜?

例如,在下面的部分程式碼中,(只是組成了一些任意資料結構),假設有一個內部函式確定是否允許特定 msg.sender 訪問數據:

contract DataStore {

   struct Datum {
       uint8   id;
       bytes32 serialNum;
       string  name;
       uint256 createdAt;
   }

   mapping (address => Datum) private entityData; 

   function getName(address entity) public constant returns (string) {
       if (isAllowed(msg.sender) {
           return name;
       }
       else {
           return "";
       }
   } 
   ...
   ...

即使他們不知道合約的內部資料結構是什麼,其帳戶無權根據isAllowed函式訪問數據的人是否能夠提取特定地址映射到的名稱?如果是這樣,那該怎麼做?換句話說,僅僅通過查看合約的儲存字節,可以獲取哪些資訊以及如何獲取?

我只是想知道這有多複雜。我知道“默默無聞的安全”不是一個好主意,所以我不打算在我的程式碼中依賴它。只是好奇。

可以使用諸如 RPC 介面之類的東西直接針對節點來檢索(鏈下)狀態,但在我看來,簡單地獲取設置數據值的事務更容易(假設它是以明文形式發送的)。您的範例中缺少的功能是

function setName(...)

我認為首先必須存在該功能才能使數據進入契約。

就像在http://etherscan.io上查看智能合約上的交易一樣,“setter”交易很容易看到。如果您以明文形式發送數據,將很容易檢索。

如果您以某種加密方式將數據發送到合約中,那麼“窺探者”不僅無法在交易中看到它,而且在狀態中也看不到它。

回答您的直接問題:是的——您可以通過 RPC 獲取狀態數據,但比這更容易。

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