以太坊虚拟机EVM-合约创建过程

1)综述合约创建:
eth_sendTransaction:创建一个新的消息调用交易,如果数据字段中包含代码,则创建一个合约;

RPC(Romote Procedure Call):远程过程调用,允许一台计算机程序远程调用另外一台计算机的子程序,不用关心底层网络通信。

1. 编译合约代码,生成字节码:

"0x60606040523415600e57600080fd5b603580601b6000396000f3006060604052600080fd00a165627a7a723058204bf1accefb2526a5077bcdfeaeb8020162814272245a9741cc2fddd89191af1c0029"

2.发送一个eth_sendTransaction的RPC(远程过程调用)请求给以太坊的节点,创建一个交易
大致的参数:

{
  "from": "0xbd04d16f09506e80d1fd1fd8d0c79afa49bd9976",
  "to": null,
  "gas": "68653", // 30400,
  "gasPrice": "1", // 10000000000000
  "data": "0x60606040523415600e57600080fd5b603580601b6000396000f3006060604052600080fd00a165627a7a723058204bf1accefb2526a5077bcdfeaeb8020162814272245a9741cc2fddd89191af1c0029"
}

该交易机制也被用于:
@转移ether到账户或合约;
@调用一个带参数的合约方法;

处理交易时候,EVM会将输入数据,即:data作为代码执行,合约被创建

2)字节码详解:
编译生成的字节码可以分为三部分:

//部署代码
60606040523415600e57600080fd5b5b603680601c6000396000f300
//合约代码
60606040525b600080fd00
// Auxdata
a165627a7a723058209747525da0f525f1132dde30c8276ec70c4786d4b08a798eda3c8314bf796cc30029

创建合约时运行部署代码;
合约创建成功之后当方法被调用时,运行合约代码;
(可选)Auxdata是源码的加密指纹,用来验证。这只是数据,永远不会被EVM执行;

2.1 部署代码主要作用:
* 运行构造函数,设置初始化内存变量;
* 计算(读取)合约代码,并返回给EVM;

solidity编译器产生的部署代码会从字节码中加载合约代码到内存中,将它作为合约代码返回。

3)合约创建详解:
nonce:在比特币中,nonce主要用于调整pow挖矿的难度,而在以太坊中,除了调整挖矿难度外,在外部账户的每笔交易中也都存在一个nonce。这个nonce是一个连续的整数,在每个账户发送交易时所产生,其主要设计目的是为防止双花。

双花:即双重支付,指的是在数字货币系统中,由于数据的可复制性,使得系统可能存在同一笔数字资产因不当操作被重复使用的情况。

1. 检测调用者是否拥有足够的余额来转账;
2. 从调用者的地址派生一个新合约的地址(通过创建者账户的nonce);
3. 使用派生的合约地址来创建新合约账户;
4. 将初始的ether基金从调用者转到新合约中;
5. 设置输入数据为合约的部署代码,然后使用EVM来执行;
6. 检查错误,或如果合约代码太长则会失败。收取用户的gas然后设置合约代码。

4)构造器参数:
除了产生合约代码,部署代码的其他作用是运行构造器来进行设置。如果存在构造器参数,那么部署代码就需要从某地放加载参数。

 

参考资料:https://lilymoana.github.io/evm_part5.html#合约出生证明

你可能感兴趣的:(智能合约)