初識Clef
以太坊版本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的優秀思想,擴充基礎功能。