# 智能合约创建和交互

By [Jason](https://paragraph.com/@jason-11) · 2022-02-09

---

特殊交易合约创建
--------

合约注册交易的目的地址是一个特殊地址——零地址。

合约注册交易中唯一需要的就是在data字段中包含经过编译的合约字节码。这个交易的唯一用处就是把合约注册到以太坊区块链上。你可以在value字段中包含以太币，从而为新的合约设置起始余额，但这是可选的。

创建合约的交易是通过外部地址向零地址发送一笔交易，将编译后的合约代码作为data地段的内容通过交易发送出去，完成合约的创建。

合约交互
----

而与合约的交互则是通过外部地址向合约地址发送一笔data字段有内容的交易实现的，具体说就是将想要调用的合约中的函数和函数的参数包含在data字段中，这样合约就可以执行相应的函数功能。

合约只有在被交易调用时才会执行。以太坊上所有合约的执行，归根结底，都是由来自外部账户所创建的交易触发的。一个合约可以调用另一个合约，然后一层层地在合约之间不断的调用，但是这个执行链条中的第一个合约的执行，一定是由外部账户所创建的交易触发的。智能合约永远不会“自动运行”或者在“后台运行”。在没有交易触发（不论是直接触发，还是通过智能合约调用链）执行的情况下，合约永远处于等待调用状态。另外，还需要注意的是，任何情况下智能合约的“并发执行”都是没有意义的：以太坊世界计算机是可以认为是一台单线程计算机。 总的来说用户创建合约也好还是和合约进行交互也好，都是通过外部地址发起的一笔交易来实现的。其中的关键在data字段的内容上。

所有的defi 项目在前端页面发起一个执行交易都是根据页面的输入和操作确定要调用的函数和参数，再通过连接的钱包发起交易。

向外部账户和合约传送数据的交易
---------------

常见的就是外部地址和合约的交互过程中的data字段内容，这个内容实用十六进制编码的包括两部分内容：

函数选择器：被调函数原型（prototype）的keccak-256哈希值的前4个字节，这允许EVM准确无误的识别被调函数

函数参数：函数运行所需要的函数

例：2e1a7d4d000000000000000000000000000002386f26fc10000

前面的2e1a7d4d是函数选择器，后面是参数值

---

*Originally published on [Jason](https://paragraph.com/@jason-11/VCgmon3tluQzUBXfKGHi)*
