以太坊版本1.8.4開始,增加了獨立簽名人Clef功能,該功能目前尚處在alpha階段。它主要實現了簽署交易、簽署數據和管理賬戶。它的README中是這樣描述的:
Clef可以用來簽署交易和數據,并且可以代替geth的賬戶管理。
這使DApps不依賴于geth的賬戶管理。 當DApp想要簽署數據時,它可以將數據發送給簽名者,然后簽名者將向用戶提供上下文并要求用戶簽署數據。 如果用戶授予簽名請求,簽名者將簽名發送回DApp。
此設置允許DApp連接到遠程以太坊節點并發送本地簽名的事務。 這可以在DApp連接到遠程節點的情況下提供幫助,因為本地以太坊節點不可用,不與同步鏈或沒有內置(或有限)帳戶管理的特定以太坊節點同步。
Clef可以在同一臺機器上作為守護進程運行,也可以在usb-stick(如usb armory)中運行,或者在QubesOS類型的os設置中運行單獨的虛擬機。
乍聽起來好像沒什么新鮮的,目前以太坊DApp通過web3接口就可以完成的功能。通過通讀代碼和文檔說明后發現,其實它最大的亮點有兩個:
- 人機交互,實現對一筆發起的交易進行另一方批準確認;
- 規則引擎,實現自動化交易確認。
Clef內置了一個JS解釋器引擎,使用JS編寫自動化批準規則,來達到自動化交易確認的目的。以下是我對Clef服務的理解:
Clef命令行做三件事:
- 初始化一個密碼,用以后續加密以太坊賬戶密碼、加密規則集文件信息摘要值,以及其他需要加密的信息;
- 添加一個規則集文件摘要信息,并保存規則集文件;
- 添加一個以太坊賬戶和密碼,信息會以加密方式保存;
之后啟動Clef,它會提供HTTP RPC服務,調用它的接口,發起交易;經過規則引擎確認,使用以上第三步保存的以太坊賬戶,從keystore中用密碼解開賬戶私鑰,對交易進行離線打包,并返回打包后的結果。這里的初始化密碼很重要,它是一切加密存儲的源頭,Clef文檔中提到該密碼需要由用戶自行保管,就像是用戶保管ssh key一樣。
每一個Clef RPC請求都會用單獨的JS解釋器引擎處理,因此全局變量在規則集文件中是沒有作用的。可以通過磁盤存儲文件的方式共享變量。
規則引擎很強大,可以做一些智能合約做不到的事情,比如定時轉賬、24小時內轉賬限額等等。可以說彌補了智能合約的不足,并且可想象的空間有很多。目前Clef和以太坊并未完全打通,Clef返回值只會吐出離線簽名后的原始數據,還需要客戶端自行將原始數據發送給以太坊節點;并且Clef安全性也有待考證,一旦初始化密碼被竊取,用戶的以太坊賬戶就有被盜走的風險。
BOX (A business wallet solution)在保護企業私鑰方面考慮得比較多,企業的私鑰由多人共管,缺少任何一個人的口令都無法還原私鑰。并且BOX的私鑰保存在簽名機內存中,受到守護程序的保護,一旦檢測到異常情況,守護程序會將簽名機殺死,簽名機在停機前會清零私鑰所在內存數據。
BOX對簽名機私鑰所在內存也做了防護,在私鑰所在內存段前后設置內存守護頁,所以如果任何操作嘗試讀寫這些頁的話,SIGSEGV
就會拋出一個訪問沖突,進而保護私鑰不被竊取。
Clef的規則引擎很好,BOX或許將借鑒Clef的優秀思想,擴充基礎功能。