Transaction, Message, Message call

Posted by 王锡亮 on November 20, 2018

You may find interesting:


2018.1.18区块链论文讨论班通知


Nothing at stake problem of PoS

交易(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()方法时,它是对合约自己的本地调用,不会产生交易,更不会向区块链广播

综述

图片1

  1. 账户创建
    • 外部账户创建:离线创建或使用以太坊的命令在线创建,注意,新的外部账户是不需要再网络中注册,只需要符合网络采用的公钥私钥生成方法即可。
    • 合约账户创建:根据创建该合约的账户地址和当前的nouce计算合约地址,然后使用这个计算出来的合约地址在stateDB中生成一个新的合约账户,并生成填入对应的codeHash。
  2. 交易过程
    • 外部账户发起一笔交易
    • 如果这笔交易是合约创建交易,则执行创建合约账户流程。
    • 如果这笔交易是能够产生消息调用的交易即如上图所示,由一个外部账户向合约账户发送一笔能够产生消息调用的交易,此时会在当前节点的本地合约中产生一个本地的消息调用,如果还有其他合约账户的调用,则由该合约向对应合约账户发出一条消息,在当前节点的本地对应合约中执行本地消息调用。可以简单的把消息看作一笔交易的多个子执行。