EOSIO源码分析 - EOSIO简介

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

什么是EOSIO

EOS可以理解为Enterprise Operation System即为商用分布式应用设计的一款区块链操作系统。EOS是引入的一种新的区块链架构旨在实现分布式应用的性能扩展。它并不是像比特币和以太坊那样的货币而是基于EOS软件项目之上发布的代币被称为区块链3.0。
EOS是提供智能合约计算的可编程区块链他是由位于美国的一家名为block.one的公司开发全程采用C++语言来实现智能合约采用剪辑过的C++语言来实现相比于以太坊拥有更高的TPSEOS没有手续费它是按照用户所消耗的资源来间接收费的。

获取EOSIO

二进制安装

  • MacOS
brew tap eosio/eosio
brew install eosio
  • Ubuntu
wget https://github.com/eosio/eos/releases/download/v2.1.0/eosio_2.1.0-1-ubuntu-20.04_amd64.deb
sudo apt install ./eosio_2.1.0-1-ubuntu-20.04_amd64.deb
  • CentOS
wget https://github.com/eosio/eos/releases/download/v2.1.0/eosio-2.1.0-1.el8.x86_64.rpm
sudo yum install ./eosio-2.1.0-1.el8.x86_64.rpm

EOSIO代码结构

获取源代码

git clone https://github.com/EOSIO/eos.git --recursive
–recursive参数一定要加上否则取到的代码只是最基本的框架代码EOSIO引用的第三方代码取不到

源代码结构

EOSIO的整体代码结构比较简单整体采用插件模式来组织代码(以V2.0.13为例)核心结构如下

EOSIO 
   |-----CMakeModules 相关第三库的自动编译脚本如最重要的VM
   |-----libraries
        |-----appbase: 插件框架库负责整个程序的特别是nodeos程序的初始化插件的初始化及启动
        |-----builtins: 虚拟机内建对象特别是对于浮点结构的支持
        |-----chain: 整个链最核心的代码负责链初始化交易鉴权交易执行块打包等核心任务
        |-----fc: 基础库代码完成结构打包json反射压缩加密解密等最基础任务
        |-----chainbase: 高效eosio设计的内存映射数据库实现对数据的快速访问与修改最重要是实现了和eosio对应的数据回滚机制
        |-----eos-vm: 支持合约运行的WASM虚拟机
        |-----softfloat: 提供对于浮点运算的支持
        |-----wabt: 工具软件包拓展wasm应用
        |-----yubihsm: 一种安全库提供对钱包的支持
        |-----CMakeLists.txt 编译清单文件
   |-----plugins
        |-----chain_plugin: 核心库实现链的初始化控制与访问等业务
        |-----net_plugin: 核心库实现P2P完成交易广播块分布式存储等业务
        |-----producer_plugin: 核心库完成块生产共识交易执行调度等核心业务
        |-----chain_api_plugin: 提供对chain_plugin的访问如发送交易查询用户等
        |-----net_api_plugin: 提供对net_plugin的访问如链接节点获取链接状态等
        |-----producer_api_plugin: 提供对producer_plugin的访问如控制生产设置给白名单等
        |-----http_plugin: 封装http基础服务功能
        |-----wallet_plugin: 实现钱包相关功能如钱包创建公私钥存储等
        |-----wallet_api_plugin: 实现对wallet_plugin的访问如最核心的交易签名
        |-----CMakeLists.txt 编译清单文件
   |-----programs
        |-----cleos: 客户端命令行程序使用此程序可以实现对链的访问如发送交易查询账号生产投票链接其他节点
        |-----keosd: 钱包服务程序钱包服务可以启动多个可以根据业务需求灵活部署也可以自己开发钱包服务
        |-----nodeos: 节点服务程序也是最核心的程序负责区块同步交易生产等
        |-----CMakeLists.txt 编译清单文件
   |-----scripts
        |-----eosio_build.sh: 编译shell脚本,根据系统自己编译出目标程序
        |-----generate_package.sh: 可以将编译出来的二进制程序按照各自系统打包成如debrpm等安装包
   |--CMakeLists.txt 编译清单文件

源码编译

./scripts/eosio_build.sh

运行此脚本时系统会自动安装需要的第三方库笔者在Ubunut18.0420.04CentOS7上测试过如果想了解编译过程可以详细查看scripts下的相关脚本
注意如果要编译Debug版本系统资源最好大一点特别是编译出来的nodeos程序大小达到1G以上

EOSIO框架

在这里插入图片描述

从框架图中我们可以看到

  • 对于链来说只有一个nodeos程序nodeos主动接入主网
  • 用户通过cleos命令行来操作钱包keosd和nodeos这两个程序都可以自己开发
  • 钱包是用户的私产和链没有互通关系需要谨慎保存防止丢失用户可以创建多个钱包

启动与部署EOSIO

keosd 启动

./keosd \
    --http-server-address=0.0.0.0:8900 \
    --http-validate-host=false >>  ./logs/keosd.log 2>&1 &

钱包的数据文件默认存储在/root/eos-wallet目录下每个钱包都有一个单独的钱包文件默认为 default.wallet

nodeos 启动

./nodeos -e -p eosio \
    --data-dir ./data/nodeos \
    --signature-provider=EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 \
    --p2p-listen-endpoint=0.0.0.0:9878 \
    --plugin eosio::producer_api_plugin --plugin eosio::chain_api_plugin --plugin eosio::net_api_plugin \
    --http-server-address=0.0.0.0:8888 \
    --http-validate-host=false
    --replay-blockchain >>  ./logs/nodeos.log 2>&1 &

对于创始节点的启动生产名称一定要配制成eosio否则会不生产。EOSIO默认0.5s一个块要在某个节点发送交易需要配置插件chain_api_plugin 需要特别注意的是配置mongo_dn_plugin插件nodeos程序需要开启支持mongo开关然后重新编译程序。

EOSIO链部署

关于EOSIO的部署因为整个EOSIO提供的是智能合约运行的基础架构机制所以要完成某个具体的业务逻辑是需要部署对应的合约才能完成。

EOSIO中最重要的两个合约是eosio.system,eosio.token两个合约前者提供了生产投票相关的逻辑服务后者则提供了代币服务。

eosio合约的编译需要eosio.cdt工具将开发的合约文件编译成wasm程序同时生成ABI文件生成合约文件后才能完成部署。

下面给出一个基本的合约部署流程

wallet_url=0.0.0.0:8900
node_url=0.0.0.0:8888
# 创建钱包
WALLET_PASSWD=`./cleos --wallet-url $wallet_url -u $node_url wallet create --to-console`
export passeord=`echo $WALLET_PASSWD | awk -F"\"" '{print $2}'`
echo "$passeord" > key.txt
echo "get password : $passeord"
# 导入创世公私钥
./cleos --wallet-url $wallet_url -u $node_url wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
# 导入私钥创建用户
ONE_ACCOUNT=eosio.token

echo "---- imports private ($ONE_ACCOUNT) keys ----"
key_OWNER=`./cleos  --wallet-url $wallet_url -u $node_url create key --to-console`
key_ACTIVE=`./cleos  --wallet-url $wallet_url -u $node_url create key --to-console`
a_owner=`echo $key_OWNER | awk -F" " '{print $3}'`
./cleos --wallet-url $wallet_url -u $node_url wallet import --private-key $a_owner
a_ative=`echo $key_ACTIVE | awk -F" " '{print $3}'`
./cleos --wallet-url $wallet_url -u $node_url wallet import --private-key $a_ative

a_private_owner=$a_owner
a_private_ative=$a_ative

a_owner=`echo $key_OWNER | awk -F" " '{print $6}'`
a_ative=`echo $key_ACTIVE | awk -F" " '{print $6}'`
./cleos --wallet-url $wallet_url -u $node_url create account eosio $ONE_ACCOUNT $a_owner $a_ative
# 部署合约 发送交易
./cleos --wallet-url $wallet_url -u $node_url set contract eosio.token ./contracts/eosio.token/ -p eosio.token@active

./cleos --wallet-url $wallet_url -u $node_url push action eosio.token create '[ "eosio", "10000000000.0000 '$bioscurrencysymbol'" ]' -p eosio.token
./cleos --wallet-url $wallet_url -u $node_url push action eosio.token issue '[ "eosio", "1000000000.0000 '$bioscurrencysymbol'", "memo" ]' -p eosio
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6