目标
从基础的智能合约中分析代码结构,了解调用方式和合约的作用。
软件版本
建议阅读前先了解:https://blockflow.net/t/topic/6633 g5 w. p/ @- E- x$ C( v8 W
参考文档:8 V) t3 ?% L( \& N9 ^
EOSIO提供了一组服务和接口,使合同开发人员能够* Z4 a; P( C( D
跨action保持状态。其中包括:
. }3 f0 A9 a# J* ^7 V
简介
bios全称是:Basic Input/Output System(基本输入/输出系统)。
部署方式/ X7 Q5 I6 r& e6 R- P
cloes set contract eosio ./contracts/eosio.bios/ -p eosio: S! K4 I8 U, m; z3 S
源码分析0 r& W# B7 |- {) f
项目结构0 s( r$ v; L4 Z+ R; X+ {) Z
├── CMakeLists.txt 产生Makefile文件,通过make命令编译和链接所需要程序。0 H; Z$ ^! V& P+ o, Q5 Y
├── eosio.bios.abi 数据结构和接口4 y7 v7 ^" ?/ {! G% m, V5 F
├── eosio.bios.cpp 核心逻辑代码
└── eosio.bios.hpp 头文件类及其成员声明% k& H" x4 g/ |! ~! x& q1 H2 O
核心eosio.bios.hpp
#pragma once* a. b/ X' l9 {$ V4 Y* r+ n
#include
#include
namespace eosio {
class bios : public contract {
public: G/ \3 ]& Q2 T
bios( action_name self ):contract(self){}# ^8 @ E6 ?4 z3 M0 Y+ \
//设置账号权限: e7 [5 p9 H! L; y6 F5 h7 W
void setpriv( account_name account, uint8_t ispriv ) {
require_auth( _self );' g# z1 s# O6 x- Z! ~( O) `
set_privileged( account, ispriv );7 x0 }- r4 a! }0 {. Z
}
//限制账号资源
void setalimits( account_name account, int64_t ram_bytes, int64_t net_weight, int64_t cpu_weight ) {" |( b" x: d/ M& \, B+ V1 r, U
require_auth( _self );
set_resource_limits( account, ram_bytes, net_weight, cpu_weight );
}
//设置区块链资源,无任何操作,暂时无效
void setglimits( uint64_t ram, uint64_t net, uint64_t cpu ) {& L2 c8 \& w1 E7 H
(void)ram; (void)net; (void)cpu; @. i. c# d3 l' V
require_auth( _self );8 P. j/ b/ M% l* ]1 H4 u
}
//设置生产节点
void setprods( std::vector schedule ) {$ L# I$ ?+ C$ o( ~- r' E9 Y
(void)schedule; // schedule argument just forces the deserialization of the action data into vector (necessary check)' [; c+ x% v- z n0 B
require_auth( _self );
constexpr size_t max_stack_buffer_size = 512;6 k, Q2 C8 V9 x9 l4 N
size_t size = action_data_size();" g* V+ [9 }4 E7 x/ ] Q
char* buffer = (char*)( max_stack_buffer_size
所有方法通过eosio.bios.cpp中的EOSIO_ABI宏进行封装,映射给开发者使用。 t+ t/ V5 d! f. T& c; m" k
require_auth(),通过C/C++ API参考查询得知,此方法定义在action.h中,作用为验证提供的身份验证集中是否存在指定的帐户。+ h5 G' I3 n6 m( u0 {) H
eosio.bios中所有具体的操作,都定义在privileged.h中,在此都为调用。
privileged.h包含的具体方法的作用和参数定义可以结合 https://developers.eos.io/eosio-cpp/reference#privileged 和源码一起看。