以太坊的合约调用和交易执行

合约部署到以太坊的区块链上后,是为了让用户调用和执行的。与合约创建一样,合约的执行也是由交易驱动的,如图:
这里写图片描述

对于驱动合约执行的交易,有几个关键点:

1、合约在创建时,会生成一个合约地址,所以,通过交易调用合约的时候,就以合约地址为目的地址;

2、在交易的data域,会标明要调用合约的哪个函数,并且提供了该函数所需要的参数;

3、调用合约的交易,同样可以发送一笔以太币给合约,金额在value字段显示;

然后,我们再看看一笔交易(不光是合约执行的交易,指所有交易)发出去后,到底是怎么执行的。

1、交易向以太坊全网广播;

2、其他节点收到这笔交易后,会检查几个方面,以确认这笔交易是否有效:

1)交易数据都需要RLP编码,所以首先检查它是不是正确格式化的RLP;

2)验证签名是否有效;

3)检查交易序号nonce是否等于发送账户的nonce;

4)检查交易的gaLimit设置是否符合要求,它一定要大于等于以下几项之和(gas最小值):a、最小值21,000gas;b、与发送代码和数据长度相关的gas费用:值为0的字节,每字节费用为4gas,每个非零字节为68gas;c、如果交易用于合约创建,还需要额外的32,000gas;

5)检查发送者账户的余额是否足够支付所设置的gas;

3、验证通过后,矿工从发送者的余额中扣除gas最小值,将发送者账户中的nonce加1,表示这个账户又多发起了一笔交易;

4、如有代码调用(其实合约创建和合约调用都需要执行代码,合约创建会启动一个合约创建函数),代码会送到EVM虚拟机执行,并在整个执行过程中,以太坊会一直保持跟踪以下几项:

1)自毁集:需要删除的账户;

2)日志系列:虚拟机代码执行的归档和检查点;

3)退款余额:交易完成后要退给发送账户的以太币。为什么还有钱退?因为以太坊中的永续存储需要费用,所以同样地,如果该交易释放了一些存储也会有退款;

5、代码执行完毕后,如果一切正常,会打包到区块(跟比特币一样,以太坊也是POW挖矿模式,所以以上几步虽然所有节点都在进行,但最后只有在POW竞争中获胜的节点所打包的区块才会广播到全网,并被其他节点验证后认可,其他节点做的操作也和打包的矿工一样,验证交易是否有效,然后也在自己的EVM上跑代码,看看得出的结果是不是一致);

6、 根据交易结果,整个以太坊网络刷新账户状态,当然,具体完成得靠每个节点在自己机器上同步刷新;

好了,以太坊的账户和交易就讲到这里了,明天我们来看看以太坊的区块长什么样,因为账户和交易最终都是“存储”到区块里的。

猜你喜欢

转载自blog.csdn.net/lianquan_cn/article/details/82149924