目标
从基础的智能合约中分析代码结构,了解调用方式和合约的作用。- D( h6 U% v" i
软件版本
建议阅读前先了解:https://blockflow.net/t/topic/663
参考文档:; Y/ j* _8 A/ m) R$ W
EOSIO提供了一组服务和接口,使合同开发人员能够( q- ?% w% f% z) T) o
跨action保持状态。其中包括:
" j( U5 `3 @0 U$ b8 W
简介
bios全称是:Basic Input/Output System(基本输入/输出系统)。$ r5 P) Y* C5 M. l
部署方式
cloes set contract eosio ./contracts/eosio.bios/ -p eosio
源码分析1 f+ I: Q& P, N& t @* S
项目结构
├── CMakeLists.txt 产生Makefile文件,通过make命令编译和链接所需要程序。
├── eosio.bios.abi 数据结构和接口/ }- \; L* N/ w
├── eosio.bios.cpp 核心逻辑代码
└── eosio.bios.hpp 头文件类及其成员声明
核心eosio.bios.hpp1 ^/ j* g' S5 s9 l& B
#pragma once f+ H Z. b5 g8 z- N: Y
#include 0 Y6 @& m7 m) {$ A2 p
#include $ T' |! a/ T; i! t9 G
namespace eosio {
class bios : public contract {3 I, F4 v6 `+ d
public:
bios( action_name self ):contract(self){}
' F4 c4 l; U4 t: W- W& y) V% L; x8 \# T
//设置账号权限
void setpriv( account_name account, uint8_t ispriv ) {1 s" G% u, v( f& P9 Z3 k2 \
require_auth( _self );: H( Q. A z" J P% I( j% m! ^& j
set_privileged( account, ispriv );) n# v7 }2 l% o. O5 j3 e4 {
}, T- \6 e) L7 ^
//限制账号资源1 p# B1 z; G' {, ~
void setalimits( account_name account, int64_t ram_bytes, int64_t net_weight, int64_t cpu_weight ) {8 E+ y6 g! {4 N9 e: s
require_auth( _self );
set_resource_limits( account, ram_bytes, net_weight, cpu_weight );
}3 [! n$ m7 r9 w K3 O
//设置区块链资源,无任何操作,暂时无效
void setglimits( uint64_t ram, uint64_t net, uint64_t cpu ) {; f0 X4 c4 e/ Q2 H- r/ l
(void)ram; (void)net; (void)cpu;
require_auth( _self );
}, z9 d0 ~+ O2 x" e- H" o
//设置生产节点* W' K$ Y) M6 P) E L4 u% m
void setprods( std::vector schedule ) {
(void)schedule; // schedule argument just forces the deserialization of the action data into vector (necessary check), X/ R6 h+ K; b1 f) I9 D
require_auth( _self );
constexpr size_t max_stack_buffer_size = 512;' H; h7 M( }& D$ F* I* P( n6 W
size_t size = action_data_size(); z- t- t) D) `$ B$ P
char* buffer = (char*)( max_stack_buffer_size
所有方法通过eosio.bios.cpp中的EOSIO_ABI宏进行封装,映射给开发者使用。
require_auth(),通过C/C++ API参考查询得知,此方法定义在action.h中,作用为验证提供的身份验证集中是否存在指定的帐户。
eosio.bios中所有具体的操作,都定义在privileged.h中,在此都为调用。
privileged.h包含的具体方法的作用和参数定义可以结合 https://developers.eos.io/eosio-cpp/reference#privileged 和源码一起看。