以太坊的合约创建
在上一篇里,我们对以太坊的交易分了好几类,但严格意义上的交易只有3种,这3种就是外部拥有账户发起的三种:
1、外部拥有账户发往外部拥有账户:这是最普遍的一种交易,在比特币里就只有这一种交易,它就是做一个价值转移,将以太币从一个外部账户转到另一个外部账户。对于非创建合约的交易,通常称之为消息通信,所以它就是一个简单价值转移的消息通信;
2、外部拥有账户发往空地址:这种交易的目的是创建一个智能合约,所以这种交易类型叫合约创建;
3、外部拥有账户发往合约账户:这种交易是为了调用合约的某个函数,所以它是执行合约的通信。
为什么说严格意义上的交易只有这3种呢? 因为合约账户没有私钥地址,它没办法签名,如果一个合约账户自动发起一个交易,那么谁都无法证明这个交易是这个合约账户主动发起的。
那是不是说,合约账户就没办法跟其他账户通信了呢? 肯定不是。 合约账户虽然不能主动发起交易,但它可以被动发起交易。
什么意思呢? 比如说合约账户B要向另一个账户C发起交易,它无法自己发起,必须先有一个外部拥有账户调用这个合约A的某个函数,然后这个函数再向B发起交易。
当然,合约B也可以是合约A调用的,合约调用的链条可以很长,但追根溯源,最开始的调用者必须是外部拥有帐户,外部拥有账户才是始作俑者。所以,以合约账户为发起者的交易,其实只是“类交易”,或者称之为“内部交易”。当然,内部交易的功能也很全,既可以做简单价值转移,也可以创建合约,还可以调用其他合约。
总之,记住一点,以太坊上的所有动静,都是由外部控制账户触发的交易搞出来的,它是驱动以太坊世界状态改变的第一动力。
对于简单价值转移的交易,很好理解,就不多说了,我们主要说说合约创建和合约执行的交易。
本篇先说合约创建,看下图:
1、合约创建的交易目的地址是个空地址,也就是说,你想部署一个合约,那就把交易的目的地址设置为空地址,交易执行后,以太坊有个专门的公式算出一个地址,做为新生成的合约的账户地址;
2、合约账户的nonce会设置成0,因为这个合约刚生成,还没创建过合约;
3、将交易发送的以太坊,做为合约的初始余额;
4、将合约的当前数据存储位置设置为0。我们前面说过,合约的数据存储位置从0开始编号,合约刚生成,所以,初始位置肯定为0。
5、合约账户刚生成时,codeHash设置为空字符串的哈希值,等到交易里的init代码执行完毕,完整的合约代码部署后,再将合约的EVM代码的哈希值存于codeHash。
最后注意一点,对于gas一定要给够,如果不够,会导致合约创建失败,而且被花费的gas不会被退回。不过,交易里发送给合约的以太币(value字段),在合约创建失败时是会退回的。
(原标题:【不死姐0720】以太坊的合约创建)