目标
从基础的智能合约中分析代码结构,了解调用方式和合约的作用。# c9 o$ j) E+ a/ U( z
软件版本. l4 u. _* C1 X8 Q
建议阅读前先了解:https://blockflow.net/t/topic/663
参考文档:
EOSIO提供了一组服务和接口,使合同开发人员能够& u* y4 }/ T+ I. m
跨action保持状态。其中包括:- [$ W! U h) V& I/ C2 o; m y
简介
bios全称是:Basic Input/Output System(基本输入/输出系统)。
部署方式
cloes set contract eosio ./contracts/eosio.bios/ -p eosio V9 Y+ Y8 n1 `
源码分析1 q$ k4 Y# Q* Z$ }8 K% t
项目结构
├── CMakeLists.txt 产生Makefile文件,通过make命令编译和链接所需要程序。
├── eosio.bios.abi 数据结构和接口
├── eosio.bios.cpp 核心逻辑代码
└── eosio.bios.hpp 头文件类及其成员声明8 i- V6 y5 n# P0 r- v; M
核心eosio.bios.hpp
#pragma once
#include
#include 2 o0 X2 L' b4 ?/ b- l: `2 R' Y
namespace eosio {; M. E3 H c: B" b# D; c( @
class bios : public contract { F! B! S* n5 |7 J, X; `
public:
bios( action_name self ):contract(self){}/ X- J/ c: M, s. E5 e
( G9 R" g1 L6 T
//设置账号权限1 X: O5 T. O! J. K) ]) `8 [6 e
void setpriv( account_name account, uint8_t ispriv ) {. k$ k9 h2 s3 s1 E- A+ L: u- v p: Y
require_auth( _self );
set_privileged( account, ispriv );5 o9 N: c9 W; i7 \7 B7 b
}
//限制账号资源* i. |+ Z( |' y+ R& ]4 M
void setalimits( account_name account, int64_t ram_bytes, int64_t net_weight, int64_t cpu_weight ) {
require_auth( _self );2 M! \' Q1 u' V
set_resource_limits( account, ram_bytes, net_weight, cpu_weight );1 Q2 u7 f" n$ }1 I
}8 I' T* R' T# `7 T4 C- W. a
//设置区块链资源,无任何操作,暂时无效6 W/ _, n D! J8 B2 G; d; u! W
void setglimits( uint64_t ram, uint64_t net, uint64_t cpu ) {
(void)ram; (void)net; (void)cpu;' I% I; T! X7 v/ k' n M! U2 d
require_auth( _self );: g8 }3 X1 y! g
}7 u+ I t" c) W1 U9 n* X2 G7 ~. E
//设置生产节点- `( ?2 y% [; t, N7 W* c" ~
void setprods( std::vector schedule ) {
(void)schedule; // schedule argument just forces the deserialization of the action data into vector (necessary check)/ ~ F: {" ?# u; f/ [4 l9 C4 n
require_auth( _self );. J& y9 s& t* d! |7 Y/ f, a$ b$ u
constexpr size_t max_stack_buffer_size = 512;- K K- T- {- ]' A( r$ t
size_t size = action_data_size();
char* buffer = (char*)( max_stack_buffer_size ) M$ A N$ b3 f* o2 j* |
所有方法通过eosio.bios.cpp中的EOSIO_ABI宏进行封装,映射给开发者使用。( E6 | {$ G' s) [' @3 P
require_auth(),通过C/C++ API参考查询得知,此方法定义在action.h中,作用为验证提供的身份验证集中是否存在指定的帐户。' W& M9 o; _7 `+ O( H, V. b$ Q; K2 @
eosio.bios中所有具体的操作,都定义在privileged.h中,在此都为调用。4 i' }* {2 Q$ F1 V" j$ S
privileged.h包含的具体方法的作用和参数定义可以结合 https://developers.eos.io/eosio-cpp/reference#privileged 和源码一起看。