如何编写合约

原文地址:https://eosio.github.io/eos/group__contractdev.html

翻译仅供参考,一切以原文为主

模块

数据库API :保存,获取EOS.IO区块链上的数据

数学API:定义常见的数学功能

消息API:定义查询消息属性的API

控制台API:使得应用能够打印文本消息

代币API:定义了与标准兼容的代币信息以及数据库表进行交互的ABI

内建类型:指定类型定义和别名

 

细节

背景

EOS.IO合约(也就是应用)作为预编译的WEB ASSEMBLY (WASM)部署到区块链上。

WASM使用C/C++开发,使用LLVM和clang编译,这就意味着,想要开发你的区块链应用,你需要具备C/C++的知识。虽然可以使用c来开发,但是我们强烈推荐使用EOS.IO C++API来开发,这些API是强类型安全的,并且更易读。

应用结构

EOS.IO 应用围绕事件处理器而设计,这些事件处理器能相应用户的行为。比如,一个用户可能转账给另一个用户。这个事件可以被发送者,接收者,货币应用本身进行处理或拒绝。

作为一个应用开发者,你应该决定用户能执行哪些行为,并决定应该调用哪些处理器来响应这些行为。

 

入口点

EOS.IO应用有一个apply函数,这个apply方法就像是传统应用的main函数:

extern “C” {

void init();

void apply( uint64_t code, uint64_t action );

}

main函数(注:应该是apply函数,感觉原文写错了)有两个参数:code 和action,这个main函数定义了系统中独一无二的事件。比如,code可能是一个currency合约,action可能是transfer,那么,这个event(code,action)可以被传递到多个合约(包括了发送者和接收者)中去。这时,是由你的应用来决定如何响应这个事件。

Init函数是另一个入口点,这个函数只在加载完代码后立即执行,且只执行一次。如果你想执行一些一次性的初始化工作,就在这个函数内执行。

 

应用入口处理器示例

一般来说,你应该使用你的入口处理器把事件分发到函数中去,这些函数实现了你的大部分逻辑,并拒绝掉那些你的合约无法或不愿接收的事件。

 

 

 

 

extern “C”{

void apply( uint64_t code, uint64_t action ) {

if( code == N(currency) ) {

if( action == N(transfer) )

currency::apply_currency_transfer(currentMessage<currency::Transfer >() );

} else {

assert( false, “rejecting unexpected event” );

}

}

}