Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

eosio.bios源码分析

温室小书生室d
109 0 0
前提
! k. n7 E' M9 y& \. n' \. C目标
/ }) N2 Q. q2 Z! r9 m; p; L从基础的智能合约中分析代码结构,了解调用方式和合约的作用。& H+ J# G( j" Z5 Q% e
软件版本+ C" Z3 y( t- ~, U- X" n
  • eos版本:v1.1.1
  • 操作系统:centos 7
    8 D7 S# g+ U6 l( U- V0 z& O# `! _

    ( M! s" j" B  A, D$ {, x. T# x建议阅读前先了解:https://blockflow.net/t/topic/6632 y9 K6 X' Q: L
    参考文档:7 i1 n1 }9 P5 @" x, o4 S9 h  V" O
  • C/C++ API参考
  • 智能合约介绍' J2 u; N6 x, x; h6 g

    8 G' e! e* r# a7 ~5 l6 G* |- a! TEOSIO提供了一组服务和接口,使合同开发人员能够" `& e3 b: [) ?
    跨action保持状态。其中包括:
    ) q0 U! a  z* \& k2 M
  • 提供在数据库中保持状态的服务
  • 增强查询功能以查找和检索数据库内容
  • 针对以上功能提供C ++ API,供合同开发人员使用 /eos/contracts/eosiolib/.hpp,.cpp 文件
  • 访问核心服务的C API,对库和系统开发人员有用 /eos/contracts/eosiolib/*.h 文件
    - w5 V! T1 H* x# _5 v. O/ y' D, h' e3 w% N
    简介
    : M/ ^; \' R1 p% ?+ ^3 Y$ Qbios全称是:Basic Input/Output System(基本输入/输出系统)。; K6 o" ^: ~8 Z, |* M0 M" j% D
    部署方式3 b+ f2 P! v- B1 I) Q4 g# A+ m+ V
    cloes set contract eosio ./contracts/eosio.bios/ -p eosio
    ) c( G& w- R4 i7 x, O' ]源码分析
    3 n* g3 I/ i' z$ W9 O' a7 |+ h项目结构
    # H" s3 `' M: Y$ h├── CMakeLists.txt 产生Makefile文件,通过make命令编译和链接所需要程序。
    " E: s; m! }* X9 q( f$ y" {├── eosio.bios.abi 数据结构和接口- Z. j. y$ U" z5 x9 U
    ├── eosio.bios.cpp 核心逻辑代码& t6 g, Y0 b$ V% _! b$ P
    └── eosio.bios.hpp 头文件类及其成员声明
    7 Y' n) X- G9 P3 N' X- ^核心eosio.bios.hpp  M$ V% P% O; T2 p7 y! e, k. @- k9 [
    #pragma once
    4 \. Z+ N% o0 |3 \#include
    5 r5 I$ g; z' i+ r3 S+ Y$ w$ l* y#include ' C! @7 W+ C, i5 O# g
    namespace eosio {
    ! ]6 @: f& o5 K5 G" w2 v   class bios : public contract {
    7 [5 x* z$ ^1 u# I: [      public:5 s0 b/ y9 e" _" r3 N" F; R
             bios( action_name self ):contract(self){}" w: I% s& @- P# {* e
            
    & U. J5 o4 b" g& B' |- u0 v& x9 C$ E         //设置账号权限7 V# u: J, U& ~9 ~( [2 ~! Q8 L
             void setpriv( account_name account, uint8_t ispriv ) {8 W2 k2 ]  f# J: d: f& c# }/ W
                require_auth( _self );
    # T8 g: G+ F9 {, o  a6 l' Z            set_privileged( account, ispriv );
    9 k; c2 F" M1 `) P         }
    6 x4 i" G0 b+ ^' j9 \' c$ L         //限制账号资源
    2 e+ _9 F, K: R( r1 M7 L         void setalimits( account_name account, int64_t ram_bytes, int64_t net_weight, int64_t cpu_weight ) {
      \: e; A' l  k: c2 X. [& R            require_auth( _self );& K, X  F8 m4 V; C
                set_resource_limits( account, ram_bytes, net_weight, cpu_weight );6 E/ J( Q5 u% b3 w
             }
    / P& Y$ }( i1 T- @) ]# N5 |) m" H8 c         //设置区块链资源,无任何操作,暂时无效* G; R5 f8 y. a% |
             void setglimits( uint64_t ram, uint64_t net, uint64_t cpu ) {( ?- C9 h  L" g( \6 [' q8 ?
                (void)ram; (void)net; (void)cpu;
    / T, h8 `6 j2 ]" G8 @! a" j3 {4 h  |            require_auth( _self );+ a- U. ~8 V$ ^( W/ C
             }! E. o- ^5 s  j9 r
             //设置生产节点
    / \/ R% P2 u8 F) `         void setprods( std::vector schedule ) {6 I3 ]' S3 n( K3 M; x
                (void)schedule; // schedule argument just forces the deserialization of the action data into vector (necessary check)
    , m) ^7 c: U7 x2 p: _            require_auth( _self );. m4 L. ^) W" [# w
                constexpr size_t max_stack_buffer_size = 512;
    1 A5 p: p3 [( B% }5 P# n6 L, U, ]" J            size_t size = action_data_size();
    5 T7 {  p$ W1 Z$ s            char* buffer = (char*)( max_stack_buffer_size   x4 _( b' K7 w+ L% A
    所有方法通过eosio.bios.cpp中的EOSIO_ABI宏进行封装,映射给开发者使用。
    ( v3 c) @/ |, [& R* Trequire_auth(),通过C/C++ API参考查询得知,此方法定义在action.h中,作用为验证提供的身份验证集中是否存在指定的帐户。* v  u% h4 Z+ W8 B! @1 I
    eosio.bios中所有具体的操作,都定义在privileged.h中,在此都为调用。4 d/ Z/ \3 l1 P4 t& ~
    privileged.h包含的具体方法的作用和参数定义可以结合 https://developers.eos.io/eosio-cpp/reference#privileged 和源码一起看。
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

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

      0

    • 关注

      0

    • 主题

      13