对于联网案例,可以很容易地扩展这里的步骤。这里有一些关于相关各方如何相互协调的假设。但是,社区可以选择多种方式进行协调。该过程的技术方面是客观的; 关于如何进行协调的假设是推测性的。社区已经提出了几种方法。我们鼓励您审查各种方法,并酌情参与讨论。
步骤1:配置初始nodeos
节点集
在本教程中,我们将启动许多nodeos
节点,将它们指向彼此,并最终对一组生成器进行投票。所有nodeos
节点都将在同一台服务器上运行。在以下部分中,我们将采取各种步骤来准备我们的候选生产者集。我们将使用命名约定accountnumXY
,XY从数字1-5中选择,例如,
accountnum11
accountnum12
..
accountnum15
accountnum21
...
accountnum55
如上所述,脚本实现了这些步骤,但是,它使用了不同的(以及更多)数据值。请参阅该文件
accounts.json
以获取脚本使用的生产者名称和用户帐户名称。
步骤1a:为每个创建配置和数据目录 nodeos
由于所有nodeos
节点都将在同一台服务器上运行,因此每个节点都需要单独的配置和数据目录。以下示例为目录nodeos
下的每个目录创建目录~/eosio_test
。使用最适合您的方法创建多个帐户,同时记住帐户名称必须精确为12个字符的命名限制,从az和1-5的集合开始。
$ 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
您将在命令行中使用这些目录--config-dir
和--data-dir
参数nodeos
。
步骤1b:准备用于对等通信的IP地址
当我们设置我们的生产者时,我们将希望将它们配置为彼此指向以执行对等通信。如果设置全网状配置,则每个节点将指向所有其他节点。全网状网络将很快变得笨拙。以下描述说明如何将节点指向其他节点以创建对等通信。将此选项用于您选择作为对等项的节点,但建议不要对所有节点使用此节点,因为您的配置会爆炸式增长。
确定每个nodeos
节点之间的对等通信的IP地址和端口号的集合(稍后当您实际启动生产者节点时将使用它)。每个nodeos
可以通过设置被配置p2p-peer-address
在启动时配置属性,在命令行nodeos
(每个对等一个参数),或通过中设置属性config.ini
文件nodeos
(每个对等一行)。
例如,假设我们正在使用的端口号9011-9055为生产者(即,accountnum11
- accountnum55
,分别地),包括以下参数nodeos
为命令行accountnum12
:
--p2p-peer-address localhost:9011 --p2p-peer-address localhost:9013 --p2p-peer-address localhost:9014 ...
或者
在config.ini
文件中accountnum12
,为每个对等方添加行:
p2p-peer-address = localhost:9011
p2p-peer-address = localhost:9013
p2p-peer-address = localhost:9014
...
如果使用配置文件方法,您将拥有该config.ini
文件的许多副本,每个~/eosio_test/accountnumXY
目录中有一个副本。无论是使用命令行还是配置文件方法,请注意不要在对等列表中包含生产者自己的地址。
第2步:启动“genesis”节点
“genesis”节点是nodeos
我们开始的第一个节点,它将产生区块链。所有其他节点将从genesis节点派生。在genesis节点上执行以下操作。
步骤2a:创建钱包
创建一个钱包。默认情况下,keosd
会自动启动以管理钱包。
$ cleos wallet create
请务必保存钱包密码,以便将来解锁钱包。
无论nodeos
访问哪个帐户,相同的钱包都将用于本教程中所有帐户的所有密钥管理。在分布式部署中,钱包管理应该是仅限本地的活动。
步骤2b:配置genesis.json
文件。
该genesis.json
文件定义了初始链状态。所有节点必须从相同的初始状态开始。这里突出显示了两个属性。该initial_timestamp
代表blockchain的开始时间。该initial_key
被使用的成因节点开始生产。它需要在所有节点中相同。该initial_key
属性genesis.json
必须与创世记的公钥相匹配nodeos
。该nodeos
密钥对可以使用指定--private-key
参数中的上nodeos
命令行,或通过设置private-key
了在属性config.ini
文件中。
genesis.json
脚本使用的文件可以在tutorial/bios-boot-tutorial
目录中找到。nodeos
将使用此文件启动所有实例。该脚本指定nodeos
命令行上的密钥对。该脚本允许您为genesis节点(--private-key
和--public-key
选项)指定密钥对。如果指定了genesis节点的密钥,请务必对genesis.json
文件进行必要的更改。该脚本将使用该密钥对启动genesis节点,并eosio.*
使用此密钥对创建帐户。
步骤2c:为eosio
帐户创建密钥
nodeos
预先配置了密钥对,但我们不想使用该密钥。eosio
在启动genesis节点时创建要用于帐户的密钥对。教程脚本预先配置了自己的自定义密钥对。(往上看)
$ cleos create key
Private key: 5JGxnezvp3N4V1NxBo8LPBvCrdR85bZqZUFvBZ8ACrbRC3ZWNYv
Public key: EOS8VJybqtm41PMmXL1QUUDSfCrs9umYN4U1ZNa34JhPZ9mU5r2Cm
步骤2d:启动genesis nodeos
节点
使用生成的密钥对启动genesis节点。
$ nodeos -e -p eosio --private-key '[ "EOS8VJybqtm41PMmXL1QUUDSfCrs9umYN4U1ZNa34JhPZ9mU5r2Cm","5JGxnezvp3N4V1NxBo8LPBvCrdR85bZqZUFvBZ8ACrbRC3ZWNYv" ]' --plugin eosio::producer_plugin --plugin eosio::chain_api_plugin --plugin eosio::http_plugin --plugin eosio::history_api_plugin
第3步:创建重要的系统帐户
有几个系统帐户是必需的。这些是:
eosio.bpay
eosio.msig
eosio.names
eosio.ram
eosio.ramfee
eosio.saving
eosio.stake
eosio.token
eosio.vpay
重复以下步骤为每个系统帐户创建一个帐户。在本教程中,我们将对帐户所有者和活动密钥使用相同的密钥对,因此我们只需要在命令行上提供一次密钥值。对于大多数一般帐户,最好为所有者和活动使用单独的密钥。该脚本对所有eosio.*
帐户使用相同的密钥。您可以为每个使用不同的键。
$ cleos create key # for eosio.bpay
Private key: 5KAVVPzPZnbAx8dHz6UWVPFDVFtU1P5ncUzwHGQFuTxnEbdHJL4
Public key: EOS84BLRbGbFahNJEpnnJHYCoW9QPbQEk2iHsHGGS6qcVUq9HhutG
$ cleos wallet import 5KAVVPzPZnbAx8dHz6UWVPFDVFtU1P5ncUzwHGQFuTxnEbdHJL4
imported private key for: EOS84BLRbGbFahNJEpnnJHYCoW9QPbQEk2iHsHGGS6qcVUq9HhutG
$ cleos create account eosio eosio.bpay EOS84BLRbGbFahNJEpnnJHYCoW9QPbQEk2iHsHGGS6qcVUq9HhutG
executed transaction: ca68bb3e931898cdd3c72d6efe373ce26e6845fc486b42bc5d185643ea7a90b1 200 bytes 280 us
# eosio <= eosio::newaccount {"creator":"eosio","name":"eosio.bpay","owner":{"threshold":1,"keys":[{"key":"EOS84BLRbGbFahNJEpnnJH...
第4步:安装eosio.token
合同
设置eosio.token
合同。此合约使您可以创建,发布,传输和获取有关令牌的信息。请注意,该示例假定您内置eos
在该~/Documents/eos
文件夹中。
$ cleos set contract eosio.token ~/Documents/eos/build/contracts/eosio.token
Reading WAST/WASM from /Users/tutorial/Documents/eos/build/contracts/eosio.token/eosio.token.wasm...
Using already assembled WASM...
Publishing contract...
executed transaction: 17fa4e06ed0b2f52cadae2cd61dee8fb3d89d3e46d5b133333816a04d23ba991 8024 bytes 974 us
# eosio <= eosio::setcode {"account":"eosio.token","vmtype":0,"vmversion":0,"code":"0061736d01000000017f1560037f7e7f0060057f7e...
# eosio <= eosio::setabi {"account":"eosio.token","abi":{"types":[],"structs":[{"name":"transfer","base":"","fields":[{"name"...
第5步:设置eosio.msig
合同
设置eosio.msig
合同。msig合同启用并简化了权限级别的定义和管理以及执行多签名操作。请注意,这假设您在~/Documents/eos
文件夹中构建了EOSIO 。
$ cleos set contract eosio.msig ~/Documents/eos/build/contracts/eosio.msig
Reading WAST/WASM from /Users/tutorial/Documents/eos/build/contracts/eosio.msig/eosio.msig.wasm...
Using already assembled WASM...
Publishing contract...
executed transaction: 007507ad01de884377009d7dcf409bc41634e38da2feb6a117ceced8554a75bc 8840 bytes 925 us
# eosio <= eosio::setcode {"account":"eosio.msig","vmtype":0,"vmversion":0,"code":"0061736d010000000198011760017f0060047f7e7e7...
# eosio <= eosio::setabi {"account":"eosio.msig","abi":{"types":[{"new_type_name":"account_name","type":"name"}],"structs":[{...
第6步:创建并分配SYS
货币
创建SYS
最大值为100亿令牌的货币。然后发行十亿个代币。替换SYS
为您的特定货币名称。
$ 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"}
$ 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"}
在上面的第一步中,由帐户授权create
的eosio.token
合同中的操作在eosio.token
帐户中创建10B SYS
令牌eosio
。这有效地创造了最大的代币供应,但不会使任何代币进入流通。没有流通的代币可以被视为保留。
在第二步中,eosio.token
合同的issue
行动将1B SYS
标记从储备中移除并将其置于流通中。在发行时,令牌保存在eosio
帐户内。由于该eosio
帐户拥有未流通的令牌储备,因此需要其权限才能执行此操作。
作为一个利益点,从经济的角度来看,将代币从储备转移到流通中,例如通过发行代币,是一种通货膨胀行为。发行代币只是通胀可能发生的一种方式。
第7步:设置eosio.system
合同
设置eosio.system
合同。此合约为几乎所有基于令牌的操作行为提供了操作。在安装系统合同之前,操作是独立于会计完成的。一旦启用了系统合同,行动现在就具有经济要素。必须支付资源(cpu,网络,内存)。同样,必须支付新帐户。系统合同允许标记放样和未标记,要购买的资源,要注册和随后投票的潜在生产者,要求的生产者奖励,要设置的特权和限制等等。
$ cleos set contract eosio ~/Documents/eos/build/contracts/eosio.system
Reading WAST/WASM from /Users/tutorial/Documents/eos/build/contracts/eosio.system/eosio.system.wasm...
Using already assembled WASM...
Publishing contract...
executed transaction: 2150ed87e4564cd3fe98ccdea841dc9ff67351f9315b6384084e8572a35887cc 39968 bytes 4395 us
# eosio <= eosio::setcode {"account":"eosio","vmtype":0,"vmversion":0,"code":"0061736d0100000001be023060027f7e0060067f7e7e7f7f...
# eosio <= eosio::setabi {"account":"eosio","abi":{"types":[],"structs":[{"name":"buyrambytes","base":"","fields":[{"name":"p...
第8步:从单一生产者过渡到多个生产者
在下一组步骤中,我们将从单个块生成器(创建节点)转换到多个生成器。到目前为止,只有内置eosio
帐户具有特权并且可以对块进行签名。目标是通过一系列选定的生产者来管理区块链,这些生产者是在2/3 + 1生产者的规则下运作的
选举产生了生产者。生产者名单可以改变。管理规则不是直接将特权授权给予任何生产者,而是与名为的特殊内置帐户相关联eosio.prods
。该帐户代表当选的生产者组。该eosio.prods
帐户(实际上是生产者组)使用eosio.msig
合同定义的权限进行操作。
安装eosio.system
合同后,我们希望尽快建立eosio.msig
一个特权帐户,以便它可以代表该eosio
帐户进行授权。eosio
将尽快辞去其权威并将eosio.prods
接管。
创建eosio.msig
一个特权帐户
我们eosio.msig
使用以下方式享有特权。
$ cleos push action eosio setpriv '["eosio.msig", 1]' -p eosio@active
第9步:放置令牌并扩展网络
如果您已经按照上面的教程步骤进行操作,那么现在您已经安装了以下合同的单主机单节点配置:
- eosio.token
- eosio.msig
- eosio.system
帐户eosio
和eosio.msig
特权帐户。其他eosio.*
帐户已创建,但没有特权。
我们现在准备开始筹码并扩大生产者网络。
第10步:创建赌注帐户
放样是将“真实世界”中的实体(例如,以Crowdsale或其他方式购买某物的个人)获得的令牌分配给EOSIO系统内的账户的过程。在区块链的整个生命周期中,放样和不间断是一个持续的过程。在BIOS启动过程中完成的初始赌注是特殊的。在BIOS启动序列期间,帐户会使用其令牌进行赌注。但是,在选举产生者之前,代币实际上处于冻结状态。因此,在bios引导序列期间完成初始赌注的目标是将令牌分配给他们的账户并准备好使用,并使投票过程继续进行,以便生产者可以当选并且区块链“实时”运行。
对于初始放样过程给出以下建议:
- 0.1令牌(字面意思,不是帐户令牌的10%)是赌注的RAM。默认情况下,
cleos
帐户创建时会占用8 KB的RAM,由帐户创建者支付。在最初的赌注中,eosio
账户是进行赌注的账户创建者。在最初的令牌赌注过程中赌注的代币在达到最低投票要求之前不能保持不变并且变为流动。 - 为CPU计算0.45令牌,为网络赌注0.45令牌。
- 下一个最多9个令牌可用作液体代币。
- 剩余的令牌是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%的人口持有。这里的示例没有显示如何生成分布,而是关注执行放样的命令。bios-boot-tutorial.py
本教程附带的脚本使用Python NumPy(numpy)库生成Pareto分发。
步骤10a:创建赌注账户
使用以下步骤为每个帐户放置令牌。必须为每个帐户单独完成这些步骤。
在本教程中创建密钥对。在“实时”场景中,应该已经通过一些明确定义的带外过程建立了帐户的密钥值和令牌共享。
$ cleos create key # for accountnum11
Private key: 5K7EYY3j1YY14TSFVfqgtbWbrw3FA8BUUnSyFGgwHi8Uy61wU1o
Public key: EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt
$ cleos wallet import 5K7EYY3j1YY14TSFVfqgtbWbrw3FA8BUUnSyFGgwHi8Uy61wU1o
imported private key for: EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt
使用初始资源和公钥创建一个赌注帐户。
$ cleos system newaccount eosio --transfer accountnum11 EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt --stake-net "100000.0000 SYS" --stake-cpu "100000.0000 SYS"
775292ms thread-0 main.cpp:419 create_action ] result: {"binargs":"0000000000ea30551082d4334f4d113200200000"} arg: {"code":"eosio","action":"buyrambytes","args":{"payer":"eosio","receiver":"accountnum11","bytes":8192}}
775295ms thread-0 main.cpp:419 create_action ] result: {"binargs":"0000000000ea30551082d4334f4d113200ca9a3b00000000045359530000000000ca9a3b00000000045359530000000001"} arg: {"code":"eosio","action":"delegatebw","args":{"from":"eosio","receiver":"accountnum11","stake_net_quantity":"100000.0000 SYS","stake_cpu_quantity":"100000.0000 SYS","transfer":true}}
executed transaction: fb47254c316e736a26873cce1290cdafff07718f04335ea4faa4cb2e58c9982a 336 bytes 1799 us
# eosio <= eosio::newaccount {"creator":"eosio","name":"accountnum11","owner":{"threshold":1,"keys":[{"key":"EOS8mUftJXepGzdQ2TaC...
# eosio <= eosio::buyrambytes {"payer":"eosio","receiver":"accountnum11","bytes":8192}
# eosio <= eosio::delegatebw {"from":"eosio","receiver":"accountnum11","stake_net_quantity":"100000.0000 SYS","stake_cpu_quantity...
第11步:选择生产者
创建的一些帐户将被注册为生产者。选择一些赌注账户作为生产者。
步骤11a:注册为生产者
使用以下命令注册为生产者。这使得节点成为生产者的候选者,但除非被选举,否则该节点实际上不是生产者。
$ cleos system regproducer accountnum11 EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt https://accountnum11.com/EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt
1487984ms thread-0 main.cpp:419 create_action ] result: {"binargs":"1082d4334f4d11320003fedd01e019c7e91cb07c724c614bbf644a36eff83a861b36723f29ec81dc9bdb4e68747470733a2f2f6163636f756e746e756d31312e636f6d2f454f53386d5566744a586570477a64513254614364754e7553504166584a48663232756578347534316162314556763945416857740000"} arg: {"code":"eosio","action":"regproducer","args":{"producer":"accountnum11","producer_key":"EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt","url":"https://accountnum11.com/EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt","location":0}}
executed transaction: 4ebe9258bdf1d9ac8ad3821f6fcdc730823810a345c18509ac41f7ef9b278e0c 216 bytes 896 us
# eosio <= eosio::regproducer {"producer":"accountnum11","producer_key":"EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt","u...
步骤11b:列出生产者
为便于投票过程,请列出可用的生产者。
$ cleos system listproducers
Producer Producer key Url Scaled votes
accountnum11 EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt https://accountnum11.com/EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22 0.0000
accountnum22 EOS5kgeCLuQo8MMLnkZfqcBA3GRFgQsPyDddHWmXceRLjRX8LJRaH https://accountnum22.com/EOS5kgeCLuQo8MMLnkZfqcBA3GRFgQsPyD 0.0000
accountnum33 EOS63CnoyfeEQDjXXxwywN5PPKW7RYHC9tbtmvb8vFBGZooktz7kG https://accountnum33.com/EOS63CnoyfeEQDjXXxwywN5PPKW7RYHC9t 0.0000
accountnum44 EOS6kBaCHrvz7VdUfFBLrLdhNjXYaKBmRkpDXU9PhbEUiHbspr7rz https://accountnum44.com/EOS6kBaCHrvz7VdUfFBLrLdhNjXYaKBmRk 0.0000
步骤11c:启动生产者
使用以下命令启动生成器。回想一下,在本教程中,所有生成器都在单个服务器上运行,因此命令行参数用于确保每个生产者使用自己的目录。
在每个生产者的单独窗口中,运行以下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 '[ "EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt","5K7EYY3j1YY14TSFVfqgtbWbrw3FA8BUUnSyFGgwHi8Uy61wU1o" ]' --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
请注意,在所有生成器都启动之前,将生成连接错误消息,例如以下内容。
1826099ms thread-0 net_plugin.cpp:2927 plugin_startup ] starting listener, max clients is 25
1826099ms thread-0 net_plugin.cpp:676 connection ] created connection to localhost:9022
1826099ms thread-0 net_plugin.cpp:1948 connect ] host: localhost port: 9022
1826099ms thread-0 net_plugin.cpp:676 connection ] created connection to localhost:9033
1826099ms thread-0 net_plugin.cpp:1948 connect ] host: localhost port: 9033
1826099ms thread-0 net_plugin.cpp:676 connection ] created connection to localhost:9044
1826099ms thread-0 net_plugin.cpp:1948 connect ] host: localhost port: 9044
1826100ms thread-0 net_plugin.cpp:1989 operator() ] connection failed to localhost:9022: Connection refused
1826100ms thread-0 net_plugin.cpp:1989 operator() ] connection failed to localhost:9033: Connection refused
1826100ms thread-0 net_plugin.cpp:1989 operator() ] connection failed to localhost:9044: Connection refused
为了方便起见,下面的命令行可以被复制到运行nodeos
在单独的外壳窗口的帐户accountnum22
,accountnum33
和accountnum44
。如果运行这些,您可以看到在对等配置中运行时多个节点如何响应。这假设帐户已使用相关密钥对进行了固定(密钥对可以在下面的每个命令行中看到)。
$ 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 '[ "EOS5kgeCLuQo8MMLnkZfqcBA3GRFgQsPyDddHWmXceRLjRX8LJRaH","5Jh4rseyguLx5Y7KE2oLL81PRmDcyyzbyyyJd3GvdHijKqENbRk" ]' --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 '[ "EOS63CnoyfeEQDjXXxwywN5PPKW7RYHC9tbtmvb8vFBGZooktz7kG","5JWp5K24x5dbAFBNP7hwzSRS7XjD7wjHL4nrAwSLdRuJnERjgqB" ]' --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 '[ "EOS6kBaCHrvz7VdUfFBLrLdhNjXYaKBmRkpDXU9PhbEUiHbspr7rz","5KeGoDkbhEdkZTpYqQg2rPZvtxqfWAtGgixuCLUt1Dmoq4NmXCj" ]' --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
步骤11c:创世节点genesis.json
文件
这还期望该genesis.json
文件(例如,见下文)已被复制到相应的帐户目录。
{
"initial_timestamp": "2018-03-02T12:00:00.000",
"initial_key": "EOS8Znrtgwt8TfpmbVpTKvA2oB8Nqey625CLN8bCN3TEbgx86Dsvr",
"initial_configuration": {
"max_block_net_usage": 1048576,
"target_block_net_usage_pct": 1000,
"max_transaction_net_usage": 524288,
"base_per_transaction_net_usage": 12,
"net_usage_leeway": 500,
"context_free_discount_net_usage_num": 20,
"context_free_discount_net_usage_den": 100,
"max_block_cpu_usage": 100000,
"target_block_cpu_usage_pct": 500,
"max_transaction_cpu_usage": 50000,
"min_transaction_cpu_usage": 100,
"max_transaction_lifetime": 3600,
"deferred_trx_expiration_window": 600,
"max_transaction_delay": 3888000,
"max_inline_action_size": 4096,
"max_inline_action_depth": 4,
"max_authority_depth": 6,
"max_generated_transaction_count": 16
},
"initial_chain_id": "0000000000000000000000000000000000000000000000000000000000000000"
}
注意:每个节点的输出都捕获在该stderr
节点工作目录中的文件中,例如./nodes/accountnum44/stderr
。默认情况下,脚本启动的节点继续运行。必须注意避免从30多个节点同时运行的磁盘填充,每个节点分别将其输出写入文件系统中的文件。
第12步:辞职 eosio
一旦选择了生产者并且满足了最低数量要求,该eosio
帐户就可以辞职,将该eosio.msig
帐户作为唯一的特权帐户。
辞职主要涉及将eosio.*
帐户的密钥设置为空。使用以下命令清除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