基於區塊鏈的智慧鎖設計與實現

weixin_34208283發表於2018-04-17
6070494-9c71ae1b6db64806.jpg

作者:中成才(幣兜創始人)


一、優勢


基於區塊鏈技術實現的智慧鎖應用,可實現常規廠商難以企及的 高安全性,同時亦不損失 靈活性。該論斷基於以下幾點:


•   服務提供者即區塊鏈;

•   區塊鏈資料的可信性(公開透明、不可篡改);

•   開放協議,開原始碼;

•   使用者不被特定廠商所綁架。


二、基本原理


2.1 功能邏輯劃分


智慧鎖根據功能分為兩部分:

•   門鎖。硬體,內建程式,該程式需要聯網讀取區塊鏈資料,以驗證鑰匙的許可權,從而決定是否開鎖;

•   鑰匙。軟體,區塊鏈錢包應用程式負責其建立、儲存、使用 和 轉讓 等業務操作。 開鎖 操作需要持有者向鎖證明其擁有鎖的控制權,鎖通過訪問區塊鏈上資料來執行驗證。錢包內的鑰匙可以在不同使用者的錢包內進行轉讓流通,即交付給下一個使用者。這可以廣泛應用於共享經濟,如租房、租車等。


2.2 開鎖驗證流程


鎖在區塊鏈上查詢包含有自身ID 標識的那個UTXO,通過驗證UTXO 的控制權以確認是否有鎖的控制權(該UTXO 的控制權即鎖的控制權)。具體過程是:取出控制者的公鑰(或地址),然後向試圖開鎖者傳送一個要求,要求其對自己生成的一個隨機數用私鑰簽名,併發回給自己,如果簽名正確,那麼說明對方持有正確的鑰匙,即驗證通過,可以開鎖。鑰匙可以使用比特幣本身擁有的多重簽名機制,如2/3簽名,表示3把鑰匙有任意2把同時通過驗證(需要配合 不同鑰匙的有效期),即可以開鎖。這特別適合用於 共享經濟。


2.3 應用場景示例


在租房應用場景中,我們可以為鎖配備3把不同的鑰匙,應用2/3簽名,並分別分配給3方各自持有。具體如下:


•   中介公司持有1把鑰匙,開鎖操作單次有效;

•   租戶持有1把鑰匙,開鎖操作單次有效;

•   房東持有1把鑰匙,開鎖操作永久有效(在全部3方持有者沒有任何變更的情況下),即:相當於這把鑰匙一直插在鑰匙孔裡。由於是2/3簽名,再有任一另一把鑰匙插進來,即可開鎖。

這樣以來,租戶和中介公司任意一方都可以使用自己的鑰匙開鎖,但房東不行,他必須再找個人幫他開鎖。


這個設定乍一看似乎不合理,但仔細分析一下:

•   房東是個人行為,通常不受約束,如果其可以隨意開鎖進門,這對租房者不利;

•   中介公司持有的鑰匙在使用時通常比較謹慎,因為其需要維護良好的信用和口碑。因此中介公司不會隨意開鎖去危害租房者的利益,即使有個別極端情況,概率上是比房東更受控的;

•   而租房者是使用者,需要隨時可以開鎖,不應該受到約束。


因此上述設定是合理的。但房東也應該有開門的需求,那麼可以找中介公司和租戶任一方協助開門,這同時保證了其它兩方的知情權;而房東也需要在必要的時候能夠維權,那麼我們也正好相容此需求!在上述設定方案中,房東可以隨時拔下鑰匙(即:通知鎖讓本鑰匙失效),此時租戶和中介公司單方面都無法開鎖,他們必須再找一方協商解決問題。不過房東通常沒有理由這樣做,除非利益受到損害。僅能拔下鑰匙的維權方式設計,也避免了維權過猛而造成的傷害。


在房東拔下鑰匙後,如果仍希望避免租戶和中介公司串通單方面開鎖,可以在鎖程式中給房東的鑰匙設定投票權超過1的權重,這樣租戶和中介的權重之和低於2,仍無法開鎖,必須經過房東的同意並重新插入鑰匙。即:房東拔下鑰匙可以迫使租戶和中介公司積極應對房東的維權要求。


2.4 鑰匙的轉讓交接


這個過程非常簡單,與比特幣的支付操作無異。只不過如果是多簽名的話,也需要多方簽署這筆交易。支付操作完成後,這個攜帶鎖ID 的UTXO 將歸比特幣接收地址的控制者所有,控制者的數量也可以變更,各方的投票權重可以由植入UTXO 內的協議控制。UTXO 控制權的變更意味著鎖的控制權變更,即等同於鑰匙的變更交接:鑰匙進入了新的使用者的錢包。使用者的變更可以僅僅是租戶,也可以是其它任意各方使用者,這取決於(或決定著)UTXO 的收款地址如何構造。


三、技術實現


需要三個參與方的程式/資料互動協作。


3.1 協議化UTXO


需要將鎖的ID 植入到 UTXO,這需要建立協議資料結構並完成一個支付操作,此時該協議化的UTXO 便存在於區塊鏈上了。

例如,這是一個正常的交易(transaction)資料結構:

{

 "hash":"3b06b1e9d70217d5e02644703fe79f54355b0ea05cd535787f5a6c627f1c",

 "ver":1,

 "vin_sz":2,

 "vout_sz":1,

 "lock_time":0,

 "size":404,

 "in":[

    {

     "prev_out":{

      "hash":"022e05bdfa2e148bc1882cb7a81506b8316fee6957b11625126d075a8cf8791b",

       "n":0

     },

     "scriptSig":"304402203c1db72394263dd50070b91bb1da9125c591f15772dfc628f41447dabb7798a10220302dc6e7e8c81e24da9a99d5ac7233b90156a410051a50bb29d55aabbf0ff24d01

        02b8c918bd169a5e669cc149549f822dd5f2c50872eb83172a1c69172277fe378f"

   },

    {

     //另一個輸入,省略…

    }

  ],

 "out":[

    {

     "value":12.51603279

     "scriptPubKey":"OP_DUPOP_HASH16069e02e18b5705a05dd6b283d517716c894b3d42e

         OP_EQUALVERIFY OP_CHECKSIG"

    }

  ]

}

應該在scriptPubKey 欄位位置插入協議資訊。協議內容格式 可初步定義為如下Uri 格式:


lock://id/e10exxxx.../sig/2*3/pubs/62e*73a*84b/addrs/1ac*2bd*2ce/weights/1.2*0.9*0.9/povs/0*1*1


將該Uri + OP_DROP 插入到scriptPubKey欄位值的OP_DUP 前面,即可完成植入。其中:lock是協議的識別標識;id表示鎖的IDsig表示多簽名規則;pubs表示多籤驗證需要使用的公鑰資訊,這裡緊填開頭最短的部分,用於辨識與weights權重設定對應的公鑰;addrs 表示多籤驗證需要使用的公鑰hash 地址資訊(與pubs 二選一,其中的“*”是分隔符,將多個地址或者公鑰分開);weights表示每個公鑰的投票權重;povs表示組合有效期,0為永久有效,1為單次有效。


3.2 門鎖端程式


每個鎖硬體需要能夠在重置時生成 ID(確切地說,是符合高階最小熵分佈的安全隨機數),並能夠在特定操作下(如按住某按鍵)允許查詢該 ID,以備建立協議UTXO 和鑰匙時使用。


需要為鎖安裝程式,該程式需要隨時聯網查詢其ID 對應的 UTXO,進而驗證該UTXO 的控制權以確認是否擁有鑰匙。但需要注意一點:該UTXO 必須與初始化時的UTXO 處於同一條支付流轉鏈上,不可以是任意UTXO,以防惡意破壞。在操作上,應遵循如下邏輯:鎖程式應當儲存初始化時的UTXO 的txid(區塊鏈賬本上記錄的一條交易的 id),若發現該UTXO 已經被支付,則應當查詢支付目的地的UTXO 並更新鎖記憶體儲的txid,而忽略其它任何包含本ID 的UTXO(它們可能是惡意混淆,當然自己也可以故意混淆以防止追蹤)。有txid 的跟蹤,可以 不要求鎖ID 必須唯一。


3.3 使用者端程式


使用者端程式,即:區塊鏈錢包(後文簡稱錢包)。用於鑰匙的 建立、儲存、使用 和 轉讓 等業務操作。其中儲存和轉讓操作與比特幣的支付操作無異。關於建立和使用開鎖操作見後文。


3.4 初始化


門鎖的初始化,即建立一個協議化的 UTXO,同時也是鑰匙的建立過程。分為以下步驟:

1.    獲得物理鎖的控制權。很重要。可防止鎖被非法使用者惡意操作;

2.    重置並生成新的 ID。在特定物理操作的前提下(如長按reset 按鈕);

3.    錢包讀取門鎖 ID。讀取方式可通過 二維碼 或 無須配對的 低功耗藍芽BLE 技術來實現;

4.    錢包根據即將分配鑰匙的各方所提供的公鑰,生成UTXO 的目標地址;

5.    錢包建立協議資料(見3.1節),打包併傳送交易。至此協議化UTXO 已生成;

6.    將該UTXO 的txid 回傳到門鎖端應用程式,儲存以備開鎖驗證使用。


3.5 開鎖步驟


前提假設:鎖完全受控於主人,鎖的 驗證程式 是開源且可信的。這意味著:鎖不會惡意開鎖或不開鎖,不會洩露使用者資料和隱私資訊,也不會有嚴重的 bug 導致執行非預期的邏輯。不過即便如此,我們仍然 不應向鎖提供私鑰,這是底線。下面分兩種情況來描述開鎖操作的具體步驟。


-    單簽名鑰匙。如果協議化UTXO 的收款地址是一個公鑰或公鑰hash,那麼它的鑰匙就是單簽名鑰匙(也可以說這把鎖是單鑰匙孔的鎖),這需要在初始化時與生成的協議保持一致。開鎖步驟如下:


①    使用者發出開鎖申請。可以是按下一個鎖的硬體按鈕;

②    鎖聯網連線區塊鏈節點查詢指定txid(見3.2節)的 UTXO,檢查其內建的協議是否包含自身 ID,並檢查該UTXO 是否已經被花費。若未被花費,進行下一步;否則一直向後追溯到最新沒有被花費的 UTXO,並用其txid覆蓋鎖內之前儲存的txid,然後進行下一步;

③    鎖生成一個隨機數並通過BLE 藍芽廣播一條報文,報文中同時攜帶鎖ID 的前幾位以示區別。該報文可簡單表示如下:

{"id":"d62a9e","random":"34576578901823912"}

④    錢包收到該報文,用控制該UTXO 的私鑰簽名該隨機數,並回復報文(其中sig 表示對隨機數的簽名,pub 表示公鑰):

{"id":"d62a9e","sig":"304402203c1db72394263dd50070b91bb1da9125c591f15772dfc628f41447dabb7798a10220302dc6e7e8c81e24da9a99d5ac7233b90156a410051a50bb29d55aabbf0ff24d01","pub":"02b8c918bd169a5e669cc149549f822dd5f2c50872eb83172a1c69172277fe378f"}

⑤    鎖收到報文,先判斷 pub 是否與UTXO 中的公鑰或公鑰hash匹配,若匹配,則用公鑰解密sig 資料,看結果是否與自己發出去的隨機數random 相等,相等表示驗證通過(即:插入了正確的鑰匙);

⑥    若上一步驗證通過,則驅動馬達執行物理開鎖操作,完成開鎖;否則廣播回覆報文鑰匙不匹配。


-    多簽名鑰匙。協議化UTXO 的收款地址是多個公鑰或公鑰hash。由於多簽名鑰匙的開鎖組合有效期分為單次有效,和永久有效。這裡定義單次有效 為 從該鑰匙請求開鎖到實際物理開鎖的整個時間段內(開鎖即清除狀態)。永久有效 是指 從當前UTXO 產生到被花費的整個時間段內(更新txid 即清除狀態)。開鎖步驟如下:

①    使用者發出開鎖申請。可以是按下一個鎖的硬體按鈕;

②    鎖聯網連線區塊鏈節點查詢指定txid(見3.2節)的 UTXO,檢查其內建的協議是否包含自身 ID,並檢查該UTXO 是否已經被花費。若未被花費,進行下一步;否則一直向後追溯到最新沒有被花費的 UTXO,並用其txid覆蓋鎖內之前儲存的txid,然後進行下一步;

③    鎖生成一個隨機數並通過BLE 藍芽廣播一條報文,報文中同時攜帶鎖ID 的前幾位以示區別。該報文可簡單表示如下:

{"id":"d62a9e","random":"34576578901823912"}

④    錢包收到該報文,用對該UTXO 有一部分控制權 的私鑰簽名該隨機數,並回復報文(其中sig 表示對隨機數的簽名,pub 表示公鑰,script 表示多簽名收款指令碼):

{"id":"d62a9e","sig":"304402203c1db72394263dd50070b91bb1da9125c591f15772dfc628f41447dabb7798a10220302dc6e7e8c81e24da9a99d5ac7233b90156a410051a50bb29d55aabbf0ff24d01","pub":"02b8c918bd169a5e669cc149549f822dd5f2c50872eb83172a1c69172277fe378f","script":"xxxxxxxx"}

⑤    鎖收到報文,先判斷hash(script) 是否與UTXO 中的地址匹配,若匹配,則用公鑰解密sig 資料,看結果是否與自己發出去的隨機數random 相等,相等表示驗證通過(即:插入了正確的鑰匙);

⑥    檢查是否存在永久有效的鑰匙已經保持了狀態;

⑦    根據協議內容,判定當前鑰匙是否為永久有效,是否需要保持狀態;

⑧    累加權重之和,看是否滿足投票最低要求。滿足則表示通過開鎖申請;

⑨    若上一步驗證通過,則驅動馬達執行物理開鎖操作,完成開鎖;否則廣播回覆報文鑰匙不匹配。


四、展望


硬體廠商生產可擴充套件的智慧鎖硬體,軟體開發者釋出開源智慧鎖軟體。使用者可根據自己的喜好選擇兩者進行組裝(相當於把電腦裸機和作業系統分開,使用者根據需求組裝)。這可以打破壟斷,促進軟硬體質量的提升,促進行業的發展。


五、後記


為什麼使用UTXO 而不使用智慧合約?智慧合約的每次呼叫都需要支付 gas,雖然gas 費用極低,但由於每次開鎖都需要去更新資料,會導致智慧合約函式的呼叫頻率很高,日積月累也是一筆不小的費用。本方案採用 UTXO,是因為區塊鏈資料的查詢是免費的。




作者簡介:中成才

完美主義者,物理愛好者,吉他愛好者,程式設計愛好者。精通多種程式語言,prefer 用 Scala 技術棧構建一切,興趣為物聯網、比特幣/區塊鏈領域。現為 dEdge(幣兜) Wallet 創始人。dEdge Wallet 利用安全晶片和 TEE 微作業系統技術,是實現了助記詞透明加密的加密貨幣錢包。


本文為零識原創專家專欄,轉載請聯絡後臺授權。

相關文章