目标! H$ }3 d$ i% m/ _
从基础的智能合约中分析代码结构,了解调用方式和合约的作用。4 Y+ n/ m0 } y- _. e3 u6 Y5 `& _. L
软件版本( ]8 q+ b5 Y- r! W! S C% L3 @
建议阅读前先了解:https://blockflow.net/t/topic/663
参考文档: t& ~5 W: n4 d
EOSIO提供了一组服务和接口,使合同开发人员能够4 c7 {+ R( E8 w1 x/ i9 ?
跨action保持状态。其中包括:
简介6 X( @& z' b* ^# X# L; U' w
bios全称是:Basic Input/Output System(基本输入/输出系统)。; d+ j. G) }# p0 x# O
部署方式
cloes set contract eosio ./contracts/eosio.bios/ -p eosio2 p) W2 q8 ^8 S( k2 P) k3 Q
源码分析
项目结构) x+ E# W% W5 x# z1 r& X) U
├── CMakeLists.txt 产生Makefile文件,通过make命令编译和链接所需要程序。
├── eosio.bios.abi 数据结构和接口
├── eosio.bios.cpp 核心逻辑代码& h# \5 G& d# I1 z
└── eosio.bios.hpp 头文件类及其成员声明, p# R5 y* { u6 a
核心eosio.bios.hpp
#pragma once
#include G6 C3 p' p1 n6 @1 S& J6 h: Y* c
#include ; D6 f* K0 l8 d$ X
namespace eosio {& T! H7 h' D& M* @. P
class bios : public contract {3 z$ A4 F$ f) ~8 ]; B
public:! f: {0 A' b |! b/ i
bios( action_name self ):contract(self){}) v- O3 B; X- C
//设置账号权限5 d8 b! i9 r9 ^ Y U0 V4 U1 ]
void setpriv( account_name account, uint8_t ispriv ) {
require_auth( _self );
set_privileged( account, ispriv );
}
//限制账号资源
void setalimits( account_name account, int64_t ram_bytes, int64_t net_weight, int64_t cpu_weight ) {: T. T2 z& Q" c. k9 J8 x
require_auth( _self );
set_resource_limits( account, ram_bytes, net_weight, cpu_weight );9 y+ k6 f4 }7 K* ^' s& v3 b
}2 k+ j2 Q3 Z, L# s8 h
//设置区块链资源,无任何操作,暂时无效
void setglimits( uint64_t ram, uint64_t net, uint64_t cpu ) {% [7 g# _* Y, u- I% X$ Y" M' T
(void)ram; (void)net; (void)cpu;. Y. Y. `! q: ?4 |5 T: M
require_auth( _self );1 u' X/ ?/ T, P1 f1 p* V
}
//设置生产节点
void setprods( std::vector schedule ) {
(void)schedule; // schedule argument just forces the deserialization of the action data into vector (necessary check). e) r6 G& P! m4 y* M
require_auth( _self );$ T! e( a! s) M4 p
constexpr size_t max_stack_buffer_size = 512;, ^8 R! K* I1 @% P! `# q7 y
size_t size = action_data_size();3 P! |/ M) o( y' [: I0 n. z5 t8 s" J
char* buffer = (char*)( max_stack_buffer_size 3 _. {$ q( P6 \% K. C3 z
所有方法通过eosio.bios.cpp中的EOSIO_ABI宏进行封装,映射给开发者使用。
require_auth(),通过C/C++ API参考查询得知,此方法定义在action.h中,作用为验证提供的身份验证集中是否存在指定的帐户。2 s' h4 U' Y. ]
eosio.bios中所有具体的操作,都定义在privileged.h中,在此都为调用。
privileged.h包含的具体方法的作用和参数定义可以结合 https://developers.eos.io/eosio-cpp/reference#privileged 和源码一起看。