交易(Transaction)和消息(Message)是以太坊中两个非常关键的概念,同时也是非常相似的两个概念。
交易(Transaction)
交易是有外部拥有账户生成的加密签名的一段指令,序列化之后提交给区块链。 以太坊中的交易主要分为两种:一种是能够产生消息调用的交易,另一种是能够生成新账户的交易(如合约)。
总的来说,一个完整有效的交易包含以下几个部分:
- nonce:发送者发送交易的计数
- gasPrice:发送者愿意支付执行交易所需的每个
- gas的Wei数量
- gasLimit发送者愿意为执行交易gas数量的最大值,此值设置后在任何计算完成之前就会被提前扣掉,如果执行有剩余则会返回剩余gas。如果执行失败,返回gasLimit扣掉执行后的gas数量
- to:接收者的地址
- value:转账的金额(Wei)
- v, r, s:用于产生标识交易发送者的签名
- init :只在合约创建中存在,用来初始化新合约账户的EVM代码片段,只执行一次,然后就被丢弃,当其第一次执行时,它返回一个账户代码体,也就是永久和账户关联的一段代码
- data:可选域,只在能够出发消息调用的的交易中使用,可以理解为调用参数。
消息(Message)
消息与交易非常相似,但是它们本质的不同,交易是由外部账户发起的,而消息是由合约账户发起的,消息不会被记录到区块链上,在以太坊中,我们可以把消息看作在EVM中的函数调用
一般来说,消息会包含以下部分:
- from:消息的发送者
- to:接收者
- 以太币的数量(Wei)
- 可选数据域
- STARTGAS
- gasPrice
消息调用(Message call)
消息调用是对合约函数的本地调用,例如当你在js文件中使用.call()方法时,它是对合约自己的本地调用,不会产生交易,更不会向区块链广播
综述
- 账户创建
- 外部账户创建:离线创建或使用以太坊的命令在线创建,注意,新的外部账户是不需要再网络中注册,只需要符合网络采用的公钥私钥生成方法即可。
- 合约账户创建:根据创建该合约的账户地址和当前的nouce计算合约地址,然后使用这个计算出来的合约地址在stateDB中生成一个新的合约账户,并生成填入对应的codeHash。
- 交易过程
- 外部账户发起一笔交易
- 如果这笔交易是合约创建交易,则执行创建合约账户流程。
- 如果这笔交易是能够产生消息调用的交易即如上图所示,由一个外部账户向合约账户发送一笔能够产生消息调用的交易,此时会在当前节点的本地合约中产生一个本地的消息调用,如果还有其他合约账户的调用,则由该合约向对应合约账户发出一条消息,在当前节点的本地对应合约中执行本地消息调用。可以简单的把消息看作一笔交易的多个子执行。