{"content":{"title":"智能合约在以太坊上的工作原理概述","body":"配套[视频版](https://www.youtube.com/watch?v=JGUBbOgBEoQ)\r\n \r\n## 概述\r\n\r\n智能合约是以太坊区块链中的一等公民；它们是以太坊开发的重要组成部分。在本指南中，我们将概述智能合约在以太坊区块链上的工作原理。这包括如何设置以太坊集成开发环境（IDE），以及编写和部署智能合约的过程。\r\n\r\n## 什么是智能合约？\r\n\r\n智能合约就像现实世界中的合同。唯一的区别是它们是数字的。实际上，智能合约是存储在区块链上的计算机程序。智能合约是自执行的代码片段，当涉及各方预设的条件满足时执行；例如，当某人存入法定货币时，发放代币的智能合约。\r\n\r\n智能合约允许在匿名方之间进行安全可信的交易，而无需咨询中央权威机构。以太坊上的智能合约主要用 [Solidity](https://docs.soliditylang.org/en/v0.8.3/) 和 [Vyper](https://vyper.ai/) 编写。Solidity 是一种高层次的面向对象语言，受 C++、JavaScript 和 Python 的影响，旨在与以太坊虚拟机（EVM）集成。Vyper 是一种受到 Python 启发的实验性基于合约的语言。\r\n\r\n虚拟机在执行代码和执行计算机之间创建了一个抽象层。在任何给定区块只有一个区块链状态存在。以太坊区块链通过 [EVM（以太坊虚拟机）](https://ethereum.org/en/developers/docs/evm/) 来维护其 [状态](https://ethereum.org/en/developers/docs/evm/#state)。EVM 通过定义计算从区块到区块的新有效状态的规则来实现这一功能。\r\n\r\n为了在数学模型中表示这一点，我们可以把 **Y** 视为状态转换函数。该函数可以表示为 **Y(S, T) = S'**，其中：\r\n\r\n**S** 是旧的有效状态，\r\n\r\n**T** 是要添加到下一个区块的新有效状态的集合，\r\n\r\n**S'** 是新的有效状态。\r\n\r\n该函数接受旧的有效状态和一组新的有效交易，并生成一个新的有效状态作为输出。你可以在这篇 [关于 EVM 的综合博客中](https://ethereum.org/en/developers/docs/evm/) 阅读更多关于 EVM 的信息以及以太坊状态的工作原理。\r\n\r\n以上是 EVM 的技术细节；现在，让我们理解它是如何在实践中工作的。EVM 创建了一个在隔离环境中执行智能合约字节码的沙盒。这意味着机器代码与网络、文件系统或主机上的进程完全隔离。对于在 EVM 上实施的每个指令，系统会跟踪执行成本。与指令执行相关的成本以 gas 单位计量。希望执行此指令的用户必须保留一些以太币作为 gas 费用。[在这里了解更多关于 gas 和 gas 费用的信息](https://www.quiknode.io/guides/web3-sdks/estimating-gas-price-using-pending-transactions-in-python)。\r\n\r\nEVM 也是 [图灵完备的](https://en.wikipedia.org/wiki/Turing_completeness)。它通过启用一种按执行的软件指令收费的系统，而不是像比特币一样按执行的金融交易收费来实现这一点。 以太坊网络被视为图灵完备的，意味着它可以被视为一个点对点的全球分布式计算机。\r\n\r\n## 智能合约如何工作？\r\n\r\n每当有人想出售房屋时，他们会咨询经纪人。经纪人会收取一部分总金额来处理交易，并在买卖双方之间进行中介。假设我们消除了经纪人，而是创建了一个智能合约。\r\n\r\n这是编程设置的，以便每当提供的金额超过特定数额时，它将把房子出售给买方，转让权利，并将钱转移给卖方。这消除了流程中的中介。由于交易是直接在两个当事人之间进行的，因此整个过程更加便宜和安全。\r\n\r\n智能合约存储在区块链上，这意味着它们继承某些属性。其中两个属性值得注意——不可变性和全球分发性。不可变性意味着一旦智能合约被部署，没有人可以篡改它。而全球分布性意味着区块链网络上的每个人都验证合约的输出。如果有人试图更改合约，网络上的其他人将标记其为无效，这使得篡改几乎不可能。\r\n\r\n## 智能合约如何部署？\r\n\r\n智能合约在部署时首先被编译并转换为字节码。然后将字节码存储在区块链上，并为其分配一个地址。合约地址是基于创建合约的人的地址（发送者）和创作者发送的交易数量（nonce）来决定的。发送者地址和 nonce 会被 [RLP 编码](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/) 并用 [keccak-256](https://github.com/ethereum/eth-hash) 算法哈希。\r\n\r\n智能合约主要使用 Solidity 编写，通常使用 [Ethereum Remix IDE](https://remix.ethereum.org/) 部署和测试。Remix IDE 是一个开源的基于浏览器的以太坊智能合约 IDE。\r\n\r\n让我们尝试使用 Remix IDE 部署一个合约。我们将在 Sepolia 测试网上部署合约。为此，我们需要一些测试 ETH。你需要 [MetaMask](https://metamask.io/) 浏览器扩展程序来创建 ETH 钱包，并获取一些测试 ETH 来开始。\r\n\r\n你可以通过访问 [QuickNode Faucet](https://faucet.quicknode.com/?utm_source=internal&utm_campaign=guides) 获取测试 ETH。连接你的钱包并在 MetaMask 钱包中选择 [Sepolia 测试网](https://ethereum.org/en/developers/docs/networks/#testnets)。你的钱包地址应自动填写在“钱包地址”字段中。接下来，单击“继续”，在下一步中，如果你在 Twitter 上分享，你可以让你的测试 ETH 翻倍。你应该在几分钟内在你的钱包中获得测试 ETH（如果网络繁忙可能会更长）。\r\n\r\n![](https://img.learnblockchain.cn/2025/02/25/quicknode-faucet-sepolia-b3890641fa71b449075eac1498d90ac1.png)\r\n\r\n前往以太坊 Remix IDE，创建一个新的 Solidity 文件 - 比如 `TestContract.sol`。\r\n\r\n将以下代码粘贴到你的新 Solidity 脚本中：\r\n\r\n```codeBlockLines_e6Vv\r\n// SPDX-License-Identifier: MIT\r\npragma solidity 0.8.20;\r\n\r\ncontract TestContract {\r\n\r\n    uint256 private count = 0;\r\n\r\n    function increment() public {\r\n        count += 1;\r\n    }\r\n\r\n    function getCount() public view returns (uint256) {\r\n        return count;\r\n    }\r\n\r\n}\r\n```\r\n\r\n上述代码的解释：\r\n\r\n第 1 行：指定 [SPDX 许可证](https://spdx.org/licenses/) 类型，这是 Solidity ^0.6.8 之后的新增项。\r\n\r\n> 每当智能合约的源代码向公众提供时，这些许可证可以帮助解决/避免版权问题。如果你不希望指定任何许可证类型，可以使用特殊许可证 [UNLICENSE](https://spdx.org/licenses/Unlicense.html) 或者简单地跳过整个注释（这不会导致错误，只是警告）。\r\n\r\n第 2 行：声明 Solidity 版本。\r\n\r\n第 4 行：开始我们的合约，名为 **TestContract**。\r\n\r\n第 6 行：声明一个私有变量 **count**，为无符号类型整型，初始值为零。\r\n\r\n第 8-10 行：声明一个类型为 public 的函数 **increment()**，这意味着它可以被外部访问和其他合约访问，将 count 的值增加 1。\r\n\r\n第 12-14 行：声明一个类型为 public 和 view 的函数 **getCount()**，因为它的不可变值，这意味着它只能读取区块链状态，而不能写入任何东西。使用 returns 关键字指定该函数返回的值，这里以无符号整数形式返回 count 的值。\r\n\r\n单击左侧菜单中的 Solidity 图标，然后单击“编译 TestContract.sol”以编译智能合约。你也可以使用快捷键 Ctrl+S / Cmd+S 来编译合约。\r\n\r\n确保左侧边栏中的 Solidity 编译器版本与你的合约中的版本相同。如果版本不匹配，你将收到错误提示。\r\n\r\n![](https://img.learnblockchain.cn/2025/02/25/remix-ethereum-smart-contract-552123ee96aaae50a58c42bd66e4043d.png)\r\n\r\n成功编译合约后，编译器标签上会添加一个绿色勾选。确保在部署合约之前在 MetaMask 中选择 Sepolia 测试网。\r\n\r\n![](https://img.learnblockchain.cn/2025/02/25/metamask-sepolia-testnet-b568a49a78dc74a60973a8a40f51d250.png)\r\n\r\n现在要部署合约，请单击左侧菜单中的以太坊图标，从“环境”下拉菜单中选择 _Injected Provider - MetaMask_，然后单击“部署”。在 MetaMask 中批准交易。\r\n\r\n![](https://img.learnblockchain.cn/2025/02/25/remix-ethereum-deploy-smart-contract-08acac0e599142b2bd393f96a9b8a9f3.png)\r\n\r\n合约部署完成后，你可以在“已部署合约”部分找到它。\r\n\r\n![](https://img.learnblockchain.cn/2025/02/25/remix-ethereum-deployed-contract-018bce1716ff5f2b24f0232f488be1fa.png)\r\n\r\n智能合约还可以使用 [Hardhat](https://hardhat.org/)、[Foundry](https://github.com/foundry-rs/foundry) 或其他以太坊库进行部署。\r\n\r\n## 如何使用智能合约？\r\n\r\n我们可以直接从 Remix IDE 与智能合约进行交互。为此，请展开“已部署合约”部分中的合约，然后单击 `getCount`。你将看到 count 的初始值为零。\r\n\r\n![](<Base64-Image-Removed>)\r\n\r\n现在，单击 `increment` 将 count 的值增加一个。由于这是一个写操作（我们将向区块链写入，而不仅仅是从中读取），我们需要为此支付 gas 费用。在 MetaMask 中确认交易。\r\n\r\n交易完成后，再次单击 `getCount`，你将看到 count 的值增加了 1。我们正在修改链上的 `count` 值，然后查询更新后的值。\r\n\r\n![](<Base64-Image-Removed>)\r\n\r\n你还可以使用各种以太坊库与合约进行交互；这里有一个 [Ruby 的示例](https://www.quiknode.io/guides/web3-sdks/how-to-fetch-ethereum-event-logs-in-ruby)。为此，你需要 ABI（应用程序二进制接口）和智能合约地址。ABI 定义了合约中使用的函数和类型。在我们的综合 [ABI 指南](https://learnblockchain.cn/article/11184/) 中了解更多信息。\r\n\r\n## 结论\r\n\r\n恭喜你走到最后！你现在知道 EVM（以太坊虚拟机）是如何工作的。你知道如何设置以太坊 Remix IDE 进行智能合约测试和开发。你编写了一个智能合约，学习了如何获取测试 ETH，并在测试网上部署了合约。你还了解了如何通过 Remix IDE 与智能合约交互，以及如何向区块链写入数据。\r\n\r\n从 [QuickNode 指南](https://www.quicknode.com/guides) 中了解更多关于 [Solidity](https://www.quicknode.com/guides/tags/solidity) 和 [Vyper](https://www.quicknode.com/guides/tags/vyper) 的信息。\r\n\r\n订阅我们的 [新闻通讯](https://go.quicknode.com/newsletter)，以获取更多关于以太坊的文章和指南。如果你有任何反馈，请随时通过 [Twitter](https://twitter.com/QuickNode) 与我们联系。你总是可以在我们的 [Discord](https://discord.gg/quicknode) 社区服务器上与我们聊天，那里有一些你将遇到的最酷的开发者 :)\r\n\r\n>- 原文链接： [quicknode.com/guides/eth...](https://www.quicknode.com/guides/ethereum-development/smart-contracts/an-overview-of-how-smart-contracts-work-on-ethereum)\r\n>- 登链社区 AI 助手，为大家转译优秀英文文章，如有翻译不通的地方，还请包涵～"},"author":{"user":"https://learnblockchain.cn/people/25306","address":null},"history":"bafkreialecarcgwgd7wajydegk44q4zw57tkf32jchmgffb3ae5rrht5ka","timestamp":1740448041,"version":1}