关于 EOS 学习,今天还是有些收获的。
关于去中心化的理解
首先,我对去中心化的理解也在不断学习中,以下表述不一定正确,君且一听。
要理解去中心化,首先来对比看看中心化。
比如,我们要实现一个在线五子棋的游戏(只是我随便举的例子,方便理解),需要这些元素:
- 定义游戏的规则
- 比如,如果已经在某个点上下了一个子,就不能重复在相同的点上下子
- 比如,满足连续五子,即可以赢了比赛
- 记录游戏的状态
- 比如,谁在哪些点上下了子
- 执行游戏的规则
- 比如,当一方出现连续五子时,判定其赢,且结束比赛
- 权限
- 比如,谁有权加入比赛
在中性化的设计中,很明显上述元素都是在中心服务器中完成的。那对于区块链、也即 EOS 中,是如何对应的呢?
- 记录游戏的状态
- 这是记录在区块中的
- 定义、执行游戏的规则
- 这是包含在智能合约(contract)中的,也即 .hpp/.cpp 所转换的 .abi/.wast 中的代码
- 权限
- 这是记录在 account 及 wallet 中的
可以看出,去中心化并不能减少这个程序中的任一环节,只是用自己的方式来实现。在初入区块链领域时,可以借助中心化的思路来帮助理解。但如果真的要彻底进入区块链的世界,还是要慢慢切换为去中心化的思维模式。
创建钱包、账户
不论在概念上、还是操作上,钱包(wallet)、账户(account)这 2 个概念都是非常关联的,你基本上不能离开一方去使用另一方。
学习智能合约(smart contract)
从上面的介绍可以看出,尤其在 EOS 提供基础框架后,基于 EOS 的开发,代码上主要是实现智能合约(smart contract)
不过,这其中有些概念比较拗,我还没完全理解。尤其,我基本已经不会 cpp 代码了,只能照着例子运行,还不能全新地编辑自己的合约,所以理解上只能是个大概。
使用 REST 接口与 EOS 交互
目前,EOS 的合约是使用 hpp/cpp 开发的。而一旦将合约布置到 EOS 上,就可以通过 EOS 所暴露的 REST 接口来使用这些合约。
自然,除了使用 eosc,你可以使用自己喜欢的语言编写程序,调用这些 REST 接口。
需要注意的是,目前 REST 接口还不全、不完善,期待官方能加快这一进度。
EOS 需要 21 个生产者,才能产生区块
eosd
有个坑:EOS 是需要 21 个生产者中的 15 个及以上确认的,但默认的 data-dir/config.ini
中仅有 2 个生产者:
producer-name = inita
producer-name = initb
需要手动增加至 21 个,即 a-u:
producer-name = inita
producer-name = initb
producer-name = initc
producer-name = initd
producer-name = inite
producer-name = initf
producer-name = initg
producer-name = inith
producer-name = initi
producer-name = initj
producer-name = initk
producer-name = initl
producer-name = initm
producer-name = initn
producer-name = inito
producer-name = initp
producer-name = initq
producer-name = initr
producer-name = inits
producer-name = initt
producer-name = initu
如果不这样做,会有什么问题呢?会导致区块无法产生,类似这样的错误:
chain_controller.cpp:1046 validate_block_heade ] head_block_time 2018-01-25T12:40:15, next_block 2018-01-25T12:40:35, block_interval 1
chain_controller.cpp:1048 validate_block_heade ] Did not produce block within block_interval 1, took 20000ms)
进而,因为区块无法产生,你在当前 eosd 环境中的所有操作,都无法记录,如创建账户、创建合约、等等;也即,关闭 eosd 再次运行时,你会发现之前创建的数据全没了。不过,和 wallet 相关的操作都是记录的,因为这是由 eos-walletd 完成的,和 eosd 无关。