智能合約中的加密簽名 -> 驗證智能合約的身份
簡而言之,我的問題是:
-> 是否可以通過智能合約對某些數據進行數字簽名(例如使用合約的密鑰),從而確認正是這個智能合約簽署了數據?-> 我已經有點知道,它可能不會那樣工作,因為合約的數據和程式碼是完全公開的,因此它不能保密。那麼是否有任何巧妙的鏈上解決方法,或者我是否必須對這個使用鏈下步驟..?
現在有一點背景:
我正在嘗試創建一個 dapp,創建者可以在其中籤署文件並在區塊鏈上添加時間戳,以便任何人都可以驗證文件是否存在於某個時間點。
到目前為止,我的概念是:
- 文件經過雜湊處理,然後由創建者的私鑰(客戶端,鏈下)簽名 -> 從而創建文件的數字簽名
- 然後將簽名發送到智能合約,該合約在簽名上附加時間戳,將兩者一起進行雜湊,然後合約簽署雜湊)(時間戳代表目前區塊的時間)
- 合約儲存了一個映射,其中每一行(每個文件或其版本的一行)都通過文件的雜湊值訪問,指向一個結構體:時間戳、創建者的簽名和合約本身簽名的時間戳。
- 現在任何有權訪問文件、創建者公鑰和合約公鑰的人都可以驗證(使用映射中的簽名雜湊),
a) 文件由創建者簽署
b) 文件帶有時間戳並由智能合約簽名
-> 我最初的目標是完全避免將受信任的第三方包含在流程中(既不是時間戳,也不是簽名)
所以問題似乎是:
-> 由於智能合約不能在鏈上儲存秘密(據我所知),我不能在合約中安全地儲存私鑰,它可以用它來簽署數據
-> 另外,如果我在鏈外的某個地方儲存了一個密鑰,那麼如何授權智能合約訪問它?(因為它沒有可辨識的私鑰)
如果你能幫助我,那真是太棒了!謝謝!
是否可以通過智能合約對某些數據進行數字簽名(例如使用合約的密鑰)
不。合約沒有簽名密鑰,無法啟動操作(它始終以由外部擁有的帳戶簽名的交易開始)並且無法與外部世界互動,除非將事件發送到日誌中。
我正在嘗試創建一個 dapp,創建者可以在其中籤署文件並在區塊鏈上添加時間戳,以便任何人都可以驗證文件是否存在於某個時間點。
這不是特別難…
文件經過雜湊處理,然後由創建者的私鑰(客戶端,鏈下)簽名 -> 從而創建文件的數字簽名
是的
然後將簽名發送到智能合約,該合約將時間戳附加到簽名中,將兩者雜湊在一起
當交易包含在一個塊中時,您將獲得“免費”的時間戳。額外的步驟似乎使情況變得更糟。您希望觀察者能夠(在將來)確認文件,並且不應該要求他們知道該時間戳才能這樣做。只需記錄內容的雜湊即可。
mapping(bytes32 => bool) public exists; function recordExistence(bytes32 docHash) public returns(bool success) { require(!exists[docHash]); exists[docHash] = true; // should emit an event, omitted for brevity }
然後合約簽署雜湊)(時間戳代表目前區塊的時間)
本身沒有契約簽署步驟。如果契約允許,就是這樣。除非契約批准,否則不可能發生任何狀態轉換。
合約儲存了一個映射,其中每一行(每個文件或其版本的一行)都通過文件的雜湊值訪問,指向一個結構體:時間戳、創建者的簽名和合約本身簽名的時間戳。
您可以使用創建者的普通地址,因為創建者將是發送交易的簽名者。我會花時間去解決它,但可能不需要。
struct DocStruct { address creator; uint timestamp; } mapping(bytes32 => DocStruct) public docStructs; function docExists(bytes32 docId) public view returns(bool doesIndeed) { return docStructs[docId].timestamp > 0; } function recordDocCreated(bytes32 docHash) public view returns(bool success) { require(!docExists[docHash]); docStructs[docId].creator = msg.sender; docStructs[docId].timestamp = now; // emit ... return true; }
現在任何有權訪問文件、創建者公鑰和合約公鑰的人都可以驗證(使用映射中的簽名雜湊),
a) 文件由創建者簽署
b) 文件帶有時間戳並由智能合約簽名
是的。
msg.sender
不會說謊,也不會now
。無法覆蓋。我最初的目標是完全避免將受信任的第三方包含在流程中(既不是時間戳,也不是簽名)
所以問題似乎是:
-> 由於智能合約不能在鏈上儲存秘密(據我所知),我不能在合約中安全地儲存私鑰,它可以用它來簽署數據
併攏腳跟,您已經到家了。AFAIK,文件的雜湊值並不是秘密。除了存在之外,它對文件沒有任何用處。你有證據證明創建者在某個時間簽署了一條消息,證明該秘密的知識。
簽名者(創建者)發送的交易被探勘到具有明確時間戳的塊中。當有人檢查
public docStructs
有docHash
問題的時,返回的值是值得信賴的。唯一已知的可行(Alice 沒有時間機器)解釋是創建者在歷史上可證明的點簽署了具有文件知識的交易(併計算了其雜湊)。除非她有文件,否則她不可能猜到那個雜湊值。
這是一種常見的方法。如果您需要對文件中的內容進行更詳細的證明,同時對相鄰資訊保密:https ://medium.com/@robhitchens/selective-disclosure-with-proof-f6a1ac7be978
希望能幫助到你。