目标
从基础的智能合约中分析代码结构,了解调用方式和合约的作用。
软件版本/ e+ ?5 g0 O3 b3 q/ J
建议阅读前先了解:https://blockflow.net/t/topic/663
参考文档: N% b6 k# g4 q; C$ N9 T c
EOSIO提供了一组服务和接口,使合同开发人员能够
跨action保持状态。其中包括:$ Z2 Y& a% B, Q" F+ g
简介/ H3 s; c3 ^/ \ k: |6 E$ \( Y1 K
bios全称是:Basic Input/Output System(基本输入/输出系统)。8 m7 @& z- y3 Z! v; K& f
部署方式1 R, _1 X/ z$ O9 E! h. H- J3 v
cloes set contract eosio ./contracts/eosio.bios/ -p eosio
源码分析# K5 s* L4 Y9 g; B6 ?, b! o1 Y
项目结构
├── CMakeLists.txt 产生Makefile文件,通过make命令编译和链接所需要程序。
├── eosio.bios.abi 数据结构和接口
├── eosio.bios.cpp 核心逻辑代码
└── eosio.bios.hpp 头文件类及其成员声明
核心eosio.bios.hpp& g; A3 P! v7 [: Z6 C4 j! z
#pragma once/ n8 M" C/ J% P- V
#include
#include
namespace eosio {& b- m. P6 T1 C/ H
class bios : public contract {; T7 V5 }3 O) A. l9 e) W
public:
bios( action_name self ):contract(self){}2 V2 ]; i' h4 [; M+ s
//设置账号权限
void setpriv( account_name account, uint8_t ispriv ) {
require_auth( _self );
set_privileged( account, ispriv );2 ^! _% G% r, I0 A" `* j
}
//限制账号资源
void setalimits( account_name account, int64_t ram_bytes, int64_t net_weight, int64_t cpu_weight ) {
require_auth( _self );
set_resource_limits( account, ram_bytes, net_weight, cpu_weight );
}$ k M. x, E) m& B
//设置区块链资源,无任何操作,暂时无效4 ~7 { T6 d6 C/ O# p
void setglimits( uint64_t ram, uint64_t net, uint64_t cpu ) {
(void)ram; (void)net; (void)cpu;! v8 |6 l' c+ t
require_auth( _self );0 X# B/ x. p4 p% h$ J+ O2 y5 s
}
//设置生产节点
void setprods( std::vector schedule ) {1 u# Y Y. d% C+ R3 I* |6 }
(void)schedule; // schedule argument just forces the deserialization of the action data into vector (necessary check)* m8 O$ q1 r: W q3 i* j# q, r+ ~1 m
require_auth( _self );
constexpr size_t max_stack_buffer_size = 512;1 G- `7 t2 J5 ]" J5 r6 \
size_t size = action_data_size();
char* buffer = (char*)( max_stack_buffer_size
所有方法通过eosio.bios.cpp中的EOSIO_ABI宏进行封装,映射给开发者使用。
require_auth(),通过C/C++ API参考查询得知,此方法定义在action.h中,作用为验证提供的身份验证集中是否存在指定的帐户。
eosio.bios中所有具体的操作,都定义在privileged.h中,在此都为调用。; j3 c0 F/ z" \" t- i
privileged.h包含的具体方法的作用和参数定义可以结合 https://developers.eos.io/eosio-cpp/reference#privileged 和源码一起看。