基於區塊鏈的智慧鎖設計與實現
作者:中成才(幣兜創始人)
一、優勢
基於區塊鏈技術實現的智慧鎖應用,可實現常規廠商難以企及的 高安全性,同時亦不損失 靈活性。該論斷基於以下幾點:
• 服務提供者即區塊鏈;
• 區塊鏈資料的可信性(公開透明、不可篡改);
• 開放協議,開原始碼;
• 使用者不被特定廠商所綁架。
二、基本原理
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表示鎖的ID;sig表示多簽名規則;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 微作業系統技術,是實現了助記詞透明加密的加密貨幣錢包。
本文為零識原創專家專欄,轉載請聯絡後臺授權。
相關文章
- 基於區塊鏈的政務平臺設計探索區塊鏈
- 基於區塊鏈的股權交易系統開發設計與實現(元宇宙Web 3.0技術)區塊鏈元宇宙Web
- 基於android的智慧導診的設計與實現Android
- 基於區塊鏈的隱私計算區塊鏈
- 基於區塊鏈的隱私計算 - 原理和實踐區塊鏈
- 基於區塊鏈的金融借貸交易平臺開發流程與實現區塊鏈
- 區塊鏈3.0,人工智慧與區塊鏈的完美融合區塊鏈人工智慧
- Python實現一條基於POS演算法的區塊鏈Python演算法區塊鏈
- 基於Fisco-Bcos的區塊鏈智慧合約-簡單案例實踐區塊鏈
- 基於 LLM 的智慧運維 Agent 系統設計與實現運維
- 基於區塊鏈技術的FDF智慧合約迴圈互助遊戲開發實現區塊鏈遊戲開發
- JavaScript實現區塊鏈JavaScript區塊鏈
- 量子計算與區塊鏈碰撞後——量子區塊鏈區塊鏈
- 【區塊鏈】實戰·以太坊智慧合約程式設計引導區塊鏈程式設計
- 區塊鏈畢設原始碼開題論文-基於區塊鏈的餐廳管理系統區塊鏈原始碼
- 區塊鏈溯源-基於區塊鏈技術-全程追溯防偽區塊鏈
- 區塊鏈-NFT 的實現原理區塊鏈
- 區塊鏈安全:基於區塊鏈網路攻擊的方式原理詳解區塊鏈
- 分散式鎖與實現(一)基於Redis實現!分散式Redis
- 雲+區塊鏈 實現區塊鏈技術的普惠應用區塊鏈
- 比特幣和區塊鏈(2):比特幣中區塊鏈的實現比特幣區塊鏈
- ReentrantLock基於AQS的公平鎖和非公平鎖的實現區別ReentrantLockAQS
- 區塊鏈程式設計(二)區塊鏈程式設計
- 區塊鏈架構設計區塊鏈架構
- 200行golang 實現的區塊鏈Golang區塊鏈
- ATourofEthereum——區塊鏈與智慧合約之旅區塊鏈
- 架構設計、區塊鏈、人工智慧、大資料架構區塊鏈人工智慧大資料
- 【區塊鏈】前沿分享-基於區塊鏈技術的機器學習行業概述區塊鏈機器學習行業
- 區塊鏈: 暴富的捷徑與程式設計師的舞臺區塊鏈程式設計師
- 【乾貨】區塊鏈技術生態的設計|《白話區塊鏈》作者蔣勇分享實錄區塊鏈
- 基於Android的失物招領APP的設計與實現AndroidAPP
- .Net Core實現區塊鏈初探區塊鏈
- NodeJS實現簡易區塊鏈NodeJS區塊鏈
- 使用Javascript實現小型區塊鏈JavaScript區塊鏈
- 基於區塊鏈究竟可以做什麼?區塊鏈
- 基於SpringBoot AOP面向切面程式設計實現Redis分散式鎖Spring Boot程式設計Redis分散式
- 解鎖區塊鏈的創業密碼區塊鏈創業密碼
- 基於Android的音樂播放器的設計與實現Android播放器