以太坊的合约创建
在上一篇里,我们对以太坊的交易分了好几类,但严格意义上的交易只有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】以太坊的合约创建)

Phân tích giá thị trường ngày 22/09: Bitcoin, Ethereum, Ripple, Bitcoin Cash, EOS, Stellar, Litecoin, Cardano, Monero, IOTA

Phân tích giá Ethereum Sep.22: ETH có tăng trở lại

Công nghệ Ethereum có thể sẽ cắt giảm một nửa thị phần của Bitcoin
Đồng tiền mã hóa hỗ trợ mạng Ethereum, blockchain phổ biến nhất thế giới cho những liên doanh về tiề...