智能”或許是科技行業(yè)中被用得最多的一個詞。有些公司認為項目的智能就是在上面安裝一個WiFi適配器,然后制作一個應用程序。但智能的真正含義是什么呢?物聯(lián)網(wǎng)設備意味著什么?我相信,當設備集合在一起,創(chuàng)造出比單個設備的總和大得多的東西時,它們就會變得“智能”。
自從智能鎖問世以來,它已經(jīng)走過了漫長的道路,但在大多數(shù)情況下,智能意味著你可以把手機當作鑰匙使用。最近,我和我的一些朋友聚在一起,重新想象了一下一把簡單的鎖如何才能變得真正智能。我們設計了一個區(qū)塊鏈智能鎖,可以簡化訪客管理。它主要針對企業(yè),該系統(tǒng)解決了兩個主要問題。
1. 缺乏適合企業(yè)規(guī)模經(jīng)營的智能鎖
企業(yè)的智能鎖真的不多。很多企業(yè)需要為具有不同權(quán)限的不同訪問級別的門設置內(nèi)部鎖,最安全的方法是使用生物識別傳感器。但是,許多門上都安裝了生物識別傳感器,這些傳感器必須同步,以便為新員工和訪客工作,這是非常具有挑戰(zhàn)性的。生物識別系統(tǒng)一般將指紋等生物識別信息存儲在設備上,因此很難添加新用戶。在每個設備上使用生物識別傳感器也很昂貴。
但如果這個問題的解決方案就在你的口袋里呢?現(xiàn)在幾乎每一部手機都內(nèi)置了指紋傳感器或其他形式的生物識別認證,開發(fā)者可以通過API訪問它們。這意味著智能手機可以提供一種安全的方式,從生物特征上保證一個人的身份。這個系統(tǒng)是如此的安全,以至于它被用于驗證谷歌Pay和Apple Pay等服務中的移動支付。因此,我們可以簡單地使用智能手機上的生物識別技術來驗證個人的身份,我們可以在一個不需要任何傳感器的鎖里使用生物識別安全技術。應用程序只需要求通過中央服務器打開一扇門。這個系統(tǒng)的美妙之處在于它具有可伸縮的能力,因為用戶權(quán)限可以很容易地從服務器中添加或刪除,而不需要修改實際的鎖。但是當它與訪問者管理相結(jié)合時,這個系統(tǒng)的真正威力就顯現(xiàn)出來了。
2. 訪問者管理
第二個問題是缺乏適合企業(yè)的訪問者管理解決方案。這給訪問者帶來了麻煩,也給公司帶來了高昂的費用,比如為確保訪問者的身份而進行的安全保障。我們對這個問題的解決方案是一個區(qū)塊鏈,它存儲每個人的身份,并由他工作的機構(gòu)進行驗證。例如聯(lián)合利華可以保證員工的身份,或者莫拉圖瓦大學甚至可以保證我是計算機科學與工程系的學生。這使得區(qū)塊鏈可以為用戶創(chuàng)建一張?zhí)摂M名片,該名片由用戶手機中的生物識別技術保護。這不是一個適用于單個組織的網(wǎng)絡,而是一個完整的組織網(wǎng)絡。這樣就可以確定任何訪問者的身份。
這個系統(tǒng)的操作相當簡單。當用戶訪問公司時,他可以通過自己手機上的生物識別傳感器來確認自己的身份,從而在前臺申請進入。接待員將立即保證訪問者的身份。如果客人已經(jīng)被邀請,系統(tǒng)將自動允許他進入。
選擇一個區(qū)塊鏈
我的任務之一是為上述系統(tǒng)創(chuàng)建區(qū)塊鏈。這給了我一個親身體驗區(qū)塊鏈技術的機會,讓我看看炒作到底是怎么回事以及看看技術細節(jié)。
我必須做的第一個決定是選擇使用哪個區(qū)塊鏈平臺。經(jīng)過一番研究,我把選擇范圍縮小到兩個。以太坊和Linux基金會的Hyperledger。兩者之間有很多區(qū)別,但關鍵是以太坊是一個公共區(qū)塊鏈,更適合B2C用例,并且使用工作證明,而Hyperledger是一個私有區(qū)塊鏈,更適合B2B用例。在這一點上,顯然最好的選擇是使用Hyperledger。我不僅對開發(fā)一個簡單的B2B解決方案感興趣,而且對Hyperledger比以太坊更適合保護企業(yè)的隱私和規(guī)模更感興趣。
如果決定使用Hyperledger Composer(這是一個設計區(qū)塊鏈的有用框架)。這里提供了文檔,其中包括一些非常有用的教程。
除了所有需要完成的樣板代碼和設置(在文檔中有很好的解釋)之外,區(qū)塊鏈的開發(fā)實際上只涉及3個腳本,即模型、邏輯和訪問控制。
該模型定義了網(wǎng)絡中的資產(chǎn)以及參與網(wǎng)絡的參與者。例如,如果我們開發(fā)一個用于交易商品的區(qū)塊鏈,那么該商品將被視為一種資產(chǎn)。它們與java對象非常相似,我們可以定義它們的屬性。在這種情況下,參與者將是交易員。我們還必須在模型文件中定義事務。
邏輯就是奇跡發(fā)生的地方。這是設計事務邏輯的地方,可以用它來編寫智能合約。最后,訪問控制腳本定義了區(qū)塊鏈不同用戶的訪問級別。這與SQL中的用戶權(quán)限非常相似。
這些概念可能很簡單,但是將業(yè)務問題(即使是簡單的問題)轉(zhuǎn)換為模型、邏輯和訪問格式并不是那么簡單。經(jīng)過多次策劃,我設計出了一個適合我們訪客管理問題的網(wǎng)絡。
這個網(wǎng)絡只需要兩種類型的資產(chǎn),即密鑰和密鑰鏈。密鑰鏈用于聚合不同的門,以便門可以被分組到訪問級別。每個密鑰鏈都有一個員工列表,這些員工可以訪問稱為密鑰持有者的特定門集。在這里,門類型是一個特殊的用戶定義對象,指定它是辦公室門還是家庭門。
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)絡中的參與者有三種類型,即雇員、人員和所有者。所有者是企業(yè)的管理員,他們可以決定授予員工的訪問級別。一個獨立的人,因為可能存在著一個不屬于任何組織的人(他可能只是一個訪客),一個公司的雇員。一個人被企業(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
}
對于該網(wǎng)絡,只定義了少量的事務,這表示系統(tǒng)必須提供的最基本服務。除了grantAccess和revokeAccess事務,還有一個tempAccess事務,允許員工使用智能合約邏輯臨時訪問自動過期的房間。
transaction TempAccess {
--》 Keychain chain
--》 Employee employee
o DateTime expiry
}
transaction RevokeAccess {
--》 Keychain chain
--》 Employee employee
}
transaction GrantAccess {
--》 Keychain chain
--》 Employee employee
}
現(xiàn)在講講邏輯。實際的代碼相當簡單,創(chuàng)建執(zhí)行上面定義的每一個事務的函數(shù)是一件簡單的事情。例如,在執(zhí)行grantAccess函數(shù)時,將grantAccess事務作為參數(shù)(如上文所定義,grantAccess事務同時具有一個雇員和一個keychain。該交易的目的是讓部分雇員訪問該鑰匙鏈),所有需要做的是把雇員的身份證進入鑰匙鏈名單的關鍵持有人。下面給出了授予和撤消訪問權(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ū)塊鏈設置訪問控制權(quán)限。這可以通過制定規(guī)則來實現(xiàn)。有詳細描述規(guī)則的作用、規(guī)則所適用的參與者、一種操作類型(例如READ或ALL)、一種受規(guī)則約束的資源和一個動作:允許或拒絕。此外,還可以添加一個稱為條件的額外屬性,這是非常有用的。然后我們檢查允許企業(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推入其關鍵客戶列表,從而允許該雇員訪問該門。然而,我們必須確保某個企業(yè)的所有者只能進入屬于自己組織的門,而不是作為區(qū)塊鏈一部分的各個組織的所有門。因此,我們使用條件屬性來檢查密鑰的所有者是否是參與者。
以下是應用于區(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
}
一旦這三個腳本準備好了,我們就可以用幾個控制臺命令將區(qū)塊鏈變成一個REST服務器,我們的區(qū)塊鏈終于啟動了!
訪客者管理的這一概念不一定只適用于辦公室。假設你一個人在家,有一個比薩送貨員在你的門口。有了這項技術,你就可以保證在你向陌生人打開你的大門之前他確實是來自必勝客的!
評論
查看更多