1. 程式人生 > >EOS的基礎知識(一)基本的命令操作

EOS的基礎知識(一)基本的命令操作

EOS環境的搭建和節點啟動分為以下兩步:

第一步:下載EOS的原始碼

使用命令:git clonehttps://github.com/EOSIO/eos –recursive

下載原始碼,時間大概1-3小時。編譯要求:計算機記憶體要求要有8GB以上。

下載編譯之後,裡面有三個應用程式,這三個應用程式也都是命令列的:

1、Cleos;

2、Nodeos;

3、Keosd。

這三個應用程式之間有什麼關係呢?我們現在使用的前端,怎麼使用EOS呢?

-Cleos,它是一個命令列程式。在前端使用EOS是通過Cleos輸入命令,給EOS下達指令。

-Nodeos,其實它就是挖礦客戶端。在啟動Nodeos之後,它自然就會產生區塊。

-Keosd,它是在後端啟動。它的目的主要是管理錢包,可以建立私鑰。

第二步:節點啟動

下載編譯都做完之後,下面是啟動節點的命令:

cd build/programs/nodeos
./nodeos -e -p eosio –plugin eosio::wallet_api_plugin –plugineosio::chain_api_plugin –plugin eosio::account_history_api_plugin

整個EOS是外掛式結構,需要有一個主程式,其它像錢包管理、區塊鏈等都是一個外掛。

輸入上邊命令後啟動了一個節點,同時啟動了一些外掛,會列印一些基本資訊,以及挖礦的資訊。

EOS建立和管理錢包

節點啟動後我們要做的第一件事兒是什麼呢?就是我們首先要有賬號,但是有賬號的前提是什麼呢?倒不是先建立賬號,而是先要有自己的一組私鑰,有了私鑰才能有賬號,有賬號的前提還是要有錢包。所以,最開始我們是建立錢包,錢包是用來管理我們的金鑰的。

第一步:建立錢包

使用命令:./cleos wallet create,就可以建立一個錢包。

帶引數,可以在命令後邊加上-n,-n指定你的錢包名稱是另外一個錢包名稱,可以建立不同的錢包,然後每個錢包都可以管理一組金鑰。

第二步:建立一組祕鑰

建立好錢包,就可以建立一組金鑰,建立命令為:

./cleos create key

第三步:祕鑰匯入錢包

在第二步建立的金鑰,只是生成一組公鑰、私鑰,還需要把公鑰、私鑰匯入錢包,才能讓錢包把公鑰和祕鑰管理起來。

匯入命令為:(有的版本需要帶引數 --private-key)

./cleos wallet import

可以在命令後面指定錢包,這樣就可以把第二步建立的一組公鑰、私鑰直接匯入指定的錢包。

第四步:檢視錢包中的祕鑰

使用以下命令就可以檢視是不是成功的把祕鑰匯入錢包了:

./cleos wallet keys

建立了一組金鑰,金鑰包括公鑰和私鑰,然後把這組公鑰放到剛才建立的錢包裡面了。

EOS建立和管理賬號

建立好錢包、金鑰之後,接下來就可以建立賬號了,賬號是什麼?賬號儲存在區塊鏈上的人類可讀的標誌符。

建立賬號的命令:

$ ./cleos createaccount eosio ${new_account} ${owner_key} ${active_key}

其中eosio是超級使用者,需要靠超級使用者來建立其它的新使用者,eosio後面就是新使用者的使用者名稱。

除了新的賬號之外,命令後面還有兩個key:

1、Owner key

2、Active key

Owner key是什麼意思呢?Owner key表示分配給新賬號的一個Owner認證的公鑰。Active key是分配給新賬號一個Active認證的一個公鑰。

至於這兩個認證,這是兩個主要的許可權。建立一個賬號,如果這個賬號要有Owner的許可權和Active的許可權,就必須要用這兩個key才能實現。

剛才操作是呼叫./cleoscreate account建立了一個賬號,這個賬號的命名規則遵守下邊兩個規則:

1、小於13個字元;

2、僅包含這些字元:.12345abcdefghijklmnopqrstuvwxyz

另外,剛才給大家說到Owner key和Active key的概念。Owner key的概念就是賬號的所有控制權限,只要有了Owner key,才可以對這個賬號的任何東西做任何的事兒,這是它的所有控制權。

而Active key只掌握了你的賬號資金的訪問許可權,也就是如果有了Active這個許可權的話,可以對這個賬號的資金進行轉移,但是不能轉移這個賬號的所有權,或者不能做超過這個Active許可權其它的權利。

如果簡單的理解,Owner key就是對這個賬號的最高許可權,Active只是用來轉移資金而已。這也是與以太坊智慧合約開發的一個區別,以太坊賬號的許可權其實沒有這麼細分,它就只有一個賬號,只要有這個賬號的公鑰和私鑰,就可以做任何事情。

EOS的許可權和許可

對於EOS的許可權和許可,分得非常細。

「Permission」它是一個操作允許的許可權,可以建立很多permission。比如允許你轉賬,允許發微博或者允許做其他事。它是通過permission來控制操作,可能不同的使用者有不同的permission。

Threshold是某個許可需要的閾值。比如你要做一件事兒,它可能有個閾值,這個閾值是一個量化,你必須要達到這個閾值才可以進行相應的操作。

Weight表示權重。賬號必須對應某個許可擁有的權重,就是你的權重要大於你的閾值,然後這件事兒你就可以做。

在permission許可裡面有兩種許可:

-owner許可;

-active許可。

這兩個叫native(原生)的permission,另外還有public的permission。

permission account weight threshold
owner 1
EOS5EzTZZQQxdrDaJAPD9pDzGJZ5bj34HaAb8yuvjFHGWzqV25Dch 1
active 1
EOS61chK8GbH4ukWcbom8HgK95AeUfP8MBPn7XRq8FeMBYYTgwmcX 1

第一個例子, owner許可的閾值是1,它裡面有一個賬號,這個賬號是用它的公鑰來代表的,然後這個賬號的權重是1,這樣你的權重是大於等於閾值的,所以可以用owner的賬號和許可權。

active許可裡面有一個賬號,它的權重也是等於這個閾值,所以可以用active的賬號和許可權。

這兩個賬號,一個是有owner許可權,一個是有active許可權,因為它們的權重和閾值是大於等於這個值的,對應的賬號與許可權都是可以使用的。

permission account weight threshold
owner 2
@bob 1
@stracy 1
active 2
@bob 1
@stracy 1
publish 2
@bob 2
@stracy 2

第二個例子,除了owner的permission之外,你還可以有一個publish permission。它們之間有什麼區別呢?

當你建立任何一個賬號,這個賬號都有owner的許可和active的許可。其他的許可就是你可以自己定義,來讓不同的使用者,擁有不同的許可組合,這樣就可以很靈活的去管理不同的賬號。

所以這一點,EOS考慮的比較比較細緻一點,但是以太坊或者比特幣沒有做到這麼細緻,以太坊或者比特幣擁有一個賬號就可以做任何事情。

這裡面再細一點來講,這裡面的owner的閾值是R,bob賬號的權重只有1,stracy賬號的權重也只有1,如果它倆單獨的去獲得owner許可相關的操作,它們是獲得不了的。但是,如果bob和stracy加起來大於等於2,就是這兩個賬號聯合起來大於等於2的,這兩個賬號就可以做這個操作的,其實這有點像投票。

我覺得這個許可權或許可的限制,和我們傳統的作業系統是不太一樣的。我們傳統的作業系統好像沒有這種聯合簽名可以達到兩個權重來執行owner的相關操作。

active這也是一樣的,如果bob賬號是1,stracy賬號是1,如果active需要的閾值是1的話, bob賬號和stracy賬號是單獨都可以做active許可相關的操作,就是轉移資金。

另外,publish就是一個定製化許可。我們每個使用者也可以定義自己某些允許的一些操作。publish這裡面的閾值是2,bob賬號是2,stracy賬號是2,這兩個賬號也可以單獨做publish許可相關的操作。而publish的許可權可能是比如釋出一些訊息、釋出一些微博的操作。

通過以上兩個例子,給大家展示了EOS對許可權設定的設計有多細緻。

EOS智慧合約

EOS的智慧合約裡面有一個action(動作)和transaction(交易)的概念。

對於EOS,它多了一個action的概念,action其實它也是對一個智慧合約中的某個函式的呼叫。transaction是由一個或者多個action組合而成的關係,就是在一個transaction裡,可以包含多個action,這樣你可以在一個transaction裡籤一次名,就可以調多個函式,做一組操作。

部署智慧合約

部署智慧合約的示例程式碼如下:

$ ./cleos set contract eosio build/contracts/eosio.bios -p eosio

其中,eosio是要部署的賬號,就是你用哪個賬號去部署智慧合約;

build/contracts/eosio.bios表示的是路徑;

eos.bios是生成一個智慧合約的目錄。

執行Token合約

第一步,Token智慧合約部署,程式碼如下:

./cleos set contracteosio.token build/contracts/eosio.token -p eosio.token

第二步,呼叫create函式,程式碼如下:

$ ./cleos push action eosio.token create ‘[ “eosio”, “1000000000.0000 EOS”, 0, 0, 0]’ -p eosio.token

呼叫create函式,設定到幣的最大數目,開始建立我的token。

怎麼呼叫一個action呢?我們都是通過cloes命令列呼叫action,不過後面跟的引數不一樣。push action,這兩個都是固定的,後面是合約的名稱。

eosio是賬號名,後面數字表示設定token總量是10億,幣的名稱是EOS幣,後面有3個0,代表的是三個引數:can freeze、can recall、can whitelist。這3個引數設定為0,一共傳了5個引數,通過這樣的方法,去呼叫整個的合約create的函式。

第三步,轉移100個pdj幣到user使用者,程式碼如下:

$./cleos push action eosio.token issue ‘[ “user”, “100.0000 EOS”,“memo” ]’ -p eosio

Issue這個操作是用來發幣,它後面跟了3個引數:

一個是user,表示這個幣發給誰;

數字表示要給這個使用者轉多少錢,我這裡轉了100多個user的token;

最後一個引數是是一個備註,相當於轉賬留言。

第四步、從user使用者轉移30個PDJ幣給tester使用者,程式碼如下:

$./cleos push action eosio.token transfer ‘[ “user”, “tester”, “30.0000 EOS”, “m” ]’ -p user

這是一個轉賬合約的執行過程,先部署合約,然後呼叫create,可以轉賬,既可以轉到user,也可以從一個user使用者轉到test使用者,整個過程在user wiki文件上也寫得比較清楚的。

除錯智慧合約

現在user官方網站推薦的一個除錯方法就是print,把資訊打印出來。這個必須要我們搭建本地節點,因為如果沒有本地節點,相當於你print列印在別人的節點上,你根本看不到這個列印資訊是什麼,所以說你必須要搭建一個本地節點。搭建本地節點後,你執行智慧合約,就會看到print出來的輸出結果。

EOS智慧合約的RPC介面

其實智慧合約整個只完成了DApp最核心的一部分,就是基本上和資金有關係的一些關鍵操作,其實大部分的介面、介面,還得我們用JavaScript、HTML去做。

那我們這些DApp其它寫介面的操作,怎麼去呼叫智慧合約呢?都是通過user智慧合約RPC介面呼叫,智慧合約的RPC介面文件連結是:https://eosio.github.io/eos/group__eosiorpc.htm。

RPC的介面我們除了用C++或者用程式設計的方法去呼叫一些介面,我們可以用curl這種最簡單的方法去呼叫這個介面。curl它相當於模擬了一個瀏覽器的操作,我可以向我的執行節點的RPC埠發訊息。

這裡面我可以給大家展示,我列了3個。

1.get_info:獲得節點資訊。通過呼叫這個介面,它會返回我執行節點,比如說server version,就是我執行節點這個節點的版本號;head blocknum,是我當前挖到哪個塊了。

用法:

curl http://127.0.0.1:8888/v1/chain/get_info

2. get_block:獲得一個塊的資訊。呼叫該介面,指定塊號(blocknum),就可以獲得指定塊的詳細資訊。

用法:

$ curl http://127.0.0.1:8888/v1/chain/get_block -X POST -d‘{“block_num_or_id”:5}’

3.get_account:獲得某個賬號的資訊。呼叫這個介面,可以獲得當前我的一個賬號資訊

用法:

$ curlhttp://127.0.0.1:8888/v1/chain/get_account -X POST -d‘{“account_name”:”inita”}’

EOS智慧合約程式設計示例:HelloPDJ

下面有一個程式設計示例,給大家展示一下我怎麼樣寫智慧合約的。它這個智慧合約可以用C語言(一種計算機程式語言)來寫,也可以用C++(一種計算機程式語言)來寫,這裡面我就用C++來寫。示例程式碼如下:

// hello.cpp原始碼
#include<eosiolib/eosio.hpp>
#include <eosiolib/print.hpp>
using namespace eosio;
class hello : public eosio::contract {
public: using contract::contract;
/// @abi action
void hi( account_name user )
{print( “Hello, ”, name{user} ); }
};
EOSIO_ABI( hello, (hi) )

如果我自己寫了一個智慧合約,怎麼去編譯和部署呢?編譯的步驟大概是這樣的:

第一步,編譯hello檔案

$ eosiocpp -o hello.wasthello.cpp
$ eosiocpp -g hello.abihello.cpp

第二步,建立賬號

$cleos create account eosio hello.codeEOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4 …

第三步,部署合約

cleos set contract hello.code../hello -p hello.code

第四步,呼叫合約

cleos push action hello.codehi ‘[“user”]’ -p user