Contract-Design

智能合約中的加密簽名 -> 驗證智能合約的身份

  • January 12, 2019

簡而言之,我的問題是:

-> 是否可以通過智能合約對某些數據進行數字簽名(例如使用合約的密鑰),從而確認正是這個智能合約簽署了數據?-> 我已經有點知道,它可能不會那樣工作,因為合約的數據和程式碼是完全公開的,因此它不能保密。那麼是否有任何巧妙的鏈上解決方法,或者我是否必須對這個使用鏈下步驟..?

現在有一點背景:

我正在嘗試創建一個 dapp,創建者可以在其中籤署文件並在區塊鏈上添加時間戳,以便任何人都可以驗證文件是否存在於某個時間點。

到目前為止,我的概念是:

  1. 文件經過雜湊處理,然後由創建者的私鑰(客戶端,鏈下)簽名 -> 從而創建文件的數字簽名
  2. 然後將簽名發送到智能合約,該合約在簽名上附加時間戳,將兩者一起進行雜湊,然後合約簽署雜湊)(時間戳代表目前區塊的時間)
  3. 合約儲存了一個映射,其中每一行(每個文件或其版本的一行)都通過文件的雜湊值訪問,指向一個結構體:時間戳、創建者的簽名和合約本身簽名的時間戳。
  4. 現在任何有權訪問文件、創建者公鑰和合約公鑰的人都可以驗證(使用映射中的簽名雜湊),

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 docStructsdocHash問題的時,返回的值是值得信賴的。

唯一已知的可行(Alice 沒有時間機器)解釋是創建者在歷史上可證明的點簽署了具有文件知識的交易(併計算了其雜湊)。除非她有文件,否則她不可能猜到那個雜湊值。

這是一種常見的方法。如果您需要對文件中的內容進行更詳細的證明,同時對相鄰資訊保密:https ://medium.com/@robhitchens/selective-disclosure-with-proof-f6a1ac7be978

希望能幫助到你。

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