Storage
從合約儲存中讀取和解釋資訊
我知道乙太坊區塊鏈上的合約儲存沒有以任何方式加密或私有。區塊鏈上的所有數據都是公開可見的。甚至聲明為的變數的值
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 獲取狀態數據,但比這更容易。