EOS的基礎知識(三)合約介紹
本篇主要涉及的內容有:
1、前置概念介紹;
2、土味智慧合約入門:hello;
3、呼叫hello合約。
1、前置概念介紹
1.1 什麼是WebAssembly
之前如果大家簡單地瀏覽過eos專案資料夾,就會看到很多`.wasm`檔案,而wasm就是WebASseMbly的縮寫。這裡讓我們略過Flash、JavaScript和WebAssembly的愛恨情仇(發展演化),直接一句話概括一下:‘WebAssembly’是一種新的編碼方式,可以在現代的網路瀏覽器中執行。
想象它是一種可以把底層語言檔案變得像JS那樣,可以直接在瀏覽器中執行。而且比JS更輕量、更快速、更安全。過程如下圖:
還有一個大家在`build` eos的過程中看過一百遍的詞:`LLVM`。
LLVM是一些分模組、可重用的編譯工具鏈。它提供了一種程式碼編寫良好的中間表示(IR)。它在上圖中的位置大概是介於第一步和第二步之間。如果想把C/C++變成WASM檔案,就需要先把C/C++程式碼先變成LLVM中間程式碼。一旦變換成了LLVM IR之後,就說明LLVM已經理解了程式碼並會對程式碼自動地做出一些優化。而WebAssembly也並不是只有`wasm`一種格式,它還有`wast`格式。這兩者作用是等價的,最大的區別就是`wast`是可讀文字格式的,而`wasm`是二進位制格式的,他們可以通過工具相互轉換。
讓我們高度總結一下WebAssembly:可以讓瀏覽器識別底層語言的神器。(筆者感覺和以太坊中的編譯器作用差不多)。
1.2 什麼是ABI
玩過以太坊的同學可能對ABI並不陌生,在EOS中ABI的作用也和以太坊中大致類似:
它定義了函式被呼叫的規則;定義了引數在呼叫者和被呼叫者之間是如何傳遞的。如果說`wasm`檔案是產品的話,要想順利使用這件產品,你還需要一本操作說明書,而`ABI`就是這份說明書。
2、土味智慧合約入門:hello
一說入門就要說<hello world>,這種感覺很low,同時也很“程式設計師”。感謝雷佳音讓我找到了一個並不尷尬的小標題:土味hello。
2.0 準備工作
進度保持在我們上一篇結束的地方:我們已經學會使用操作eosio賬戶、建立了新賬戶`testeosio`。在正文開始之前,請啟動`nodeos`,相關錢包處於unlock狀態。
2.1 修改`config.ini`
找到位於vim ~/Library/Application\Support/eosio/nodeos/config/中的`config.ini`檔案,開啟找到下面這句話:
# print contract's output to console (eosio::chain_plugin)
contracts-console = false
把上面的`false`改成`true`,儲存修改退出。這樣我們就可以在終端直接看到智慧合約的執行情況。(這裡筆者重新啟動了nodeos)
2.2 建立`hello`合約
這裡我們用到了一個小工具叫`eosiocpp`。eosiocpp是一個c++生成wasm和ABI檔案的工具。eos專案中自帶了一個hello合約,為了區分,這裡我們建立一個合約叫做`hello1`。執行以下語句建立新合約:
eosiocpp -n hello1
它會以樣例合約為基礎建立一個最簡單的合約。看到下面即表示建立成功:
這時在當前資料夾下就可以看到有一個`hello1`的資料夾。進入`hello1`資料夾,可以看到裡面有兩個檔案:
➜ hello1 git:(master) ✗ ls
hello1.cpp hello1.hpp
-
`hello1.hpp`是智慧合約的標頭檔案,可以包含一些變數,常量和函式的宣告。
-
`hello1.cpp`是合約的原始碼檔案,包含合約的具體實現。
2.3 生成wasm和abi檔案
進入`hello1`資料夾下執行以下命令:
#使用 -o 生成wast檔案和wasm檔案
eosiocpp -o ./hello1.wast ./hello1.cpp
#使用 -g 生成abi檔案
eosiocpp -g ./hello1.abi ./hello1.cpp
這時可以看到在當前資料夾下生成了`hello1.wast`、`hello1.wasm`和`hello1.abi`檔案。
2.4 部署智慧合約
使用我們剛剛生成的檔案部署智慧合約。輸入如下命令:
cleos set contract eosio ./ ./hello1.wast hello1.abi -p [email protected]
這行命令有五個引數:`eosio`表示部署合約的賬戶,`./`表示合約所在的資料夾,後面兩個引數依次是`.wast`和`.abi`檔案的路徑,最後的`-p [email protected]`表示許可權。執行成功如下圖所示:
3、呼叫hello合約
在執行呼叫命令之前,我們先簡單地瞭解EOS中的一個概念:`transaction`和`action`。
Action表示單個操作。而transaction是一個或多個action的集合。Action是合約和賬戶之間進行通訊的方式。Action可以單獨執行,或者組合組合起來作為一個整體執行。
在官網中我們也可以看到包含一個action和多個action的transaction的例子。對比來看的話,EOS中的action就相當於以太坊中的transaction。執行以下命令來呼叫hello1合約中的`hi`方法:(執行的賬戶是testeosio)
cleos push action eosio hi '["hammer"]' -p testeosio
執行成功就可以看到如下介面:
這時如果我們去看執行`nodeos`的終端視窗,可以看到下面的提示:
同樣打印出了`Hello, hammer`
相關推薦
EOS的基礎知識(三)合約介紹
本篇主要涉及的內容有: 1、前置概念介紹; 2、土味智慧合約入門:hello; 3、呼叫hello合約。 1、前置概念介紹 1.1 什麼是WebAssembly 之前如果大家簡單地瀏覽過eos專案資料夾,就會看到很多`.wasm`檔案,而wasm就是WebASs
Python 之 基礎知識(三)
內容 對象 com color define cti 判斷 函數封裝 charm 一、函數 def 函數名(): 函數封裝的代碼 ... def是英文define縮寫 別的Python文件可以引入 調用 定義時 和其他代碼包括註釋保留兩個空行
Python基礎知識(三) Python編碼、變量、if和while語句
SM 不同的 正式 網頁 end oot 循環輸出 mut 字符編碼 Python入門知識 一、第一句Python代碼 在Linux下/home/test目錄下創建hello.py文件,內容如下: [root@root ~]# mkdir /home/test [
廖雪峰網站—學習python基礎知識(三)
style 字符串 知識 code ron sar sof 轉換 () 一、判斷 1、條件判斷 age = 18 if age >= 18: print(‘your are is‘, age) print(‘adult‘) ag
Python基礎知識(三)
檔案操作 1. 讀檔案 input和argv,這些是你開始學習讀取檔案的必備基礎。你可能需要多多實驗才能明白它的工作原理,所以你要細心做練習,並且仔細檢查結果。處理檔案需要非常仔細,否則,你可能會把有用的檔案弄壞或者清空。導致前功盡棄。 這節練習涉及到寫兩個檔案。一個正常的 ex
儲存基礎知識(三)塊儲存,檔案儲存,物件儲存
1、塊儲存 典型裝置:磁碟陣列,硬碟 塊儲存主要是將裸磁碟空間整個對映給主機使用的,就是說例如磁碟陣列裡面有5塊硬碟(為方便說明,假設每個硬碟1G),然後可以通過劃邏輯盤、做Raid、或者LVM(邏輯卷)等種種方式邏輯劃分出N個邏輯的硬碟。(假設劃分完的邏輯盤也是5個,每個也是1G,但是
PostgreSQL基礎知識(三)
21、向表中插入資料 INSERT INTO 表名 (列1,列2,...)VALUES(值1,值2,.......); 前面我們還寫過一種寫法,就是列清單的省略寫法。當我們對錶進行全列插入時,就可以省略表名後的列清單。VALUES字句的值會預設按照從左到右的順序賦值給
JPA基礎知識(三):相關介面/類
JPA相關介面/類 一、Persistence 作用:通過createEntityManagerFactory的靜態方法,獲取EntityManagerFactory(實體管理器工廠)例項。 帶有一個引數:以JPA配置檔案presistence.xml中持久
C#入門基礎知識(三)
C#的資料型別及資料型別轉換 C#的資料型別 我們宣告變數時需要寫出資料型別,我們來看一下最常見的幾種資料型別。 字元型別char,儲存用’’(單引號)擴起來的一個字元。例如: char sex=‘男’; //儲存性別 字串型別string,儲存用“”(用雙引
前端求職可能遇到的基礎知識(三)
1.js的基本資料型別 (1)undefined型別: 轉換成boolean型別時為false,轉換成 number型別時NaN,null==undefined為true,但是null===undefined為false。 (2)nul
淺談計算機基礎知識(三)
資料的邏輯結構:反映資料元素之間的關係的資料元素集合的表示。資料的邏輯結構包括集合、線形結構、樹形結構和圖形結構四種。 資料的儲存結構:資料的邏輯結構在計算機儲存空間種的存放形式稱為資料的儲存結構。常用的儲存結構有順序、連結、索引等儲存結構。 插入和刪除是對資料結構
C++基礎知識(三)--數據類型轉換--混合運算類型轉換--賦值類型轉換--強制類型轉換
類型轉換 雙精度 基礎 code 變量 ascii asc 整數 pre 系統自動類型轉換:混合運算的類型轉換,賦值類型轉換,強制類型轉換 一、混合運算的類型轉換規則 1.運算過程中,當某個二元運算符兩邊的操作數類型不同但屬於類型相容時,系統先將精度低的操作數變換到
Linux基礎知識(三)軟體包管理與系統命令管理
一、軟體包管理 Linux基本軟體包管理---RPM和DPKG 在 GNU/Linux( 以下簡稱 Linux) 作業系統中,RPM 和 DPKG 為最常見的兩類軟體包管理工具,他們分別應用於基於 RPM 軟體包的 Linux 發行版本和 DEB 軟體包的 Linux 發行版本。軟體
Shell基礎知識(三)
狀態 bin 區別 eve shell基礎知識 $2 c++ filename 函數的參數 Shell中變量的作用域: 在當前Shell會話中使用,全局變量。 在函數內部使用,局部變量。 可以在其他Shell會話中使用,環境變量。 局部變量: 默認情況下函數
機器學習中的基礎知識(三)
p s img gist 多類別 合成 在線 區別 深度 表示 通過前兩篇文章我們給大家介紹了機器學習的相關概念,我們不難看出,機器學習的知識是十分零碎的,這是因為機器學習涉及到的知識有很多,在這篇文章中我們繼續為大家介紹機器學習的知識,希望這篇文章能夠給大家帶來幫助。
影象處理基礎知識(三)——根據主軸方向旋轉至水平或垂直方向
本文內容:主要介紹根據主軸方向,把影象旋轉至水平或垂直方向,以及求最小外接矩形長寬比。 1.旋轉至水平方向 2.旋轉至垂直方向 3. 求連通域最小外接矩形長寬比 for(i=0; i<B
林大媽的JavaScript基礎知識(三):JavaScript程式設計(1)物件
1. 物件的簡單介紹與一些注意事項 JavaScript中具有幾個簡單資料型別:數字、字串、布林值、null值以及undefined值。除此之外其餘所有值(包括陣列、函式,甚至正則表示式)都是物件。數字、字串以及布林值表面是物件(因為他們具有方法),但它們是不可變的,只是JavaScript在引用某個數
林大媽的JavaScript基礎知識(三):JavaScript程式設計(2)函式
JavaScript是一門函式式的面向物件程式語言。瞭解函式將會是瞭解物件建立和操作、原型及原型方法、模組化程式設計等的重要基礎。函式包含一組語句,它的主要功能是程式碼複用、隱藏資訊和組合呼叫。我們程式設計就是把一個需求拆分成若干函式和資料結構的組合實現,其中演算法又是實現正確函式的方法論。我們先介紹基礎
林大媽的JavaScript基礎知識(三):JavaScript程式設計(3)原型
在一般的程式語言中,我們使用繼承來複用程式碼,做成良好的資料結構。而在JavaScript中,我們使用原型來實現以上的需求。由於JavaScript專注於物件而摒棄了類,我們要明白原型和繼承的確是有差異的,但很多人接受不了這個事實,因此用某些語法來模仿類的操作。但如果我們要學習JavaScript,還是要
林大媽的JavaScript基礎知識(三):JavaScript程式設計(4)陣列
陣列,是一段線性分配的,具有非常高效能的資料結構。簡單地說,陣列以連續的空間儲存,通過整數地計算偏移量訪問其中的元素,將讀取修改的時間複雜度降低至O(1),我們稱之為猝發式存取。是不是非常期待?沒錯,像這樣的好東西,JavaScript沒有。 1. Array簡介 但作為替代,Ja