區(qū)塊鏈如何重塑智能鎖的未來
智能”或許是科技行業(yè)中被用得最多的一個(gè)詞。有些公司認(rèn)為項(xiàng)目的智能就是在上面安裝一個(gè)WiFi適配器,然后制作一個(gè)應(yīng)用程序。但智能的真正含義是什么呢?物聯(lián)網(wǎng)設(shè)備意味著什么?我相信,當(dāng)設(shè)備集合在一起,創(chuàng)造出比單個(gè)設(shè)備的總和大得多的東西時(shí),它們就會(huì)變得“智能”。
自從智能鎖問世以來,它已經(jīng)走過了漫長(zhǎng)的道路,但在大多數(shù)情況下,智能意味著你可以把手機(jī)當(dāng)作鑰匙使用。最近,我和我的一些朋友聚在一起,重新想象了一下一把簡(jiǎn)單的鎖如何才能變得真正智能。我們?cè)O(shè)計(jì)了一個(gè)區(qū)塊鏈智能鎖,可以簡(jiǎn)化訪客管理。它主要針對(duì)企業(yè),該系統(tǒng)解決了兩個(gè)主要問題。
1. 缺乏適合企業(yè)規(guī)模經(jīng)營(yíng)的智能鎖
企業(yè)的智能鎖真的不多。很多企業(yè)需要為具有不同權(quán)限的不同訪問級(jí)別的門設(shè)置內(nèi)部鎖,最安全的方法是使用生物識(shí)別傳感器。但是,許多門上都安裝了生物識(shí)別傳感器,這些傳感器必須同步,以便為新員工和訪客工作,這是非常具有挑戰(zhàn)性的。生物識(shí)別系統(tǒng)一般將指紋等生物識(shí)別信息存儲(chǔ)在設(shè)備上,因此很難添加新用戶。在每個(gè)設(shè)備上使用生物識(shí)別傳感器也很昂貴。
但如果這個(gè)問題的解決方案就在你的口袋里呢?現(xiàn)在幾乎每一部手機(jī)都內(nèi)置了指紋傳感器或其他形式的生物識(shí)別認(rèn)證,開發(fā)者可以通過API訪問它們。這意味著智能手機(jī)可以提供一種安全的方式,從生物特征上保證一個(gè)人的身份。這個(gè)系統(tǒng)是如此的安全,以至于它被用于驗(yàn)證谷歌Pay和Apple Pay等服務(wù)中的移動(dòng)支付。因此,我們可以簡(jiǎn)單地使用智能手機(jī)上的生物識(shí)別技術(shù)來驗(yàn)證個(gè)人的身份,我們可以在一個(gè)不需要任何傳感器的鎖里使用生物識(shí)別安全技術(shù)。應(yīng)用程序只需要求通過中央服務(wù)器打開一扇門。這個(gè)系統(tǒng)的美妙之處在于它具有可伸縮的能力,因?yàn)橛脩魴?quán)限可以很容易地從服務(wù)器中添加或刪除,而不需要修改實(shí)際的鎖。但是當(dāng)它與訪問者管理相結(jié)合時(shí),這個(gè)系統(tǒng)的真正威力就顯現(xiàn)出來了。
2. 訪問者管理
第二個(gè)問題是缺乏適合企業(yè)的訪問者管理解決方案。這給訪問者帶來了麻煩,也給公司帶來了高昂的費(fèi)用,比如為確保訪問者的身份而進(jìn)行的安全保障。我們對(duì)這個(gè)問題的解決方案是一個(gè)區(qū)塊鏈,它存儲(chǔ)每個(gè)人的身份,并由他工作的機(jī)構(gòu)進(jìn)行驗(yàn)證。例如聯(lián)合利華可以保證員工的身份,或者莫拉圖瓦大學(xué)甚至可以保證我是計(jì)算機(jī)科學(xué)與工程系的學(xué)生。這使得區(qū)塊鏈可以為用戶創(chuàng)建一張?zhí)摂M名片,該名片由用戶手機(jī)中的生物識(shí)別技術(shù)保護(hù)。這不是一個(gè)適用于單個(gè)組織的網(wǎng)絡(luò),而是一個(gè)完整的組織網(wǎng)絡(luò)。這樣就可以確定任何訪問者的身份。
這個(gè)系統(tǒng)的操作相當(dāng)簡(jiǎn)單。當(dāng)用戶訪問公司時(shí),他可以通過自己手機(jī)上的生物識(shí)別傳感器來確認(rèn)自己的身份,從而在前臺(tái)申請(qǐng)進(jìn)入。接待員將立即保證訪問者的身份。如果客人已經(jīng)被邀請(qǐng),系統(tǒng)將自動(dòng)允許他進(jìn)入。
選擇一個(gè)區(qū)塊鏈
我的任務(wù)之一是為上述系統(tǒng)創(chuàng)建區(qū)塊鏈。這給了我一個(gè)親身體驗(yàn)區(qū)塊鏈技術(shù)的機(jī)會(huì),讓我看看炒作到底是怎么回事以及看看技術(shù)細(xì)節(jié)。
我必須做的第一個(gè)決定是選擇使用哪個(gè)區(qū)塊鏈平臺(tái)。經(jīng)過一番研究,我把選擇范圍縮小到兩個(gè)。以太坊和Linux基金會(huì)的Hyperledger。兩者之間有很多區(qū)別,但關(guān)鍵是以太坊是一個(gè)公共區(qū)塊鏈,更適合B2C用例,并且使用工作證明,而Hyperledger是一個(gè)私有區(qū)塊鏈,更適合B2B用例。在這一點(diǎn)上,顯然最好的選擇是使用Hyperledger。我不僅對(duì)開發(fā)一個(gè)簡(jiǎn)單的B2B解決方案感興趣,而且對(duì)Hyperledger比以太坊更適合保護(hù)企業(yè)的隱私和規(guī)模更感興趣。
如果決定使用Hyperledger Composer(這是一個(gè)設(shè)計(jì)區(qū)塊鏈的有用框架)。這里提供了文檔,其中包括一些非常有用的教程。
除了所有需要完成的樣板代碼和設(shè)置(在文檔中有很好的解釋)之外,區(qū)塊鏈的開發(fā)實(shí)際上只涉及3個(gè)腳本,即模型、邏輯和訪問控制。
該模型定義了網(wǎng)絡(luò)中的資產(chǎn)以及參與網(wǎng)絡(luò)的參與者。例如,如果我們開發(fā)一個(gè)用于交易商品的區(qū)塊鏈,那么該商品將被視為一種資產(chǎn)。它們與java對(duì)象非常相似,我們可以定義它們的屬性。在這種情況下,參與者將是交易員。我們還必須在模型文件中定義事務(wù)。
邏輯就是奇跡發(fā)生的地方。這是設(shè)計(jì)事務(wù)邏輯的地方,可以用它來編寫智能合約。最后,訪問控制腳本定義了區(qū)塊鏈不同用戶的訪問級(jí)別。這與SQL中的用戶權(quán)限非常相似。
這些概念可能很簡(jiǎn)單,但是將業(yè)務(wù)問題(即使是簡(jiǎn)單的問題)轉(zhuǎn)換為模型、邏輯和訪問格式并不是那么簡(jiǎn)單。經(jīng)過多次策劃,我設(shè)計(jì)出了一個(gè)適合我們?cè)L客管理問題的網(wǎng)絡(luò)。
這個(gè)網(wǎng)絡(luò)只需要兩種類型的資產(chǎn),即密鑰和密鑰鏈。密鑰鏈用于聚合不同的門,以便門可以被分組到訪問級(jí)別。每個(gè)密鑰鏈都有一個(gè)員工列表,這些員工可以訪問稱為密鑰持有者的特定門集。在這里,門類型是一個(gè)特殊的用戶定義對(duì)象,指定它是辦公室門還是家庭門。
asset Keychain identified by keychainId{
o String keychainId
--》 Owner owner
o DoorType type
--》 Employee[] keyholders }
asset Door idenTIfied by doorId {
o String doorId
o String password
--》Keychain chain }
網(wǎng)絡(luò)中的參與者有三種類型,即雇員、人員和所有者。所有者是企業(yè)的管理員,他們可以決定授予員工的訪問級(jí)別。一個(gè)獨(dú)立的人,因?yàn)榭赡艽嬖谥粋€(gè)不屬于任何組織的人(他可能只是一個(gè)訪客),一個(gè)公司的雇員。一個(gè)人被企業(yè)的所有者授予的雇員。
parTIcipant Owner idenTIfied by ownerId {
o String ownerId
o String name
}
parTIcipant Employee identified by employeeId {
o String employeeId
--》 Owner company
--》 Person employee
o String post
}
participant Person identified by id {
o String id
o String name
}
對(duì)于該網(wǎng)絡(luò),只定義了少量的事務(wù),這表示系統(tǒng)必須提供的最基本服務(wù)。除了grantAccess和revokeAccess事務(wù),還有一個(gè)tempAccess事務(wù),允許員工使用智能合約邏輯臨時(shí)訪問自動(dòng)過期的房間。
transaction TempAccess {
--》 Keychain chain
--》 Employee employee
o DateTime expiry
}
transaction RevokeAccess {
--》 Keychain chain
--》 Employee employee
}
transaction GrantAccess {
--》 Keychain chain
--》 Employee employee
}
現(xiàn)在講講邏輯。實(shí)際的代碼相當(dāng)簡(jiǎn)單,創(chuàng)建執(zhí)行上面定義的每一個(gè)事務(wù)的函數(shù)是一件簡(jiǎn)單的事情。例如,在執(zhí)行g(shù)rantAccess函數(shù)時(shí),將grantAccess事務(wù)作為參數(shù)(如上文所定義,grantAccess事務(wù)同時(shí)具有一個(gè)雇員和一個(gè)keychain。該交易的目的是讓部分雇員訪問該鑰匙鏈),所有需要做的是把雇員的身份證進(jìn)入鑰匙鏈名單的關(guān)鍵持有人。下面給出了授予和撤消訪問權(quán)限的代碼。
* Revoke access from a person
* @param {org.example.mynetwork.RevokeAccess} rAccess- the trade to be processed
* @transaction
*/
function revokeAccess (rAccess) {
index =-1;
count =0;
console.log(rAccess.chain.keyholders[0].employeeId)
for (i in rAccess.chain.keyholders){
if (rAccess.chain.keyholders[count].employeeId == rAccess.employee.employeeId){
index = count;
}
count+=1;
}
var NS = “org.example.mynetwork”;
keyholderArray = rAccess.chain.keyholders;
if (index 》 -1){
keyholderArray.splice(index, 1);
rAccess.chain.keyholders = keyholderArray;
}
return getAssetRegistry(NS + ‘.Keychain’)
.then(function(keychainRegistry){
return keychainRegistry.update(rAccess.chain);
})
}
/**
* grant access to a person
* @param {org.example.mynetwork.GrantAccess} gAccess- the trade to be processed
* @transaction
*/
function grantAccess (gAccess) {
var NS = “org.example.mynetwork”;
gAccess.chain.keyholders.push(gAccess.employee);
return getAssetRegistry(NS + ‘.Keychain’)
.then(function(keychainRegistry){
return keychainRegistry.update(gAccess.chain);
})
}
最后,我們需要為區(qū)塊鏈設(shè)置訪問控制權(quán)限。這可以通過制定規(guī)則來實(shí)現(xiàn)。有詳細(xì)描述規(guī)則的作用、規(guī)則所適用的參與者、一種操作類型(例如READ或ALL)、一種受規(guī)則約束的資源和一個(gè)動(dòng)作:允許或拒絕。此外,還可以添加一個(gè)稱為條件的額外屬性,這是非常有用的。然后我們檢查允許企業(yè)所有者將屬于該企業(yè)的門授予某些員工的權(quán)限的規(guī)則。
rule OwnerGrantAccess {
description: “Allow a business owner to grant access to an employee or visitor, to a keychain in his own business, as well as create and delete keychains”
participant(p):“org.example.mynetwork.Owner”
operation: ALL
resource(k): “org.example.mynetwork.Keychain”
condition: (k.owner.getIdentifier()==p.getIdentifier())
action: ALLOW
}
在這里,所有者有能力修改屬于其企業(yè)的密鑰鏈,以便將新雇員的ID推入其關(guān)鍵客戶列表,從而允許該雇員訪問該門。然而,我們必須確保某個(gè)企業(yè)的所有者只能進(jìn)入屬于自己組織的門,而不是作為區(qū)塊鏈一部分的各個(gè)組織的所有門。因此,我們使用條件屬性來檢查密鑰的所有者是否是參與者。
以下是應(yīng)用于區(qū)塊鏈的其他一些規(guī)則。
rule OwnerManageDoor {
description: “Allow an owner to create and manage a new door which belongs to his keychain”
participant(p): “org.example.mynetwork.Owner”
operation: ALL
resource (d): “org.example.mynetwork.Door”
condition: (d.chain.owner.getIdentifier()==p.getIdentifier())
action: ALLOW
}
rule OwnerManageEmployee {
description: “Allow the owner to create and manage an employee”
participant(p): “org.example.mynetwork.Owner”
operation: ALL
resource(e): “org.example.mynetwork.Employee”
condition: (e.company.getIdentifier()==p.getIdentifier())
action: ALLOW
}
一旦這三個(gè)腳本準(zhǔn)備好了,我們就可以用幾個(gè)控制臺(tái)命令將區(qū)塊鏈變成一個(gè)REST服務(wù)器,我們的區(qū)塊鏈終于啟動(dòng)了!
訪客者管理的這一概念不一定只適用于辦公室。假設(shè)你一個(gè)人在家,有一個(gè)比薩送貨員在你的門口。有了這項(xiàng)技術(shù),你就可以保證在你向陌生人打開你的大門之前他確實(shí)是來自必勝客的!