eos智能合約基礎知識


1. 智能合約以action和訪問共享內存數據庫的形式互相通信;倆種通信模式:Inline.被保證在當前的transaction或unwind中執行;結果無論成功或失敗,都不會通知任何操作;Inline操作與original transaction具有相同的范圍和權限。Deferred. Defer將被BP節點安排在之后執行,有可能會通知通信的結果或者超時。Deferred可以帶着調用者的授權延伸到不同的scopes。

2. Action表示單個操作,而transaction是一個或多個action的集合。Action是合約和賬戶之間進行通信的方式。Action可以單獨執行,或者組合組合起來作為一個整體執行;包含多個action的transaction, 這些action要么全部成功要么全部失敗

3. Action名字約束

Action的類型是 base32被編碼為64-bit整數. 這意味着它的字符集長度是12,並且只能包含a-z,1-5,和'.'。 如果長度超過12個,他會自動截取前12個符合規則的字符作為action的名字;

Transaction 確認 

收到一個transaction並不意味着這個transaction已經被確認,它僅僅說明這個transaction被一個BP節點接受並且沒有錯誤,當然也意味着很有可能這個transaction被其他bp接受了。

當一個transaction被包含在一個block當中的時候,它才是可以被確認執行的。

4. 

eosiocpp也可以創建3個合約文件,它們僅僅包含了合約的框架。

$ eosiocpp -n ${contract}

上面的命令會在./${project}目錄下創建一個空的項目,它包含3個文件

${contract}.abi ${contract}.hpp ${contract}.cpp

hpp

${contract}.hpp 這是合約的頭文件,可以包含一些變量,常量和函數的聲明。

cpp

The ${contract}.cpp 這是合約的源碼文件,包含合約的具體實現。

5.void init() { eosio::print( "Init World!\n" ); // Replace with actual code } init 僅當合約第一次被部署的時候執行。 在這個函數里可以初始化變量,

void apply( uint64_t code, uint64_t action ) { eosio::print( "Hello World: ", eosio::name(code), "->", eosio::name(action), "\n" ); }

apply 是一個中轉函數, 他監聽所有傳入的action,並且根據action調用合約相應的函數。apply函數需要兩個參數, code 和 action

code filter

這個參數是為了對action做出回應,比如下面的apply函數,你可以構造一個通用響應去忽略code

if (code == N(${contract_name}) { // your handler to respond to particular action }

action filter

為了響應每一個action,比如構造比如下面的apply函數。通常和code filter一起使用

if (action == N(${action_name}) {
    //your handler to respond to a particular action
}

hpp

${contract}.hpp 這是合約的頭文件,可以包含一些變量,常量和函數的聲明。

cpp

The ${contract}.cpp 這是合約的源碼文件,包含合約的具體實現。

如果你用eosiocpp生成了一個 .cpp, 那它的內容大概類似如下:

#include <${contract}.hpp>

extern "C" {

    /**
     *  This method is called once when the contract is published or updated.
     */
    void init()  {
       eosio::print( "Init World!\n" ); // Replace with actual code
    }

    /// The apply method implements the dispatch of actions to this contract
    void apply( uint64_t code, uint64_t action ) {
       eosio::print( "Hello World: ", eosio::name(code), "->", eosio::name(action), "\n" );
    }

} // extern "C"

在這個例子里,我們可以看到兩個函數,initapply。它們會打印log並且不做任何檢查。任何人都可以在任何時刻執行BP允許的所有action。在不需要任何簽名的情況下,合約將被計入帶寬消耗。(Absent any required signatures, the contract will be billed for the bandwidth consumed.)

init

init 僅當合約第一次被部署的時候執行。 在這個函數里可以初始化變量, 比如,在currency合約中總體的token的供應量。

apply

apply 是一個中轉函數, 他監聽所有傳入的action,並且根據action調用合約相應的函數。apply函數需要兩個參數, code 和 action

code filter

這個參數是為了對action做出回應,比如下面的apply函數,你可以構造一個通用響應去忽略code。 (In order to respond to a particular action, structure the apply function as follows. You may also construct a response to general actions by omitting the code filter.)

if (code == N(${contract_name}) {
    // your handler to respond to particular action
}

當然你也可以為每個action構造各自的一個響應。

action filter

為了響應每一個action,比如構造比如下面的apply函數。通常和code filter一起使用

if (action == N(${action_name}) {
    //your handler to respond to a particular action
}

wast

任何合約程序想要部署到EOSIO的區塊鏈網絡中都必須編譯成WASM格式。這是EOS的支持唯一個的格式。

一旦你的CPP文件寫好了,有就可以用eosiocpp把它編譯成WASM (.wast)文件了

$ eosiocpp -o ${contract}.wast ${contract}.cpp

abi

ABI( Application Binary Interface)文件是一個JSON格式的描述文件,說明了如何在他們的JSON和二進制之間轉化用戶的action。ABI文件也同時說明了如何轉換數據庫的狀態。一旦你用了ABI描述了你的合約,開發人員就和用戶就可以和你的合約通過JSON進行交互。

ABI可以通過.hpp文件用eosiocpp生成。

$ eosiocpp -g ${contract}.abi ${contract}.hpp

Print C++ API 支持

  • a null terminated char array (string)
  • integer (128-bit unsigned, 64-bit unsigned, 32-bit unsigned, signed, unsigned)
  • base32 string encoded as 64-bit unsigned integer
  • struct that has print() method

5.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM