Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

eosio.bios源码分析

温室小书生室d
108 0 0
前提$ }$ {9 v1 j9 Y: p
目标
9 C/ N5 n3 d4 `: F9 m; v# ]5 y; P8 C从基础的智能合约中分析代码结构,了解调用方式和合约的作用。7 @* V, k: i: r( N& S0 Q) o" P, r, M
软件版本# r' n$ i: [# g  K
  • eos版本:v1.1.1
  • 操作系统:centos 7( Z% x& d( A0 p& }1 Y% N0 q

    * K8 ^1 @, O$ N/ a$ b8 Z* N建议阅读前先了解:https://blockflow.net/t/topic/6637 A+ o/ i. {3 z! {3 B/ y* W6 X
    参考文档:4 D9 |- y' B6 Z, m* b0 [6 }
  • C/C++ API参考
  • 智能合约介绍4 n; H" n; \3 _2 E
    0 P, m" U: S" J5 Z& V
    EOSIO提供了一组服务和接口,使合同开发人员能够0 P+ ^" a# `" j9 ^
    跨action保持状态。其中包括:
    ; Q. P0 L/ N+ |- Q
  • 提供在数据库中保持状态的服务
  • 增强查询功能以查找和检索数据库内容
  • 针对以上功能提供C ++ API,供合同开发人员使用 /eos/contracts/eosiolib/.hpp,.cpp 文件
  • 访问核心服务的C API,对库和系统开发人员有用 /eos/contracts/eosiolib/*.h 文件
    # F. K3 c5 j3 C" u# R
    0 W" e0 J0 N/ @. i简介, j% F4 l+ k3 {  x1 J6 b
    bios全称是:Basic Input/Output System(基本输入/输出系统)。
    $ P9 i% X3 r% y( W+ D8 g, X部署方式
    8 W0 B( m, p; [! hcloes set contract eosio ./contracts/eosio.bios/ -p eosio# L& F3 |% x* T3 E% D3 y
    源码分析
    ' v2 r7 d' W: _( l1 m6 R/ x项目结构
    . D( L( f; ^3 U9 M6 e├── CMakeLists.txt 产生Makefile文件,通过make命令编译和链接所需要程序。
    . t1 |; z4 I; r3 S6 x+ {├── eosio.bios.abi 数据结构和接口
    & `1 l  N  z6 X( P* C- m" @- Q├── eosio.bios.cpp 核心逻辑代码
    8 T1 n% o, v2 J9 S, H# I" [/ e└── 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:
    , M2 a# k# v' `* S$ q  l         bios( action_name self ):contract(self){}0 J7 \8 b) }% I- v- H
            
    ) y/ P+ E( j3 O/ _% ?8 Y         //设置账号权限. p4 c* M  X( {
             void setpriv( account_name account, uint8_t ispriv ) {
    0 R# \+ \2 b- a            require_auth( _self );
    8 c( }" }5 @, X- W) H0 ^+ }) N5 w            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 );
    ( |! K2 j( E, g            set_resource_limits( account, ram_bytes, net_weight, cpu_weight );
    6 J8 Y2 O5 K+ |. R$ t' i         }" 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 ) {
    ' L1 h! S0 B8 a6 C$ O            (void)ram; (void)net; (void)cpu;5 f1 v) {) f) L/ d7 m: }" V
                require_auth( _self );
    " S7 t7 Q0 Y# v, E% z+ n         }% [% N/ R% q0 c* {. n$ D
             //设置生产节点( ~& k4 }$ K6 ]  A, ~
             void setprods( std::vector schedule ) {
    * v, i8 D, t. y6 |            (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 );
    ; b" l9 d( t: `- v# _: u: D) X3 ~/ u* f! B            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宏进行封装,映射给开发者使用。
    % ]/ ]6 v5 T! f5 Nrequire_auth(),通过C/C++ API参考查询得知,此方法定义在action.h中,作用为验证提供的身份验证集中是否存在指定的帐户。! s& j' N; S, X( S
    eosio.bios中所有具体的操作,都定义在privileged.h中,在此都为调用。
    ! @9 G4 o" Q( m3 N3 n! g9 s+ r9 ^privileged.h包含的具体方法的作用和参数定义可以结合 https://developers.eos.io/eosio-cpp/reference#privileged 和源码一起看。
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    温室小书生室d 初中生
    • 粉丝

      0

    • 关注

      0

    • 主题

      13