EOS开发扩展(一)

一、网络层

1.1 EOS网络视图:

1.2 核心网络层

EOSIO网络的核心是块生产者和其所在服务器。完整的EOSIO网络由21个生产节点组成,这些节点已由网络社区投票选出,通过网络连接在一起,生产这之间可以流畅地通信。
这一层网络的关键设计目标是使生产节点专注于生成块并在它们之间进行同步。每个服务器都配备了高处理能力和大的内存,大的磁盘(用于日志存储),通过高容量冗余链路连接,受防火墙保护。如果运行服务器出现问题,备份服务器可以接管。
核心网络

1.3 访问网络层

在消费层和核心层的生产者之间进行过滤和缓冲,保证核心层的高效运转。

根据功能可分为: API 、 Seed 、 Proxy 节点。
(1)API节点处理来自cleos的请求以执行事务和查询状态,每个生产者节点应至少具有一个关联的API节点。
(2)seed节点:seed节点与其他节点节点通信,以便与生产者节点保持同步。 可能是生产者候选者,它们与生产者保持同步并为其他节点提供服务,并因此建立了他们作为生产者的能力,希望得到社区投票。也可以进行区块链间通信,提供对另一个区块链的访问。 可以隔离生产者和网络上的其他节点之间。 一种重要类型是验证节点,验证类型节点在Access或Consumer 网络中运行,并跟踪区块链。
seed节点通常仅使用EOSIO网络协议传送块(而不是事务),并且未配置为运行http协议(即不能通过cleos访问)。每个生产者节点应至少具有一个关联的seed节点。
(3)Proxy 代理节点:提供负载均衡和DDOS保护。

1.4 消费网络层

任何使用区块链的用户,包括直接通过cleos、间接使用与区块链接口的某些应用程序。

二、系统自带合约

2.1 eosio.bios

基本操作,设置帐户和全局操作限制、权限、生产者以及建立授权级别。

2.2 eosio.token

提供基本货币管理功能。包括创建货币、发行货币、转移货币。

2.3 eosio.msig

进行所需授权级别的多个签名。

2.4 eosio.system

让用户可以使用token,对生产者和工作人员进行配置和投票提案,可以经济且有效地建立和管理区块链。

三、BIOS 启动顺序

3.1 配置初始的nodeos节点集

将启动一些nodeos节点,将它们指向彼此,并最终对一组生产者进行投票。 所有nodeos节点都在同一服务器上运行。
(1) 为每个nodeos创建配置和数据目录

//在nodeos命令行上将这些目录与--config-dir和--data-dir参数一起使用。
$ mkdir ~/eosio_test
$ for (( i = 1; i <= 5; i++ )); do for (( j = 1 ; j <=5 ; j++ )); do mkdir ~/eosio_test/accountnum$i$j; done; done

(2)准备用于对等通信的IP地址
将生产者指向彼此,以便进行对等通信。确定每个nodeos节点之间的对等通信的IP地址和端口号集,可以通过在启动nodeos时在命令行上设置p2p-peer-address配置属性(每个对等体一个参数),或者通过在config.ini文件中为nodeos设置属性(每个对等体一行)来配置每个nodeos 。

//例如,假设我们为生产者使用端口号9011-9055(即分别为accountnum11-accountnum55),请在nodes命令行上为accountnum12包含以下参数:
--p2p-peer-address localhost:9011 --p2p-peer-address localhost:9013 --p2p-peer-address localhost:9014 ...
//或者在config.mini里设置
p2p-peer-address = localhost:9011
p2p-peer-address = localhost:9013
p2p-peer-address = localhost:9014
...

无论是使用命令行还是配置文件方法,都注意不要在生成器列表中包含生产者自己的地址。

3.2 启动 “genesis” 节点

“genesis”节点是开始的第一个节点,它将生成区块链。 所有其他节点将从genesis节点派生。 在genesis节点上执行以下操作。
(1)创建一个钱包wallet

$ cleos wallet create

(2)配制genesis.json
位置:eos/tutorials/bios-boot-tutorial
作用:genesis.json文件定义了初始链状态。所有节点必须从相同的初始状态开始。有以下两个重要属性:
initial_timestamp:区块链的开始时间
initial_key :将使用该密钥对启动genesis节点,并使用此密钥对创建eosio的所有帐户。与genesis nodeos的公钥相匹配. 密钥对可以通过nodeos命令行 –private-key 指定,或 config.ini 的 private-key属性。
(3)为eosio帐户创建密钥:

$ cleos create key  

(4)启动genesis 节点

$ nodeos -e -p eosio --private-key '[ "${pub-key}","${private-key}" ]' --plugin eosio::producer_plugin --plugin eosio::chain_api_plugin --plugin eosio::http_plugin --plugin eosio::history_api_plugin

3.3 创建重要的系统账户

//系统账户
  eosio.bpay
  eosio.msig
  eosio.names
  eosio.ram
  eosio.ramfee
  eosio.saving
  eosio.stake
  eosio.token
  eosio.vpay

重复以下过程:

$ cleos create key  # for eosio.bpay
$ cleos wallet import ${private-key}
$ cleos create account eosio eosio.bpay ${owner-key}  ${active-key}

3.4 创建eosio.token合约

此合约可以创建,发布,传输和获取有关token的信息。

$ cleos set contract eosio.token  /eos/build/contracts/eosio.token

3.5 创建eosio.msig合约

作用:启用并简化了权限级别的定义和管理、执行多签名操作。

$ cleos set contract eosio.msig  eos/build/contracts/eosio.msig

3.6 创建和分配SYS货币

创建最大值为100亿token的SYS货币,然后发行十亿个代币。 可以用特定货币名称替换SYS。

//在 eosio账户中创建10B SYS tokens ,这有效地创造了最大的代币供应,但不会使任何代币进入流通。 没有流通的代币可以被存储。
$ cleos push action eosio.token create '[ "eosio", "10000000000.0000 SYS" ]' -p eosio.token
executed transaction: 0440461e0d8816b4a8fd9d47c1a6a53536d3c7af54abf53eace884f008429697  120 bytes  326 us  eosio.token <= eosio.token::create          {"issuer":"eosio","maximum_supply":"10000000000.0000 SYS"}
//eosio.token合同将1B SYS token从存储中移除并将其置于流通中。在发行时,token保存在eosio帐户中。 由于eosio帐户拥有未流通的token储备,因此需要其权限才能执行此操作。
$ cleos push action eosio.token issue '[ "eosio", "1000000000.0000 SYS", "memo" ]' -p eosio
executed transaction: a53961a566c1faa95531efb422cd952611b17d728edac833c9a55582425f98ed  128 bytes  432 us eosio.token <= eosio.token::issue           {"to":"eosio","quantity":"1000000000.0000 SYS","memo":"memo"}

3.7 创建eosio.system 合约

此合约包含了几乎所有基于toekn的操作。 一旦启用了系统合同,必须支付资源(cpu,网络,内存)、创建新帐户。 系统合同允许标记放样和未标记,要购买的资源,潜在生产者的注册和投票,生产者奖励认领,设置特权和限制等。

$ cleos set contract eosio  eos/build/contracts/eosio.system

3.8 从单一生产者过渡到多个生产者

此后,将从单个块生成器(创建节点)转换到多个生成器。到目前为止,只有内置的eosio帐户具有特权并且可以对块进行签名。但目标是通过一系列选定的生产者来管理区块链。
选举产生的生产者名单可以改变,规则不是直接向任何生产者提供特权,而是与名为eosio.prods的特殊内置帐户相关联。该帐户代表当选的生产者组。 eosio.prods帐户(实际上是生产者组)使用eosio.msig合同定义的权限进行操作。
安装eosio.system合同后,尽快将eosio.msig设为特权帐户,以便代表eosio帐户进行授权。 eosio将尽快辞去其权威,由eosio.prods接管。

//使eosio.msig成为特权帐户
$ cleos push action eosio setpriv '["eosio.msig", 1]' -p eosio@active

3.9 放置token并扩展网络

至此,完成了单主机单节点的以下合约配置:
eosio.token
eosio.msig
eosio.system
帐户eosio和eosio.msig是特权帐户。 其他eosio帐户已创建但没有特权。接下来绑定账户并扩大生产者网络。

3.10 创建赌注账户

放样是将“真实世界”中的实体(例如,以Crowdsale或其他方式购买某物的个人)获得的令牌分配给EOSIO系统内的账户的过程。
对于初始放样过程可以采用如下方法:
1)0.1令牌:赌注RAM。默认情况下,cleos在创建帐户时会占用8 KB的RAM,由帐户创建者支付。在最初的赌注中,eosio账户是进行赌注的账户创建者。在最初的令牌赌注过程中,赌注的代币在达到最低投票要求之前不能保持不变,且要求为流动。
2)为CPU赌注0.45令牌,为网络赌注0.45令牌。
3)最多9个token可用作流动代币。
4)剩余toekn是赌注50/50 CPU和网络。

Example 1.  accountnum11 has 100 SYS. It will be staked as 0.1000 SYS on RAM; 45.4500 SYS on CPU; 45.4500 SYS on network; and 9.0000 SYS held for liquid use.

Example 2.  accountnum33 has 5 SYS. It will be staked as 0.1000 SYS on RAM; 0.4500 SYS on CPU; 0.4500 SYS on network; and 4.0000 SYS held for liquid use.

使用Pareto分布将1B令牌分发给帐户,模型为80-20规则,即80%的令牌由20%的人口持有。
(1)创建赌注账户
使用以下步骤为每个帐户放置令牌。 必须为每个帐户单独完成这些步骤。

$ cleos create key  # for accountnum11
$ cleos wallet import ${private-key}

使用初始资源和公钥创建一个赌注帐户。
cleossystemnewaccounteosiotransferaccountnum11 c l e o s s y s t e m n e w a c c o u n t e o s i o − − t r a n s f e r a c c o u n t n u m 11 {pubkey} –stake-net “100000.0000 SYS” –stake-cpu “100000.0000 SYS”

3.11 选择生产者

(1)注册为生产者
使用以下命令注册为生产者。 这使得节点成为生产者的候选者,但除非被选举,否则该节点实际上不是生产者。

$ cleos system regproducer accountnum11   ${pubkey}   https://accountnum11.com/${pubkey}

(2)列出生产者

$ cleos system listproducers
Producer      Producer key                                           Url  

(3)启动生产者
使用以下命令启动生成。 由于所有生产者都在单个服务器上运行,因此命令行参数用于确保每个生产者使用自己的目录。
在每个生产者的窗口中,运行以下nodeos命令。

$ nodeos --genesis-json ~/eosio_test/accountnum11/genesis.json --block-log-dir ~/eosio_test/accountnum11/blocks --config-dir ~/eosio_test/accountnum11/ --data-dir ~/eosio_test/accountnum11/ --http-server-address 127.0.0.1:8011 --p2p-listen-endpoint 127.0.0.1:9011 --enable-stale-production --producer-name accountnum11 --private-key '[ "pubkey","privatekey" ]' --plugin eosio::producer_plugin --plugin eosio::chain_api_plugin --plugin eosio::http_plugin --plugin eosio::history_api_plugin --p2p-peer-address localhost:9022  --p2p-peer-address localhost:9033  --p2p-peer-address localhost:9044

为方便起见,可以复制以下命令行以在帐户accountnum22,accountnum33和accountnum44的单独shell窗口中运行nodeos。

$ nodeos --genesis-json ~/eosio_test/accountnum22/genesis.json --block-log-dir ~/eosio_test/accountnum22/blocks --config-dir ~/eosio_test/accountnum22/ --data-dir ~/eosio_test/accountnum22/ --http-server-address 127.0.0.1:8022 --p2p-listen-endpoint 127.0.0.1:9022 --enable-stale-production --producer-name accountnum22 --private-key '[ ""pubkey","privatekey" ]' --plugin eosio::producer_plugin --plugin eosio::chain_api_plugin --plugin eosio::http_plugin --p2p-peer-address localhost:9011  --p2p-peer-address localhost:9033  --p2p-peer-address localhost:9044
$ nodeos --genesis-json ~/eosio_test/accountnum33/genesis.json --block-log-dir ~/eosio_test/accountnum33/blocks --config-dir ~/eosio_test/accountnum33/ --data-dir ~/eosio_test/accountnum33/ --http-server-address 127.0.0.1:8033 --p2p-listen-endpoint 127.0.0.1:9033 --enable-stale-production --producer-name accountnum33 --private-key '[ "pubkey","privatekey"]' --plugin eosio::producer_plugin --plugin eosio::chain_api_plugin --plugin eosio::http_plugin --p2p-peer-address localhost:9011  --p2p-peer-address localhost:9022  --p2p-peer-address localhost:9044
$ nodeos --genesis-json ~/eosio_test/accountnum44/genesis.json --block-log-dir ~/eosio_test/accountnum44/blocks --config-dir ~/eosio_test/accountnum44/ --data-dir ~/eosio_test/accountnum44/ --http-server-address 127.0.0.1:8044 --p2p-listen-endpoint 127.0.0.1:9044 --enable-stale-production --producer-name accountnum44 --private-key '[ "pubkey","privatekey"]' --plugin eosio::producer_plugin --plugin eosio::chain_api_plugin --plugin eosio::http_plugin --p2p-peer-address localhost:9011  --p2p-peer-address localhost:9022  --p2p-peer-address localhost:9033

(3)genesis.json
每个节点的输出都在该节点工作目录中的文件stderr中捕获,例如./nodes/accountnum44/stderr。

3.12 销毁eosio账户

一旦选择生产者满足了最低数量要求,即被选出,eosio帐户就可以销毁,将eosio.msig帐户留作唯一的特权帐户。
销毁主要涉及将eosio的所有帐户的密钥设置为null。 使用以下命令清除eosio帐户的所有者和活动密钥:

$ cleos push action eosio updateauth '{"account": "eosio", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio.prods", "permission": "active"}}]}}' -p eosio@owner
$ cleos push action eosio updateauth '{"account": "eosio", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio.prods", "permission": "active"}}]}}' -p eosio@active
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值