智能合约入门:搞懂以太坊账户类型、交易模式和运行机制

638 阅读22分钟

智能合约入门:搞懂以太坊账户类型、交易模式和运行机制

智能合约开发核心概念 (详细版)

一、账户类型

  1. 外部账户 (EOA - Externally Owned Account)

    • 定义: 由私钥控制的账户,是用户与以太坊网络交互的主要方式。可以把它想象成你的银行账户,只有知道密码(私钥)的人才能控制它。

    • 特点:

      • 私钥控制: 拥有私钥(通常是 64 位的十六进制字符串)的人可以完全控制该账户的所有交易和操作。私钥必须妥善保管,丢失则无法找回,泄露则可能导致资产被盗。

      • 主动性: 可以发起交易,包括:

        • 转账 ETH 或代币给其他账户。
        • 部署新的智能合约到区块链上。
        • 与已经部署的智能合约进行交互,调用合约中的函数。
      • 无需代码: 外部账户本身不存储任何代码,它的行为完全由其拥有的私钥控制。

    • 作用:

      • 用户入口: 用户通过外部账户与区块链应用交互,例如:

        • 使用钱包应用(如 MetaMask、Trust Wallet)管理 ETH 和其他代币资产。
        • 参与 DeFi 活动,如借贷、交易、质押等。
        • 购买和交易 NFT。
      • 合约部署者: 开发者使用外部账户部署智能合约到区块链上。

      • 交易发起者: 用户使用外部账户发起各种类型的交易,实现不同的目的。

  2. 合约账户 (Contract Account)

    • 定义: 由智能合约代码控制的账户,是区块链应用的核心组成部分。可以把它想象成一个自动执行的程序,它的行为完全由预先编写好的代码逻辑决定。

    • 特点:

      • 代码控制: 合约账户的行为由预先编写好的智能合约代码逻辑决定,不能直接通过私钥控制。
      • 存储代码: 合约账户会存储智能合约的代码,这些代码定义了合约的行为和逻辑。代码一旦部署到区块链上,就无法修改(除非合约设计了升级机制)。
      • 被动性: 合约账户不能主动发起交易,只能被动地响应外部账户或其他合约账户发起的交易或消息调用。
      • 自动执行: 一旦部署到区块链上,合约代码就会自动执行,无需人工干预。但执行需要 Gas,需要由发起调用的账户支付。
    • 作用:

      • 实现业务逻辑: 智能合约代码定义了区块链应用的业务逻辑,例如:

        • DeFi 应用中的借贷、交易、清算等逻辑。
        • NFT 应用中的铸造、转让、拍卖等逻辑。
        • 供应链管理应用中的货物追踪、状态更新等逻辑。
      • 自动化执行: 智能合约可以自动执行,无需人工干预,提高了效率和可靠性。

      • 去中心化: 智能合约的执行是去中心化的,不受任何单一实体控制,保证了公平性和透明度。

  3. 总结

    特征外部账户(EOA)合约账户
    控制者私钥智能合约代码
    主动性可以发起交易不能主动发起交易
    代码
    存储
    交易发起多种类型被动接收
    余额可以有余额可以有余额
    地址私钥生成自动生成
    交互方式发起交易接收交易并执行代码

二、账户交互

  1. 外部账户与合约账户交互

    • 流程:

      1. 外部账户发起交易: 用户使用钱包应用创建一个交易,指定要调用的合约地址和函数,以及传递给函数的参数。
      2. 交易广播至以太坊网络: 钱包应用将交易签名后广播到以太坊网络中,等待矿工或验证者打包。
      3. 节点接收交易,EVM 执行对应智能合约的代码: 以太坊网络中的节点收到交易后,会使用 EVM 执行对应的智能合约代码。
      4. 合约更新状态、触发事件等: 智能合约代码执行完成后,会更新合约的状态,例如修改变量的值、存储数据等。合约还可以触发事件,将关键信息记录到区块链上。
    • 方式:

      • 直接调用: 外部账户直接调用合约的公共 (public) 函数。这是最常见的交互方式,例如调用 ERC-20 代币合约的 transfer 函数进行转账。
      • 间接调用: 外部账户通过调用其他合约的函数,间接与目标合约交互。这种方式通常用于实现更复杂的逻辑,例如 DeFi 应用中的多步交易。
      • 代理合约: 使用代理合约可以实现合约升级、访问控制等功能,外部账户通过代理合约间接调用目标合约的函数。
  2. 合约账户之间的交互 (消息调用)

    • 定义: 合约账户可以调用其他合约账户的函数,进行交互。 这种调用也被称为内部交易消息调用 (Message Call)

    • 示例:

      • DeFi 协议中,一个借贷合约可以调用一个预言机合约获取最新的资产价格。
      • 一个 NFT 市场合约可以调用 NFT 合约的 transferFrom 函数进行 NFT 的转让。
  3. 合约账户转账

    • 注意: 合约账户不能主动发起转账,只能被动地执行转账操作。

    • 方式:

      • 接收外部账户的转账指令(交易调用): 外部账户调用合约的函数,该函数内部执行转账操作。

      • 接收其他合约账户的转账指令(合约交互): 一个合约调用另一个合约的函数,被调用合约执行转账操作。

      • 根据预设条件自动触发转账(合约逻辑、定时任务、事件触发):

        • 合约逻辑: 当满足特定条件时,合约自动执行转账操作,例如:

          • 众筹合约达到目标金额后,自动将资金转给项目方。
          • DAO 合约根据投票结果自动执行资金分配。
        • 定时任务: 使用 Chainlink Keepers 或 Gelato 等服务,定时触发合约执行转账操作。

        • 事件触发: 监听特定事件,当事件发生时,合约自动执行转账操作。

      • 通过预言机获取链下信息并触发转账:

        • 合约使用 Chainlink 或其他预言机服务获取链下信息,例如价格、天气等。
        • 根据预言机提供的信息,合约判断是否需要触发转账操作。
    • 示例:

      • 众筹合约:接收用户捐款,达到目标后自动将 ETH 转移到项目发起人的地址。
      • 保险合约:当预言机报告发生特定事件(例如航班延误)时,自动向投保人支付赔偿金。
      • 自动做市商 (AMM):根据交易对的价格变化,自动调整流动性池中的资产比例。

三、交易类型

  1. 普通交易 (Regular Transaction)

    • 定义: 外部账户之间进行的 ETH 或代币转账。这是最简单的交易类型,用于实现价值的转移。

    • 字段:

      • to:接收方地址(另一个外部账户的地址)。
      • value:转账金额,以 Wei 为单位 (1 ETH = 10^18 Wei)。
      • data:可选字段,可以包含一些额外的数据,例如备注信息。
    • 场景:

      • 朋友间转账: 你想转给朋友一些 ETH。
      • 支付商品/服务: 你想使用 ETH 在线上商店购买商品或服务。
      • 交易所交易: 你想在加密货币交易所买入或卖出 ETH。
  2. 创建合约交易 (Contract Creation Transaction)

    • 定义: 将智能合约部署到以太坊区块链上。这种交易会将智能合约的代码上传到区块链,并创建一个新的合约账户。

    • 字段:

      • to:为空,表示创建合约。
      • value:可选字段,可以包含 ETH,用于支付合约部署费用和初始化合约状态。例如,如果合约的构造函数需要接收 ETH,则需要在此字段中指定金额。
      • data:编译后的智能合约代码,通常是字节码 (bytecode)。
    • 场景:

      • 部署新合约: 你开发了一个新的智能合约,需要将其部署到以太坊上。
      • 发行代币 (Token): 你想发行一种新的代币,例如 ERC-20 代币,需要创建一个 ERC-20 代币合约。
      • 创建去中心化应用 (DApp): 你想开发一个 DApp,需要部署相关的智能合约,例如智能合约游戏,智能合约钱包等等。
  3. 调用合约交易 (Contract Call Transaction)

    • 定义: 外部账户调用智能合约中的函数。这种交易会触发智能合约的执行,并根据合约代码的逻辑进行相应的操作。

    • 字段:

      • to:智能合约的地址。
      • value:可选字段,可以包含 ETH,用于支付合约调用费用(Gas),也可以用于向合约转账。例如,如果合约的某个函数需要接收 ETH,则需要在此字段中指定金额。
      • data:要调用的函数签名和参数。函数签名是一个哈希值,用于标识要调用的函数。参数是传递给函数的输入值。
    • 场景:

      • 使用 DApp: 你想使用一个 DApp,例如 Uniswap 进行代币兑换,需要调用相关的智能合约函数。
      • 参与 DeFi: 你想参与 DeFi 借贷或质押活动,需要与智能合约进行交互。
      • 购买 NFT: 你想购买一个 NFT,需要调用 NFT 智能合约的购买函数。
      • 铸造NFT: 你需要调用 NFT 智能合约的mint函数去铸造NFT。

四、以太坊虚拟机 (EVM)

  1. 定义:

    • 以太坊虚拟机(Ethereum Virtual Machine,简称 EVM)是一个 图灵完备的 虚拟计算机, 是以太坊的核心组成部分。它负责执行智能合约代码,处理交易,并维护区块链的状态。
  2. 作用:

    • 执行智能合约代码: EVM 负责解释和执行智能合约的字节码指令。
    • 计算状态变更: 根据智能合约的执行结果,EVM 会计算区块链的状态变更,例如账户余额的变化、合约存储的更新等。
    • 提供安全环境: EVM 提供了一个隔离的安全环境,确保智能合约的执行不会影响到以太坊网络的其他部分。
    • 确定性执行: EVM 执行合约必须确保执行结果的确定性,同样的输入一定会得到同样的输出。
    • 独立于主机,确保所有节点计算结果一致: EVM 的设计使其能够在不同的操作系统和硬件平台上运行,保证了以太坊网络的一致性。
  3. 工作原理:

    • 每个节点运行 EVM: 以太坊网络中的每个节点都运行着一个 EVM 实例。
    • 交易消耗 Gas: 智能合约的执行需要消耗 Gas,Gas 是一种用于衡量计算资源消耗的单位。
    • EVM 具有规则和限制: 为了防止恶意代码和资源滥用,EVM 对智能合约的执行设置了 Gas 上限和其他限制。
    • 更新区块链状态,生成新区块: 当 EVM 成功执行完智能合约后,会将状态变更提交到区块链,并由矿工或验证者打包成新的区块。
    • EVM的编译运行:首先,使用Solidity等高级语言编写智能合约;然后,使用Solidity编译器将智能合约编译成EVM字节码;最后,将编译后的字节码部署到以太坊网络,EVM负责解释和执行这些字节码。

五、以太坊客户端

  1. 定义:

    • 以太坊客户端是实现了以太坊协议的软件,允许用户连接到以太坊网络,并与网络进行交互。简单来说,以太坊客户端就是你访问以太坊网络的入口。
  2. 作用:

    • 同步区块链数据: 客户端会与其他节点同步区块链数据,包括区块头、交易信息等,确保本地存储的区块链数据与网络保持一致。
    • 广播交易和区块: 客户端允许用户发起交易,并将交易广播到以太坊网络中,等待矿工或验证者打包。同时,客户端也会接收来自网络的区块信息,并将新的区块添加到本地的区块链数据中。
    • 执行 EVM: 客户端内部集成了 EVM,用于执行智能合约代码。
    • 遵循共识机制: 客户端会遵循以太坊的共识机制(例如 PoW 或 PoS)来验证区块的有效性,并参与区块链的维护。
  3. 常见客户端:

    • Geth(Go-Ethereum): 使用 Go 语言编写,是以太坊官方提供的客户端,也是最常用的客户端之一。
    • OpenEthereum(原 Parity): 使用 Rust 语言编写,以性能和安全性著称,适合对资源占用有要求的场景。
    • Besu: 使用 Java 语言编写,由 Hyperledger 项目支持,面向企业级应用。
  4. 功能:

    • 节点类型:

      • 全节点 (Full Node): 存储完整的区块链数据,并验证所有交易和区块。全节点需要消耗大量的存储空间和计算资源,但可以提供最高的安全性和可信度。
      • 轻节点 (Light Node): 只存储区块头信息,不存储完整的交易数据。轻节点需要依赖全节点来获取交易信息,因此对资源的要求较低,但安全性也相对较低。
      • 归档节点 (Archive Node): 存储以太坊区块链的所有历史状态,包括每个账户在每个区块的状态。归档节点用于数据分析、审计等需要访问历史数据的场景。
    • 钱包功能: 客户端通常会提供钱包功能,用于管理用户的 ETH 和其他代币资产,生成和管理密钥对,以及发起交易。

    • 智能合约部署与交互: 客户端允许用户部署智能合约到以太坊网络,并与已经部署的智能合约进行交互,调用合约中的函数。

    • 开发者工具: 有些客户端会提供开发者工具,例如命令行界面 (CLI)、API 接口等,方便开发者进行智能合约开发和调试。

六、以太坊架构分层

  1. 执行层 (Execution Layer)

    • 定义: 以太坊网络中负责处理交易、运行智能合约和管理以太坊状态的部分。

    • 核心功能:

      • 交易处理 (Transaction Processing): 负责接收和验证交易,并将交易打包到区块中。
      • 智能合约执行 (Smart Contract Execution): 负责执行智能合约的字节码指令,并根据执行结果修改以太坊的状态。
      • 状态管理 (State Management): 负责管理以太坊的状态,包括账户余额、合约存储、代码等。
    • 技术实现: 以太坊虚拟机 (EVM)。

    • 区块的执行:执行层负责读取区块中的交易数据,并按照顺序执行这些交易。

  2. 共识层 (Consensus Layer)

    • 定义: 以太坊网络中负责确定区块的有效性和维护区块链一致性的部分。

    • 核心功能:

      • 验证区块 (Block Validation): 负责验证区块的有效性,包括验证区块中的交易是否合法、区块头是否符合共识规则等。
      • 维护区块链一致性 (Maintaining Blockchain Consistency): 负责维护区块链的一致性,确保所有节点都拥有相同的区块链数据。
    • 共识机制: 权益证明 (PoS)。

    • 技术实现: 验证者 (Validators) 和信标链 (Beacon Chain)。

      • 验证者 (Validators): 在 PoS 机制中,验证者负责验证区块的有效性,并通过投票来决定哪个区块可以添加到区块链中。
      • 信标链 (Beacon Chain): 以太坊 2.0 的核心组件,负责管理验证者集合,并运行 PoS 共识机制。
  3. 协作

    • 数据传递:共识层将区块提议传递给执行层,执行层处理这些交易,并将执行后的状态根返回给共识层。

    • 职责分离:共识层专注于区块链的共识和验证,执行层则负责智能合约的执行和状态更新。

    • 共识层确定区块提议者,执行层负责执行交易和更新状态。

      • 提议区块: 共识层通过PoS机制选择一个验证者来提议新的区块。
      • 执行交易: 执行层接收到共识层传递过来的区块提议后,会执行区块中的交易,并更新以太坊的状态。
      • 达成共识: 共识层会验证执行层执行后的状态,并与其他验证者达成共识,最终将区块添加到区块链中。

七、共识机制

  1. 工作量证明 (PoW)

    • 概念: 通过让矿工竞争解决一个复杂的数学难题来产生新的区块,解决难题的过程需要消耗大量的计算资源,因此被称为工作量证明。

    • 核心原理: 矿工通过不断尝试不同的随机数,计算区块头的哈希值,直到找到一个满足特定条件的哈希值,该区块才能被添加到区块链中。

    • 优点:

      • 简单易懂: PoW 的原理比较简单,容易实现。
      • 抗攻击性强: 攻击者需要控制大量的计算资源才能篡改区块链数据。
    • 缺点:

      • 能源消耗巨大: PoW 需要消耗大量的电力,造成能源浪费。
      • 中心化风险: 算力集中在少数矿池手中,存在中心化风险。
      • 效率低下: PoW 的交易确认速度较慢,难以满足大规模应用的需求。
  2. 权益证明 (PoS)

    • 概念: 通过让验证者质押一定数量的加密货币来获得验证区块的权利。

    • 核心原理: 网络会根据验证者质押的代币数量、质押时间等因素,选择一个验证者来创建新的区块。其他验证者会对新区块进行验证,如果超过一定数量的验证者同意,该区块就会被添加到区块链中。

    • 优点:

      • 节能环保: PoS 不需要消耗大量的电力,更加节能环保。
      • 去中心化: PoS 可以鼓励更多的参与者成为验证者,提高网络的去中心化程度。
      • 效率更高: PoS 的交易确认速度更快,可以满足大规模应用的需求。
    • 实现步骤

      • 质押(Staking) :用户将一定数量的以太币(ETH)存入一个特殊的合约中,成为验证者。
      • 选举:系统会根据一定的规则(比如质押数量、在线时间等)选择一部分验证者参与区块的创建和验证。
      • 创建区块:被选中的验证者负责创建新的区块,并将其广播到网络中。
      • 验证区块:其他验证者会对新区块进行验证,如果验证通过,则签名确认。
      • 达成共识:当一个区块获得足够多的签名后,就被认为是有效的,并添加到区块链中。

八、以太坊 RPC

  1. 概念:

    • 以太坊 RPC (Remote Procedure Call) 是一种允许外部应用程序与以太坊节点进行通信的协议。通过 RPC,应用程序可以向以太坊节点发送请求,并获取区块链上的数据,或者执行智能合约。
    • 类似于 API:可以把以太坊 RPC 理解为一种 API,它提供了一组标准的接口,应用程序可以通过这些接口与以太坊网络进行交互。
    • 使用 JSON-RPC 协议:以太坊 RPC 使用 JSON-RPC 协议进行数据交换,JSON-RPC 是一种轻量级、基于 JSON 格式的远程过程调用协议。
  2. 工作流程:

    • 客户端发送请求: 客户端(例如 DApp、钱包等)通过 HTTP 或 WebSocket 连接向以太坊节点发送 JSON-RPC 请求。

    • 请求格式:JSON-RPC 请求通常包含以下字段:

      • jsonrpc:指定 JSON-RPC 协议的版本,通常为 "2.0"。
      • method:指定要调用的以太坊 RPC 方法的名称,例如 eth_getBlockByNumbereth_sendTransaction 等。
      • params:指定调用 RPC 方法所需的参数,参数可以是数组或对象。
      • id:指定请求的 ID,用于标识请求,方便客户端异步处理响应。
    • 节点处理请求: 以太坊节点接收到客户端的请求后,会根据请求的内容进行相应的处理,例如查询区块链数据、执行智能合约等。

    • 返回响应结果: 节点处理完请求后,会将结果封装成 JSON-RPC 响应,并返回给客户端。

      • 响应格式:JSON-RPC 响应通常包含以下字段:

        • jsonrpc:指定 JSON-RPC 协议的版本,通常为 "2.0"。
        • result:指定请求的结果,如果请求成功,则该字段包含返回的数据;如果请求失败,则该字段为空。
        • error:指定请求的错误信息,如果请求成功,则该字段为空;如果请求失败,则该字段包含错误代码和错误信息。
        • id:指定请求的 ID,与请求中的 ID 对应。 同步和异步调用:RPC 可以通过同步或异步的方式调用。在同步调用中,客户端等待服务器返回响应后才能继续执行;在异步调用中,客户端发送请求后可以继续执行其他任务,当服务器返回响应时,客户端会收到通知。
  3. 常用方法:

    • eth_blockNumber 获取最新区块号。
    • eth_getBlockByNumber 根据区块号获取区块信息。
    • eth_getBlockByHash 根据区块哈希获取区块信息。
    • eth_getTransactionByHash 根据交易哈希获取交易详情。
    • eth_getTransactionReceipt 根据交易哈希获取交易收据。交易收据包含交易的状态(成功或失败)、Gas 消耗量、日志信息等。
    • eth_getBalance 获取指定账户的 ETH 余额。
    • eth_getCode 获取指定地址的合约代码。
    • eth_call 调用智能合约的只读函数(不修改状态),并返回结果。
    • eth_sendTransaction 发送交易,用于转账 ETH 或调用智能合约的函数(需要消耗 Gas)。
    • eth_sendRawTransaction 发送已经签名过的交易,允许离线签名交易。
    • eth_estimateGas 估算执行特定交易所需的 Gas 数量。
    • eth_getLogs 查询符合特定条件的事件日志。
    • web3_clientVersion 获取客户端的版本信息。
  4. 连接方式:

    • 本地节点 (Local Node): 在本地运行一个以太坊节点,例如 Geth 或 OpenEthereum,并通过 RPC 接口与节点进行通信。本地节点可以提供最高的安全性和隐私性,但需要消耗大量的计算和存储资源。
    • 公共 RPC 服务 (Public RPC Service): 使用第三方提供的公共 RPC 服务,例如 Infura、Alchemy、QuickNode 等。公共 RPC 服务可以方便地访问以太坊网络,无需自己维护节点,但可能会存在安全和隐私风险。
  5. 安全与限制:

    • 权限控制 (Access Control): RPC 接口可以用于执行敏感操作,例如发送交易、访问账户等,因此需要进行权限控制,防止未经授权的访问。
    • 请求频率限制 (Rate Limiting): 为了防止滥用和 DDoS 攻击,RPC 服务通常会设置请求频率限制。如果你的应用程序需要频繁访问 RPC 服务,可能需要购买更高容量的付费服务。
    • CORS 策略:通常需要配置跨域资源共享(CORS)策略,以允许来自不同域的客户端访问 RPC 服务。

九、智能合约,EVM,区块链节点关系

  • 智能合约 (Smart Contract):

    • 是部署在区块链上的可执行代码,定义了状态和函数,用于实现特定的业务逻辑。智能合约通常使用 Solidity 等高级编程语言编写,然后编译成字节码 (bytecode),存储在区块链上。
  • EVM (Ethereum Virtual Machine):

    • 是以太坊虚拟机,是执行智能合约代码的运行环境。EVM 负责解释和执行智能合约的字节码指令,并管理以太坊的状态。
  • 区块链节点 (Blockchain Node):

    • 是参与以太坊网络的计算机,存储着区块链的完整或部分数据,并负责验证交易、执行智能合约、参与共识机制。每个区块链节点都运行着一个以太坊客户端,例如 Geth 或 OpenEthereum。
  • 三者关系:

    • 智能合约运行在 EVM 中: 当用户调用智能合约的函数时,交易会被发送到以太坊网络,并由区块链节点上的 EVM 执行。
    • EVM 运行在区块链节点上: 每个区块链节点都运行着一个 EVM 实例,用于执行智能合约代码。
    • 区块链节点共同维护着以太坊网络: 区块链节点之间相互通信,同步区块链数据,并共同参与共识机制,维护以太坊网络的正常运行。

总结

理解以太坊的核心概念,如外部账户、合约账户、不同类型的交易模式、EVM、区块链节点以及 RPC 通信,是进入 Web3 和区块链开发的关键。掌握这些知识,你就能构建去中心化应用,参与 DeFi 生态,探索 NFT 世界。希望本文能帮助你扫清入门障碍,踏上区块链开发的征程。请记住,理论学习与实践操作相结合,才能更好地掌握这些概念,创造出更多有价值的应用。