精通EOS:智慧合約常見概念梳理
1、錢包、賬戶與許可權
EOS 錢包裡面只存放私鑰,而且錢包有一個密碼,需要輸入密碼才能解鎖錢包,讀取私鑰。而賬戶裡面有EOS Token以及智慧合約,如果需要轉移裡面的 EOS Token 或者執行智慧合約,你需要錢包中對應的私鑰來解鎖這個保險箱。
回憶一下建立賬戶的過程:
- 建立錢包
- 建立兩個金鑰對
- 匯入私鑰到錢包中
- 建立賬戶建立賬戶命令如下:
cleos create account [OPTIONS] creator name OwnerKey [ActiveKey]
OPTIONS
表示相關的選項,creator
表示為這個建立動作支付 EOS 的賬戶,即建立者;name
表示新建立的賬戶名;OwnerKey
、ActiveKey
表示了兩個公鑰,它們具有不同的許可權。其中OwnerKey
許可權是賬戶的最高許可權,可以修改其它許可權,ActiveKey
許可權預設可以進行轉賬等操作,但不能修改許可權。轉賬和智慧合約等操作的執行都是在賬戶中進行的,所以賬戶名在 EOS 世界其實是以太坊的地址。與以太坊不同,EOS 的賬戶名不再是一串很長很長的地址,而是一個你可以自定義的英文字母+數字(12345)+符號(.),最長12位,最短1位,全域性唯一,先到先得,長度不同註冊需要的EOS也不一樣。
借用一張圖片來表示這些關係
2、EOS 系統資源
EOS 是 Enterprise Operation System 的簡稱,目標是區塊鏈世界中的作業系統,所以一些概念和傳統作業系統是類似的,其中計算機中的執行記憶體,在 EOS 中就可以看做是 RAM;而硬碟就可以對標 EOS 區塊鏈資料庫。
EOS 共有三大資源:CPU、NET(網路頻寬)和 RAM(記憶體)。CPU 和 NET 需要臨時抵押 EOS 獲取,類似於交押金,不用了可以贖回 EOS,RAM只能用EOS直接購買,會在使用過程中被消耗掉。
對於高訪問量的資料,例如賬戶餘額、智慧合約的當前狀態等就會被儲存在 RAM 中,並且這部分資料將長期佔用 RAM;而低訪問量的資料,例如交易資料,就會儲存在EOS系統的硬碟中,也就是區塊鏈中。當 RAM 不足時,轉賬或部署合約等相關操作就無法執行。
目前消耗 RAM 最多的場景就是 EOS 錢包的開戶,其次就是轉賬和一些應用內的操作,因為 EOS 賬號不是免費的,需要消耗 RAM。
3、什麼是 WebAssembly
WebAssembly 是除了 JavaScript 以外,另一種可以在瀏覽器中執行的程式語言。這是由Google, Microsoft, Mozilla,Apple等幾家大公司合作發起的一個關於面向Web的通用二進位制和文字格式的專案。
WebAssembly 是一種新的位元組碼格式。它的縮寫是 .wasm
, .wasm
為檔名字尾,是一種新的底層安全的二進位制語法。它被定義為“精簡、載入時間短的格式和執行模型”,並且被設計為Web 多程式語言目標檔案格式。 這意味著瀏覽器端的效能會得到極大提升,它也使得我們能夠實現一個底層構建模組的集合,例如,強型別和塊級作用域。
但是,這並不意味著 WebAssmbly 是為了取代 JavaScript 而生的,就像 Bjarne Stroustup說的:“JS會活得很好,因為世界上只有兩種型別的語言:一類語言被人們不斷的地吐槽,而另一類語言壓根兒沒人用!” 而Eric Elliott認為:”最好不要把WebAssembly僅僅當做一門程式語言,實際上它更像是一個編譯器。”
WebAssembly 也並不是只有 wasm 一種格式,它還有 wast 格式。這兩種格式是等價的,最大的區別就是 wast 是可讀文字格式的,而 wasm 是二進位制格式的,他們可以通過工具相互轉換。
在上一篇我的 hello 合約中,其中一步就是生成 Hello.wasm
和 Hello.wast
兩個檔案,大家可以看下這兩個檔案的內容。還有,如果大家瀏覽過 eos 合約目錄,就會看到很多 .wasm
和 .wast
檔案。
4、什麼是 ABI
ABI 是應用程式二進抽介面的縮寫,是從區塊鏈外部與合約進行互動,以及合約與合約之間進行互動的一種標準方式。它定義了函式簽名、引數編碼、返回結果編碼等的規則。當合約被編譯後,那麼它的 ABI 也就確定了。
EOS中 ABI 的作用也和以太坊中大致類似,它定義了函式被呼叫的規則;定義了引數在呼叫者和被呼叫者之間是如何傳遞的。
5、合約核心概念
-
action
與transaction
的區別和聯絡。-
action
是一個動作,賬戶和合約互動是通過action
進行的,可以單獨傳送一個action
。每個action代表一條合約條款,實現了條款中的具體規則。 -
transaction
是一個或幾個action
組成的原子性操作,類似於傳統環境下的事務。所有action
全部成功,該transaction
才會成功。
action
的執行環境被稱為action
上下文,action
上下文提供了執行action
所需的一些條件,其中一個就是action
的工作記憶體,這是action
儲存工作狀態的地方。在處理一個
action
之前,系統會先為它清理一次記憶體,因此當變數在一個action
中被賦值後,另一個action
的上下文是拿不到這個值的。在action
之間傳遞狀態的唯一方法就是把它持久儲存到 EOS 資料庫中。 -
- 合約之間的互動模式合約之間有兩種互動模式,即內聯和延遲。
- 內聯,意思就是直接採用內部函式體發起,呼叫其他函式的方式。這可以保證交易無阻礙執行,不必通知外部失敗或者成功結果,同時內聯也可保證交易始終處於同一作用域以及許可權。
- 延遲,通過生產者的判定來決定延後按時執行,可能會發生超時的問題,但是這種方式可以跨多個作用域工作,並且可以攜帶著傳送給它的合約許可權。
- 合約之間資料傳遞智慧合約之間通過
action
和共享資料檔案來進行互動。