写这一系列文章, 最核心的目的是帮助我自己更详细深入的理解EOS的代码和机制, 如果能够对你也有帮助, 我就满足了.
至于赞不赞, 这个很好, 但是真的没那么重要. 你的问题和反馈, 比赞更值钱.
在EOS 区块链之中,交易与账户是密不可分的.不过这篇文章之中,暂时对账户部分跳过,先集中看下交易的相关内容.
交易的概念
交易(Transaction),是区块链最重要的部分.
这里的交易,并非只是说进行通证的买卖转账才算,而是,在区块链上的任何一项操作,都离不开.用计算机科学的术语,广义的交易用"事务"来指称更为合适,不过考虑到习惯,还是称为交易了.交易和事务,两者对应的英文都是Transaction.
所以,在这一系列文章之中提到交易的时候,请按照交易的广义含义来理解.交易,并不一定涉及到货币的交换转移.
查看EOS交易的工具
之前我一直在困惑,找不到合适的方式来直观的展现EOS的交易和区块结构,直到昨天发现了一个项目: eostracker.
由于当前EOS还处于早期阶段,工具及相应网站并不多,所以,在解读EOS.IO区块链的交易,区块/区块链,账户,出块节点等的文章之中,我们可能会频繁用到这个网站,用作示例.建议你可以先提前玩一下.
我写了一篇帖子,提供了 eostracker 的更多的细节: 想直观了解EOS长什么样? 这个网站不可错过
希望对你有所帮助.
信息,交易,区块和账户
database_schema, 来自EOS wiki注意,由于EOS的的更新,交易的组成部分中的信息(Message)换了一个名称: Action. EOS Wiki之中的上图中的Message, 现在你可以当做Action来理解.
另外,这种示意图并非最新的信息,一些字段或者方法名称已经变更,不过,我们的目的在于理解原理,而实际开发的时候,还需要结合最新的api.
上图中,很清晰的描述了EOS区块链中的交易相关的结构.是从上到下的结构细分的.
一个区块由多笔交易组成,而一笔交易之中,又可能包含多条Action(或者说Message). 区块与交易,交易与Action, 是一对多的关系.
顺带提一下,你可能会注意到图中出现的Account与其他各部分之间的关系.
Block的区块头信息的Producer,
Transaction中的Scope和ReadScope中的Name, 以及Message中的authorization的account, 都是一个account_name类型的值,关联到了对应的账户中.
另外,block的number,和block的id是不同的.前者是单纯的一个编号,而后者则是区块头的hash.
可以看下: http://eostracker.io/blocks/4606363
block_3.pngEOS中一笔交易的结构
让我们查看测试网络上一笔交易的结构是怎样的:
http://eostracker.io/transactions/e46ed63e06cb6fba0f166a0648184ba75dc5f4b46f35642e765d2f6a950f87ac
交易结构_1.png我直接用wiki之中现有的表格:
交易结构_2.png这里的ref_block_num和ref_block_prefix并不一定是指的最近一个区块的区块头,而是指所引用的区块编号(数字),以及区块头的前缀(hash值的一部分).
在交易的数据结构中,ref_block_num, ref_block_prefix和expiration三者是用作TaPOS(Transaction as Proof of Stake, 交易作为权益证明)算法,是为了确保一笔交易在所引用的区块之后和交易过期日期之前能够发生.
在steem跟bts中,也有相同的设计.
如果超过了交易过期日期,则这笔交易就失效.不过,ref_block_num和ref_block_prefix具体设置为什么值,是根据什么样的规则来设定的,我并不清楚.希望对此了解的朋友指教.
scope
关于scope需要单独提一下. scope是为了实现并行处理交易而设计的.
在EOS的白皮书中,scope这一单词只出现了两处,提供的信息不多.不过查找 Dan的帖子,对此略为详细的说明,可以见Peter翻译的中文版: eos开发者日志2017 07-9
里面提到:
scope_1.png就是说,在一笔交易之中,需要指定所涉及的账户.现在EOS是自动指定scope的,就是说,如果 Bob发起了一笔交易,转账给Alice, 那么,无需刻意指明,交易结构中的scope会自动设定为:
scope: ["Bob", "Alice"]
另外,根据开发日志里面的说明和根据现在测试网络上的数据来看,code不会出现在scope之中.
对比两笔交易,能更清楚的理解这一点:
A: http://eostracker.io/transactions/e46ed63e06cb6fba0f166a0648184ba75dc5f4b46f35642e765d2f6a950f87ac
scope_2.png在这笔交易之中,合约是lcj, message的内容是从inita,向合约账户lcj转账.
注意到,在这笔交易的scope之中,只出现了inita 这一账户,并没有lcj这一合约账户.
另外一笔普通的交易:
B: http://eostracker.io/transactions/845bd4bee6cb9f8110fe13d21a2917c1771fdb71fb3823c1c7f3fce4dceb7e28
scope_3.png借助eos合约,从账户gziq向账户giza转账.
可以看到,图中的scope数组,是包含了两个账户: giza
, gizq
.
希望这个例子,能够让你对scope有一个直观的理解.
Message与Transaction的关系
Message是如何组成Transaction的?
交易中信息(Message)的结构
再重复一下,Message与Action是同义的.为了方便的使用测试网络中的数据来进行说明,我在这篇文章里面选择用Message, 但是你需要理解,在之后更新的文本之中,Message已经被Action所取代了.
在上文提到的这一交易(e46ed63e06cb6fba0f166a0648184ba75dc5f4b46f35642e765d2f6a950f87ac)之中,只有一条Message,我们进一步查看一下,这条Message的信息:
http://eostracker.io/contracts/0/e46ed63e06cb6fba0f166a0648184ba75dc5f4b46f35642e765d2f6a950f87ac
message_1.png message_2.png message_3.png关于交易和交易之中的信息,先写到这里,太长了估计没人看了. T_T
接下来的系列文章中,我会结合代码,写一下交易结构和信息结构,在eosio的代码中是如何表示的,会有什么操作.
预告一下后续的内容:
- 交易与信息结构的代码表述
- 如何创建交易
- 交易的验证
- 交易如何广播
- 交易如何构建为区块?
- 区块的结构
- ......
我也是在边写边了解,肯定会存在一些理解不当之处,真心希望关心EOS的朋友给予指正.
网友评论
其实现在有一些跟踪的工具可以查看公网测试链的信息了。这篇文章比较早,四月份的一些新进展,没有更新到文章之中
。