这篇文章主要整理了我的一些疑惑和解答,仅供参考,本人还在学习。

0x01 什么是智能合约?

以太坊的智能合约并非现实中常见的合同,而是存在区块链上,可以被触发执行的一段程序代码,这些代码实现了某种预定的规则,是存在于以太坊执行环境中的“自治代理”。

0x02 没有智能合约之前是如何运作的?

我们知道区块链简单可以分为三个发展阶段。

  1. Blockchain 1.0
    加密货币概念开始:第一代技术始于2009年的比特币网络,它被称为区块链1.0。在这一代中,引入了第一个加密货币的创造。
    这一阶段的想法都是关于支付及生成加密货币的功能。

  2. Blockchain 2.0
    智能合约的出现:在区块链技术的第二阶段,2010年引入了各种应用的智能合约和金融服务。以太坊和超级账本在这一代中出现。

  3. Blockchain 3.0

去中心化应用程序Dapp的兴起:在这一代区块链中,引入了对分散应用的收敛性。各种研究领域,如卫生、监管、物联网、供应链、商业和智能计算机被考虑用来构建去中心化的应用程序。
在这个级别上,使用了以太坊、超级账本和其他一些能够为各种应用程序编写智能合约的平台

由此我们得知,没有智能合约之前,区块链技术只能实现很简单的交易等,并不能实现去中心化服务

0x03 智能合约是如何发布和运行的?有什么用?

3.1 智能合约的创建:

外部账户发起一个转账交易到0x0地址,合约的代码在data域里。

3.2 智能合约的部署:

主要流程包括以下4个步骤:
(1)启动一个以太坊节点/在本地安装hardhat、truffle等平台,他们是solidity编译器;
(2)编写智能合约;
(3)编写后的智能合约经以太坊虚拟机的编译,成为计算机可运行的字节码;
(4)外部账户(合约发起者)发起一个转账交易到0x0地址,编译好的字节码文件在data域里。最终,通过发起交易的形式广播到区块链网络中,由矿工挖矿确认后即可将智能合约存入区块链中,并得到智能合约所在地址及调用合约所需接口。
以上就是智能合约的部署方式。

tips:
(1)不是必须的,不一定非要有一个节点 普通用户编写完智能合约之后,在hardhat或者remix等平台本地编译,发送一个新建智能合约的交易到网关节点,由网关节点发送交易到0x0地址,并以广播形式… 重复以上。
data域是交易的其中一个内容。

3.3 智能合约的执行:

智能合约可以被外部调用,也可以被另一个合约调用。
外部即外部账户,普通用户想要调用智能合约的某个功能,他会

(1) 首先 ,发起一个智能合约交易,data中存储调用的函数。相应的有Gas消耗
(2) 交易发送到比如网关节点 infura之类的
infura节点对该交易进行验证,加入自己的交易池中,并向其他节点广播该交易
(3) 其他节点收到交易之后,也进行验证,并加入交易池,广播给其他节点
重复以上直到该交易广播到全网 (这个过程时间多少?)
(4) 矿工节点除了有广播和验证的功能之外,还有打包区块的功能。
最终,该交易会被一个矿工节点打包到区块上,添加到区块链上。
(5) 新的区块不断广播,节点验证每个区块,加入到自己本地存储的区块链,也就是账本上。
注意:每个节点都会执行新产生的区块中的智能合约操作,在EVM中执行。

tips:
Infura是一个托管的以太坊节点集群,可以将你开发的以太坊智能合约部署到infura提供的节点上,而无需搭建自己的以太坊节点。通过api调用,可以执行交易,合约交易产生的结果输出到程序中。

0x04 EVM的作用

以太坊虚拟机是在沙盒中运行,这是和区块链主链完全隔离的,并且完美地作为测试环境运行。因此,任何想要使用EVM创建智能合约的人,都可以在不受到其他区块链操作的影响下完成。

注意EVM和节点主机是隔离的,所以智能合约的运行和运行节点客户端的主机之间无关。
个人理解:主机运行客户端,所以成为节点。客户端中有EVM和区块链等。
至于节点客户端和主机之间有什么交互,我们后续再解答,笔者还未了解详细。

0x05 以太坊的交易

5.1 交易的执行

以太坊一个普通交易是如何执行的?

  1. 用户从Dapp或者钱包初始化一笔交易,比如发送资金或者调用合约。这个类似弹出了MetaMask交易界面。
  2. 用户使用它们的钱包(私钥)签名这个交易。这个例如我们在第一步弹出的交易界面点击确定按钮(签名交易)。
  3. 钱包将签名后的交易发送到连接到以太坊网络的一个节点,通常叫着网关节点。比如我们常用的Infura节点。
  4. 网关节点验证该交易有效并将它放入自己的内存池(交易池/交易队列)中。此时,该交易为Pending状态,所有人都可以读取(前提是提供该项服务)。具体的对象名称在Geth和Parity客户并不相同。进入pending状态的交易代表着将要被交易,具体交易区块由打包矿工决定。
  5. 网关节点将该交易向其它节点(邻近节点)扩散(广播)。这是个Pending交易传播过程。
    它节点接收到该交易后也验证有效性,然后放入自己的内存池中。然后再向其它节点扩散。这是其它节点将pending放入自己的内存池中。
  6. 重复上述步骤,直到该交易扩散到整个网络。
    矿工是一种特殊节点,它们除了接收交易和验证它以外,还试图把它加入一个区块。矿工特权,具有打包交易的权利。
  7. 最终,会有一个矿工将该交易打包到区块中(这里假定交易成功并且会被打包)并添加到区块链上(产生一个新区块)。这就是通常所说的挖矿(出块)。
    新产生的区块向全网广播。(以太坊大概13秒左右出一个块,基本上能够全网广播)。
  8. 所有节点接收到该区块,查看其中包含的交易并将其从自己的内存池中移除。

当然,这里是有前提的,假定该交易一定被打包,实际上,交易有可能不会被打包,还有可能会被挤出内存池,因为矿工遵循利益最大化原则,谁出的价格高(gasPrice),先给谁打包,这个原则也催生了跟随交易和抢先交易。

5.2 交易的种类

以太坊区块链可以托管三种类型的交易:

  1. 首先,你可以将以太坊从一个账户转移到另一个账户。这些转账和比特币转账差不多。例如,你可以转3ETH到房东的账户,作为房租。这些转账记录会包含以下内容:转账生效时的时间戳,转出资金者的地址作为资金的来源,接受者的地址,当然还有资金的数额。

  2. 用户还可以不给特定对象转账。这类转账就是创建智能合约。例如,假如Jackson和James很聪明,他们打算为特定赌注的条件创建智能合约。这种转账就会包含转出者的账户地址以及时间戳。

  3. 从外部账户转账到智能合约。每次账户想要执行智能合约,转账就会根据智能合约完成,而且相关的执行规则会记录在数据中,来指导这个合约如何运行。
    每次上述的转账发生,网络中的节点就会通过EVM来运行特定的代码。

以下内容我并未整理清楚,等待我后续补全!

  1. 智能合约的调用和交易流程
  2. 智能合约有什么新的发展方向
  3. Solidity 智能合约审计
  4. 其他关于以太坊的知识

0x06 一些有用的课程和笔记

0x07 参考链接:

欢迎关注我的个人公众号