概述
EOSIO 有许多程序组件。我们把主要用到的列在下边:
- nodeos(node+eos=nodeos)-核心的EOSIO节点守护进程,可以用插件来进行配置以运行节点。示例用途是区块生产,专用API端点和本地开发。
- cleos (cli+eos = cleos) 同区块链进行交互和管理钱包的命令行接口
- keosd(Key+eos = keosd) 将EOSIO密钥安全存储到钱包的组件。
这些组件之间的基本关系在下图中展示。在接下来的部分,你将会编译EOSIO组件,在单主机中进行部署以及配置单节点测试网络(testnet)
Docker快速入门
安装docker
首先,我们需要在你的电脑上安装docker.
Docker是一个容器管理服务。Docker的意图是让开发人员在可移植容器中创建全部配置好的系统环境来简化应用部署。系统环境由运行在操作系统配置中的目标应用程序组成,操作系统配置提供了应用需要的所有运行时支持。开发者在容器中创建所需的系统配置,然后将容器打包以便进行部署。目的是让用户可以获取容器的一份拷贝,然后在自己的Docker环境中进行部署,并且无需执行大量系统和应用程序配置即可关闭和运行。
安装Docker请遵循如下指南:
https://docs.docker.com/install/
EOSIO dev Docker镜像
EOSIOS Dev Docker镜像是为本地开发设计的EOSIO软件的编译版本。
从仓库中pull镜像:
docker pull eosio/eos-dev
启动EOSIO 节点:
sudo docker run --rm --name eosio -d -p 8888:8888 -p 9876:9876 -v /tmp/work:/work -v /tmp/eosio/data:/mnt/dev/data -v /tmp/eosio/config:/mnt/dev/config eosio/eos-dev /bin/bash -c "nodeos -e -p eosio --plugin eosio::wallet_api_plugin --plugin eosio::wallet_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin --plugin eosio::http_plugin -d /mnt/dev/data --config-dir /mnt/dev/config --http-server-address=0.0.0.0:8888 --access-control-allow-origin=* --contracts-console"
检查是否正常工作:
sudo docker logs --tail 10 eosio
输入将会是下面这个样子:
1929001ms thread-0 producer_plugin.cpp:585 block_production_loo ] Produced block 0000366974ce4e2a... #13929 @ 2018-05-23T16:32:09.000 signed by eosio [trxs: 0, lib: 13928, confirmed: 0]
1929502ms thread-0 producer_plugin.cpp:585 block_production_loo ] Produced block 0000366aea085023... #13930 @ 2018-05-23T16:32:09.500 signed by eosio [trxs: 0, lib: 13929, confirmed: 0]
1930002ms thread-0 producer_plugin.cpp:585 block_production_loo ] Produced block 0000366b7f074fdd... #13931 @ 2018-05-23T16:32:10.000 signed by eosio [trxs: 0, lib: 13930, confirmed: 0]
1930501ms thread-0 producer_plugin.cpp:585 block_production_loo ] Produced block 0000366cd8222adb... #13932 @ 2018-05-23T16:32:10.500 signed by eosio [trxs: 0, lib: 13931, confirmed: 0]
1931002ms thread-0 producer_plugin.cpp:585 block_production_loo ] Produced block 0000366d5c1ec38d... #13933 @ 2018-05-23T16:32:11.000 signed by eosio [trxs: 0, lib: 13932, confirmed: 0]
1931501ms thread-0 producer_plugin.cpp:585 block_production_loo ] Produced block 0000366e45c1f235... #13934 @ 2018-05-23T16:32:11.500 signed by eosio [trxs: 0, lib: 13933, confirmed: 0]
1932001ms thread-0 producer_plugin.cpp:585 block_production_loo ] Produced block 0000366f98adb324... #13935 @ 2018-05-23T16:32:12.000 signed by eosio [trxs: 0, lib: 13934, confirmed: 0]
1932501ms thread-0 producer_plugin.cpp:585 block_production_loo ] Produced block 00003670a0f01daa... #13936 @ 2018-05-23T16:32:12.500 signed by eosio [trxs: 0, lib: 13935, confirmed: 0]
1933001ms thread-0 producer_plugin.cpp:585 block_production_loo ] Produced block 00003671e8b36e1e... #13937 @ 2018-05-23T16:32:13.000 signed by eosio [trxs: 0, lib: 13936, confirmed: 0]
1933501ms thread-0 producer_plugin.cpp:585 block_production_loo ] Produced block 0000367257fe1623... #13938 @ 2018-05-23T16:32:13.500 signed by eosio [trxs: 0, lib: 13937, confirmed: 0]
恭喜~你已经有一个简单的单节点区块链运行在你的Docker容器中了!
可以在浏览器中输入下面的地址来检查RPC接口是否工作:
http://localhost:8888/v1/chain/get_info
看到的信息将会是下面这个样子:
{
"server_version": "0961a560",
"chain_id": "cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f",
"head_block_num": 13780,
"last_irreversible_block_num": 13779,
"last_irreversible_block_id": "000035d36e1ca29ba378081c574ab3b5ab4214ba29754dd42b512690a9f03e80",
"head_block_id": "000035d4165c9225d7a04822d142fbcb15f997a6f2571dc7bae8437dea782205",
"head_block_time": "2018-05-23T16:30:54",
"head_block_producer": "eosio",
"virtual_block_cpu_limit": 100000000,
"virtual_block_net_limit": 1048576000,
"block_cpu_limit": 99900,
"block_net_limit": 1048576
}
Cleos
cleos是一个命令行接口,同区块链进行交互来管理钱包。为了方便我们为运行在我们容器内部的cleos创建一个bash alias。在终端中运行如下命令:
alias cleos='docker exec eosio /opt/eosio/bin/cleos --wallet-url http://localhost:8888'
停止eosio:
docker stop eosio
现在在终端中输入 cleos --help,你将会看到下面的输出:
Command Line Interface to EOSIO Client
Usage: /opt/eosio/bin/cleos [OPTIONS] SUBCOMMAND
Options:
-h,--help Print this help message and exit
-u,--url TEXT=http://localhost:8888/
the http/https URL where nodeos is running
--wallet-url TEXT=http://localhost:8900/
the http/https URL where keosd is running
-r,--header pass specific HTTP header; repeat this option to pass multiple headers
-n,--no-verify don't verify peer certificate when using HTTPS
-v,--verbose output verbose actions on error
Subcommands:
version Retrieve version information
create Create various items, on and off the blockchain
get Retrieve various items and information from the blockchain
set Set or update blockchain state
transfer Transfer EOS from account to account
net Interact with local p2p network connections
wallet Interact with local wallet
sign Sign a transaction
push Push arbitrary transactions to the blockchain
multisig Multisig contract commands
system Send eosio.system contract action to the blockchain
账户和权限
账户是存储在区块链上的人类可读的标识符,每笔交易都会根据账户的配置权限进行权限评估.每个已命名的权限都有一个阈值,在此权限下签署的交易必须满足阈值才认为是有效的。交易通过使用具有加载和解锁钱包的客户端来签署。钱包是保护和使用你的密钥的软件。在区块链上这些keys可能会也可能不会被授予一个账户的权限。
钱包
钱包是存储keys的客户端,这些Keys可能被关联了一个或多个账户的权限,也可能没被关联。理想情况下,一个钱包有被一个高熵密码保护的锁定(加密)和解锁(解密)状态。EOSIO/eos仓库捆绑了一个名为cleos的命令行界面的客户端,它同一个名为keosd的轻客户端进行交互,它们同钱包一起共同展示了这种模式。
账户
一个账户是存储在区块链上的一个人类可读的名字。根据权限的配置它可以被个人或者个人组成的团体拥有。需要使用一个账户来将一个交易转移或者推送到区块链上。
授权和权限
权限决定了任何给定的消息是否合适的授权了。
每个账户都有两个原生的命名权限。
- owner 权限代表着一个账户的所有权。只有少许的交易需要这种权限,最需要注意的是对owner权限做出任何改变的消息。一般来说,建议对owner权限进行冷存储(cold storage)并且不同任何人分享此权限。owner权限可以用来恢复另外一个可能被损坏的(compromised)权限。
- active 权限被用来转移资金,为生产商投票以及进行其它高级账户的更改。
除了原生的权限,帐户还可拥有可用于进一步扩展帐户管理的自定义命名权限。自定义权限非常灵活,并且在实现时可以解决许多可能的用例。这很大程度上取决于开发人员如何使用它们,以及采用什么约定(如果有的话)。
任何给定授权的权限可以分配给一个或多个公用密钥或有效的帐户名称。
把它们放到一起
以下是所有上述概念的组合以及它们如何实际应用的一些松散例子。
默认账户配置(单签名(Single-Sig))
这是帐户在创建后的配置方式,针对所有者权限和活动权限它会拥有单个密钥,这两个密钥的权重均为1,权限的阈值均为1。默认配置需要一个单一的签名来为原生权限的消息授权。
@bob账户授权
Permission Account Weight Threshold
owner EOS5EzTZZQQxdrDaJAPD9pDzGJZ5bj34HaAb8yuvjFHGWzqV25Dch 1 1
active EOS61chK8GbH4ukWcbom8HgK95AeUfP8MBPn7XRq8FeMBYYTgwmcX 1 1
在@bob帐户示例中,此表显示@ bob的owner密钥的权限权重为1,并且在该权限下推送交易所需的阈值为1。
要在owner权限下推送交易,只有@ bob需要使用其owner密钥对交易进行签名,以使交易符合验证条件。此密钥将存储在钱包中,然后通过使用cleos进行处理。
多签名账户 && 自定义权限
以下示例是虚拟账户@multisig的权限。在这种情况下,两个用户被授权为虚拟帐户@multisig的owner和active权限,有三个用户被授予权重不同的自定义publish权限。
@multisig account authorities
在这种情况下,需要权重阈值2来更改owner权限级别,这意味着由于所有用户都具有权重1,因此他们都必须对交易进行签名才能获得完全授权。
要发送需要激活权限的交易,阈值设置为1.这意味着只需要1个签名即可对来自帐户active权限的消息进行授权。
还有一个名为publish的自定义命名权限。为了这个示例,publish权限用于通过使用推理博客dApp将帖子publish到@ multisig的博客。publish权限的阈值为2,@ bob和@stacy的权重均为2,公钥的权重为1.这意味着@bob和@stacy可以在没有额外签名的情况下publish,而公众密钥需要额外签名才能在公共许可下对消息授权。
因此,上述权限表意味着作为帐户owner的@ bob和@stacy提升了类似于主持人或编辑者的权限。尽管这个原始示例有局限性,特别是在扩展性方面,因此不一定是一个好的设计,但它充分证明了EOSIO权限系统的灵活性。
此外,请注意上表中的权限是使用帐户名称和密钥设置的。乍一看这可能看起来这没有什么,但它确实增加了一些额外的灵活性。
总结
- @ bob和@stacy可以明确标识为此帐户的owner
- 没有来自@bob或@stacy的额外签名,公钥无法在publish权限下推送消息
- @bob和@stacy可以在publish权限下推送一个消息,而不需要任何额外的签名。