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