目标 E6 K) ?, M) C4 M0 c
从基础的智能合约中分析代码结构,了解调用方式和合约的作用。% ?! n3 k- x+ R3 t) z$ v. p
软件版本( V; V6 {+ ]* F- p( a! c+ H
建议阅读前先了解:https://blockflow.net/t/topic/663
参考文档:) l K# R* V& S
EOSIO提供了一组服务和接口,使合同开发人员能够
跨action保持状态。其中包括:
: P- q; e$ Z2 O0 x
简介7 l' R" _/ W& u4 q! q" u/ {( Y% k
bios全称是:Basic Input/Output System(基本输入/输出系统)。( x- R% H: j" E& D
部署方式
cloes set contract eosio ./contracts/eosio.bios/ -p eosio0 f p, C- o2 ?
源码分析
项目结构
├── CMakeLists.txt 产生Makefile文件,通过make命令编译和链接所需要程序。: ?) r6 \, W0 k- u6 p( Z3 [
├── eosio.bios.abi 数据结构和接口
├── eosio.bios.cpp 核心逻辑代码4 T2 f' B6 W( \% O/ d0 F
└── eosio.bios.hpp 头文件类及其成员声明, s, |; b& Y% m9 O8 [
核心eosio.bios.hpp0 n$ w8 U+ c% f
#pragma once
#include ' E* U) s$ X9 \2 o" Q
#include
namespace eosio {
class bios : public contract {
public:2 \( g( ~! V6 u8 U0 [. }' ^* O
bios( action_name self ):contract(self){}
//设置账号权限2 V3 ]: x; v2 r# T7 s4 ]
void setpriv( account_name account, uint8_t ispriv ) {' K4 i7 v: P6 p7 ^% t4 {" Z
require_auth( _self );
set_privileged( account, ispriv );
}
//限制账号资源" F( i7 L6 v$ k; v2 \, }( J2 {
void setalimits( account_name account, int64_t ram_bytes, int64_t net_weight, int64_t cpu_weight ) {
require_auth( _self );
set_resource_limits( account, ram_bytes, net_weight, cpu_weight );$ h; R$ {- p% [* B V
}
//设置区块链资源,无任何操作,暂时无效 `; k9 d8 P' g. ?; [
void setglimits( uint64_t ram, uint64_t net, uint64_t cpu ) {" R/ ?% R! b' L+ p9 W5 c! n
(void)ram; (void)net; (void)cpu;# b, `/ I8 m; a# X; X$ S
require_auth( _self );
}' _) M+ S/ D7 n, n/ _! _. W
//设置生产节点' F: V4 P8 |1 W, D& ~$ p9 D
void setprods( std::vector schedule ) {
(void)schedule; // schedule argument just forces the deserialization of the action data into vector (necessary check)0 E, ~8 _. g, t7 l
require_auth( _self );; s& O! S$ f1 ^6 r0 k
constexpr size_t max_stack_buffer_size = 512;
size_t size = action_data_size();
char* buffer = (char*)( max_stack_buffer_size 0 p6 ?( e$ Z, Z5 z) B
所有方法通过eosio.bios.cpp中的EOSIO_ABI宏进行封装,映射给开发者使用。
require_auth(),通过C/C++ API参考查询得知,此方法定义在action.h中,作用为验证提供的身份验证集中是否存在指定的帐户。
eosio.bios中所有具体的操作,都定义在privileged.h中,在此都为调用。5 U1 ^+ r3 i) t; Q) N: ?4 U& F5 @
privileged.h包含的具体方法的作用和参数定义可以结合 https://developers.eos.io/eosio-cpp/reference#privileged 和源码一起看。