智能合约在以太坊上的工作原理概述

  • QuickNode
  • 发布于 2024-06-17 16:46
  • 阅读 39

本文介绍了以太坊智能合约的基本概念、工作原理及部署方法,详细说明了如何使用 Remix IDE 编写、编译和部署智能合约,并提供了一个简单的示例代码。

配套视频版

概述

智能合约是以太坊区块链中的一等公民;它们是以太坊开发的重要组成部分。在本指南中,我们将概述智能合约在以太坊区块链上的工作原理。这包括如何设置以太坊集成开发环境(IDE),以及编写和部署智能合约的过程。

什么是智能合约?

智能合约就像现实世界中的合同。唯一的区别是它们是数字的。实际上,智能合约是存储在区块链上的计算机程序。智能合约是自执行的代码片段,当涉及各方预设的条件满足时执行;例如,当某人存入法定货币时,发放代币的智能合约。

智能合约允许在匿名方之间进行安全可信的交易,而无需咨询中央权威机构。以太坊上的智能合约主要用 SolidityVyper 编写。Solidity 是一种高层次的面向对象语言,受 C++、JavaScript 和 Python 的影响,旨在与以太坊虚拟机(EVM)集成。Vyper 是一种受到 Python 启发的实验性基于合约的语言。

虚拟机在执行代码和执行计算机之间创建了一个抽象层。在任何给定区块只有一个区块链状态存在。以太坊区块链通过 EVM(以太坊虚拟机) 来维护其 状态。EVM 通过定义计算从区块到区块的新有效状态的规则来实现这一功能。

为了在数学模型中表示这一点,我们可以把 Y 视为状态转换函数。该函数可以表示为 Y(S, T) = S',其中:

S 是旧的有效状态,

T 是要添加到下一个区块的新有效状态的集合,

S' 是新的有效状态。

该函数接受旧的有效状态和一组新的有效交易,并生成一个新的有效状态作为输出。你可以在这篇 关于 EVM 的综合博客中 阅读更多关于 EVM 的信息以及以太坊状态的工作原理。

以上是 EVM 的技术细节;现在,让我们理解它是如何在实践中工作的。EVM 创建了一个在隔离环境中执行智能合约字节码的沙盒。这意味着机器代码与网络、文件系统或主机上的进程完全隔离。对于在 EVM 上实施的每个指令,系统会跟踪执行成本。与指令执行相关的成本以 gas 单位计量。希望执行此指令的用户必须保留一些以太币作为 gas 费用。在这里了解更多关于 gas 和 gas 费用的信息

EVM 也是 图灵完备的。它通过启用一种按执行的软件指令收费的系统,而不是像比特币一样按执行的金融交易收费来实现这一点。 以太坊网络被视为图灵完备的,意味着它可以被视为一个点对点的全球分布式计算机。

智能合约如何工作?

每当有人想出售房屋时,他们会咨询经纪人。经纪人会收取一部分总金额来处理交易,并在买卖双方之间进行中介。假设我们消除了经纪人,而是创建了一个智能合约。

这是编程设置的,以便每当提供的金额超过特定数额时,它将把房子出售给买方,转让权利,并将钱转移给卖方。这消除了流程中的中介。由于交易是直接在两个当事人之间进行的,因此整个过程更加便宜和安全。

智能合约存储在区块链上,这意味着它们继承某些属性。其中两个属性值得注意——不可变性和全球分发性。不可变性意味着一旦智能合约被部署,没有人可以篡改它。而全球分布性意味着区块链网络上的每个人都验证合约的输出。如果有人试图更改合约,网络上的其他人将标记其为无效,这使得篡改几乎不可能。

智能合约如何部署?

智能合约在部署时首先被编译并转换为字节码。然后将字节码存储在区块链上,并为其分配一个地址。合约地址是基于创建合约的人的地址(发送者)和创作者发送的交易数量(nonce)来决定的。发送者地址和 nonce 会被 RLP 编码 并用 keccak-256 算法哈希。

智能合约主要使用 Solidity 编写,通常使用 Ethereum Remix IDE 部署和测试。Remix IDE 是一个开源的基于浏览器的以太坊智能合约 IDE。

让我们尝试使用 Remix IDE 部署一个合约。我们将在 Sepolia 测试网上部署合约。为此,我们需要一些测试 ETH。你需要 MetaMask 浏览器扩展程序来创建 ETH 钱包,并获取一些测试 ETH 来开始。

你可以通过访问 QuickNode Faucet 获取测试 ETH。连接你的钱包并在 MetaMask 钱包中选择 Sepolia 测试网。你的钱包地址应自动填写在“钱包地址”字段中。接下来,单击“继续”,在下一步中,如果你在 Twitter 上分享,你可以让你的测试 ETH 翻倍。你应该在几分钟内在你的钱包中获得测试 ETH(如果网络繁忙可能会更长)。

前往以太坊 Remix IDE,创建一个新的 Solidity 文件 - 比如 TestContract.sol

将以下代码粘贴到你的新 Solidity 脚本中:

// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

contract TestContract {

    uint256 private count = 0;

    function increment() public {
        count += 1;
    }

    function getCount() public view returns (uint256) {
        return count;
    }

}

上述代码的解释:

第 1 行:指定 SPDX 许可证 类型,这是 Solidity ^0.6.8 之后的新增项。

每当智能合约的源代码向公众提供时,这些许可证可以帮助解决/避免版权问题。如果你不希望指定任何许可证类型,可以使用特殊许可证 UNLICENSE 或者简单地跳过整个注释(这不会导致错误,只是警告)。

第 2 行:声明 Solidity 版本。

第 4 行:开始我们的合约,名为 TestContract

第 6 行:声明一个私有变量 count,为无符号类型整型,初始值为零。

第 8-10 行:声明一个类型为 public 的函数 increment(),这意味着它可以被外部访问和其他合约访问,将 count 的值增加 1。

第 12-14 行:声明一个类型为 public 和 view 的函数 getCount(),因为它的不可变值,这意味着它只能读取区块链状态,而不能写入任何东西。使用 returns 关键字指定该函数返回的值,这里以无符号整数形式返回 count 的值。

单击左侧菜单中的 Solidity 图标,然后单击“编译 TestContract.sol”以编译智能合约。你也可以使用快捷键 Ctrl+S / Cmd+S 来编译合约。

确保左侧边栏中的 Solidity 编译器版本与你的合约中的版本相同。如果版本不匹配,你将收到错误提示。

成功编译合约后,编译器标签上会添加一个绿色勾选。确保在部署合约之前在 MetaMask 中选择 Sepolia 测试网。

现在要部署合约,请单击左侧菜单中的以太坊图标,从“环境”下拉菜单中选择 Injected Provider - MetaMask,然后单击“部署”。在 MetaMask 中批准交易。

合约部署完成后,你可以在“已部署合约”部分找到它。

智能合约还可以使用 HardhatFoundry 或其他以太坊库进行部署。

如何使用智能合约?

我们可以直接从 Remix IDE 与智能合约进行交互。为此,请展开“已部署合约”部分中的合约,然后单击 getCount。你将看到 count 的初始值为零。

现在,单击 increment 将 count 的值增加一个。由于这是一个写操作(我们将向区块链写入,而不仅仅是从中读取),我们需要为此支付 gas 费用。在 MetaMask 中确认交易。

交易完成后,再次单击 getCount,你将看到 count 的值增加了 1。我们正在修改链上的 count 值,然后查询更新后的值。

你还可以使用各种以太坊库与合约进行交互;这里有一个 Ruby 的示例。为此,你需要 ABI(应用程序二进制接口)和智能合约地址。ABI 定义了合约中使用的函数和类型。在我们的综合 ABI 指南 中了解更多信息。

结论

恭喜你走到最后!你现在知道 EVM(以太坊虚拟机)是如何工作的。你知道如何设置以太坊 Remix IDE 进行智能合约测试和开发。你编写了一个智能合约,学习了如何获取测试 ETH,并在测试网上部署了合约。你还了解了如何通过 Remix IDE 与智能合约交互,以及如何向区块链写入数据。

QuickNode 指南 中了解更多关于 SolidityVyper 的信息。

订阅我们的 新闻通讯,以获取更多关于以太坊的文章和指南。如果你有任何反馈,请随时通过 Twitter 与我们联系。你总是可以在我们的 Discord 社区服务器上与我们聊天,那里有一些你将遇到的最酷的开发者 :)

  • 原文链接: quicknode.com/guides/eth...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。