目标
从基础的智能合约中分析代码结构,了解调用方式和合约的作用。7 @* V, k: i: r( N& S0 Q) o" P, r, M
软件版本# r' n$ i: [# g K
建议阅读前先了解:https://blockflow.net/t/topic/6637 A+ o/ i. {3 z! {3 B/ y* W6 X
参考文档:4 D9 |- y' B6 Z, m* b0 [6 }
EOSIO提供了一组服务和接口,使合同开发人员能够0 P+ ^" a# `" j9 ^
跨action保持状态。其中包括:
简介, j% F4 l+ k3 { x1 J6 b
bios全称是:Basic Input/Output System(基本输入/输出系统)。
部署方式
cloes set contract eosio ./contracts/eosio.bios/ -p eosio# L& F3 |% x* T3 E% D3 y
源码分析
项目结构
├── CMakeLists.txt 产生Makefile文件,通过make命令编译和链接所需要程序。
├── eosio.bios.abi 数据结构和接口
├── eosio.bios.cpp 核心逻辑代码
└── eosio.bios.hpp 头文件类及其成员声明/ J" b3 r Y- m/ `4 e. G
核心eosio.bios.hpp. [/ R5 t4 y) m
#pragma once+ d3 r) ]0 t8 j1 H# [5 |5 B0 f) d
#include . D3 [; J: Q5 l, I
#include - k" u4 F) H* K/ T2 C& Z; i
namespace eosio {. J4 c: K/ {) K. Z4 q! k3 ]. E
class bios : public contract {6 k( h- y4 ?& O5 b$ B/ U6 B
public:
bios( action_name self ):contract(self){}0 J7 \8 b) }% I- v- H
//设置账号权限. p4 c* M X( {
void setpriv( account_name account, uint8_t ispriv ) {
require_auth( _self );
set_privileged( account, ispriv );# N: c) u7 L: |" i
}+ H4 P% @7 W6 y, e) A1 Q
//限制账号资源, u5 v C9 _& z& H# o$ W
void setalimits( account_name account, int64_t ram_bytes, int64_t net_weight, int64_t cpu_weight ) {7 r1 b* L9 |2 D" @; L
require_auth( _self );
set_resource_limits( account, ram_bytes, net_weight, cpu_weight );
}" D( D. b0 ]0 L- X
//设置区块链资源,无任何操作,暂时无效" d2 B3 [: N [2 y+ O/ I# o
void setglimits( uint64_t ram, uint64_t net, uint64_t cpu ) {
(void)ram; (void)net; (void)cpu;5 f1 v) {) f) L/ d7 m: }" V
require_auth( _self );
}% [% N/ R% q0 c* {. n$ D
//设置生产节点( ~& k4 }$ K6 ] A, ~
void setprods( std::vector schedule ) {
(void)schedule; // schedule argument just forces the deserialization of the action data into vector (necessary check)2 d$ p( O6 l/ K' z; K7 J, p
require_auth( _self );
constexpr size_t max_stack_buffer_size = 512;4 y: b7 b/ T; w9 G/ M6 p, e6 s! ~
size_t size = action_data_size();, A: E, \2 P6 q% o
char* buffer = (char*)( max_stack_buffer_size : R O0 i8 |9 ?* X
所有方法通过eosio.bios.cpp中的EOSIO_ABI宏进行封装,映射给开发者使用。
require_auth(),通过C/C++ API参考查询得知,此方法定义在action.h中,作用为验证提供的身份验证集中是否存在指定的帐户。! s& j' N; S, X( S
eosio.bios中所有具体的操作,都定义在privileged.h中,在此都为调用。
privileged.h包含的具体方法的作用和参数定义可以结合 https://developers.eos.io/eosio-cpp/reference#privileged 和源码一起看。