Solidity

使來自智能合約/事件的數據僅對某些地址/使用者可見

  • July 29, 2018

我有一個需要的案例:

1- 我的數據不對公眾可見。

2- 能夠撤銷我的客戶/使用者從我的智能合約中查看所述數據的權利。

以前有人這樣做過嗎?

我正在考慮加密/解密我的數據客戶端,這樣數據就永遠不會在區塊鏈上清晰可見,而且看起來足夠可靠。(客戶端將持有私鑰)

但是後來我看不到如何阻止我的使用者使用類似的東西觀看該契約的事件

contractInstance.EventName({x: y}, {fromBlock: 0, toBlock: 'latest'});

或者當我想撤銷他們查看它的權利時,直接從他們的本地節點呼叫 getter。

我正在考慮第二次在區塊鏈上重新加密數據,並讓我的合約解密它以獲取某種列表中的地址,但這需要我的合約持有私鑰,這實際上會使一切變得無用。

有沒有其他/更好的解決方案來解決這個問題?

編輯 :

關於我的案例的更多資訊,它是一種系統資料庫。我在區塊鏈上託管數據,我授予具有基本權限的使用者添加/編輯數據的權利(我是契約的所有者,並且有一個可以使用添加/編輯功能的授權使用者列表)。還有,使用者只能編輯自己的數據,但可以看到整個集合,如果訂閱的話。

我希望相同的使用者列表只能讀取數據(基於訂閱的系統),這樣一旦訂閱用完,他們就無法再讀取數據了。

我很難將正確的設計想像為加密數據並將其發送到區塊鏈,同時將私鑰儲存在我的私人分佈式客戶端中很好,但這仍然意味著客戶端擁有永遠解密數據的密鑰. 或者,每次客戶端取消訂閱時,我都必須重新加密整組數據,這是不現實的。

您不能阻止任何有權訪問區塊鏈的人以他們希望的任何方式讀取狀態和執行程式碼。您可以加密數據,但這並不能阻止人們看到它,只是解釋它。

假設你對那些停止訂閱的人能夠訪問他們已經可用的數據感到滿意——這是你根本無法阻止的——有幾種方法可以實現這一點。

一種是使用標準的多收件人公鑰加密:使用隨機生成的密鑰加密每條消息,然後使用應該能夠訪問它的每個使用者的公鑰加密該密鑰。當使用者停止訂閱時,將其從活動密鑰集中刪除。當新使用者訂閱時,將他們添加到集合中,並加密他們應該能夠訪問的任何過去消息的秘密。

稍有變化可能會允許更輕鬆的密鑰管理:每個“時期”使用一個密鑰。每次使用者結束訂閱時,一個紀元就會結束。每當您插入一條消息時,使用目前的 epoch 密鑰對其進行加密(確保也使用 IV,以防止字典和已知明文攻擊)。提供一個密鑰庫,讓使用者可以訪問他們訂閱的每個 epoch 的 epoch 密鑰;鏈下,或通過使用每個允許使用它們的使用者的公鑰加密這些密鑰。

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