如何在Arbitrum Nova上部署智能合约

  • QuickNode
  • 发布于 2024-10-30 12:57
  • 阅读 44

本文介绍了如何在Arbitrum Nova区块链上使用QuickNode和Hardhat工具构建、部署和交互一个简单的存储智能合约。文章详细解释了Arbitrum Nova的AnyTrust协议及其工作原理,并提供了从开发环境设置到合约部署和交互的完整指南。

概述

本指南涵盖了 Arbitrum Nova,这是一个通过 AnyTrust 协议提供低交易成本和高安全性的区块链。用户将学习如何使用 QuickNode 和 Hardhat 等知名开发工具在 Arbitrum Nova 上构建、部署和交互一个简单的存储智能合约。

你将需要什么

你将做什么

  • 了解 Arbitrum Nova 链
  • 构建一个简单的存储智能合约
  • 在 Arbitrum Nova 上部署存储合约
  • 与你部署的存储合约进行交互

什么是 Arbitrum Nova?

Arbitrum Nova 是由 Arbitrum 提供的一个区块链,它提供了极低的交易成本和高安全性。该链使用了一种名为 AnyTrust 的技术,这是 Arbitrum Nitro 技术的一个变体,它接受一个温和的信任假设,以换取最终用户的低费用。

让我们简要介绍一下 AnyTrust 的工作原理。

AnyTrust 协议

AnyTrust 建立在 Arbitrum Nitro 技术之上,这是对“经典”Arbitrum 的升级。AnyTrust 通过实施一种称为数据可用性委员会(DACs)的协议,显著降低了最终用户的费用。

现在让我们详细介绍这些信任假设是如何工作的,以及数据可用性委员会(DACs)如何参与其中。

数据可用性委员会(DAC)

数据可用性委员会的目标是确保最终用户的数据可用性。行业内一些最好的公司联合起来组成了 Nova 的数据可用性委员会(如 Google Cloud、QuickNode 和 Reddit)。DAC 成员必须运行数据可用性服务器(DAS)软件,该软件包括一个 Sequencer API,用于将数据块提交到 DAS 进行存储,以及一个用于查询块数据的 REST API。

信任假设是委员会有 N 个成员,AnyTrust 假设其中至少有两个是诚实的。这意味着如果 N-1 个委员会成员承诺提供对某些数据的访问权限,那么至少有一个承诺方必须是诚实的,确保数据可用并且协议可以继续运行。

假设委员会成员无法提供 AnyTrust 运行所需的必要数据。在这种情况下,委员会将失去共识,Nova 链将使用 Arbitrum Rollup 协议作为后备(即在以太坊链上存储交易数据),直到 DAC 委员会重新获得共识。

为什么选择 Arbitrum Nova?

通过利用 AnyTrust 技术和 Nitro 的共享代码库,Nova 提供了卓越的速度、安全性和以太坊互操作性。与以太坊相比,Nova 上的交易费用降低了 90%,并且挖矿速度更快,同时使用相同的安全性。

Nova 对于拥有大量交易量的用户或项目(如游戏开发者、社交项目和区块链应用程序如 NFT 和 DeFi)可能是有利的。

现在我们对为什么使用 Arbitrum Nova 有了更好的理解,让我们继续本指南的技术部分,该部分将演示如何使用 QuickNodeHardhat 等知名开发工具在 Arbitrum Nova 上部署智能合约。

开发者设置

使用 QuickNode 访问 Arbitrum Nova

你需要一个 API 端点来与 Arbitrum Nova 链通信。你可以使用公共节点或部署和管理自己的基础设施;但是,如果你希望获得 8 倍的响应速度,可以将繁重的工作交给我们。在此注册一个免费账户。

登录后,点击 创建端点,然后选择 Arbitrum Nova 主网链。

QuickNode Endpoint

创建端点后,请保留 HTTP Provider URL,因为在部署部分你将需要它。

Torus 钱包

你可以使用多种加密钱包来部署智能合约。在本指南中,我们将使用 Torus Wallet,这是一个非托管钱包,具有多链和网络可用性(例如以太坊、Arbitrum One、Arbitrum Nova 和其他 EVM 相关链)。

请注意,由于本指南涵盖了在 Arbitrum Nova 主网上的部署,你需要真实资金(即 ETH)来支付交易费用。然而,这应该非常便宜,费用不应超过 0.25 美分。ETH 可以在去中心化交易所(如 Uniswap)或托管交易所(如 Coinbase)上获得。

访问 Torus 并完成工作流程以生成私钥。

Torus Wallet

在开始本指南的技术部分之前,请确保你的 Arbitrum Nova 主网地址上有足够的资金来支付合约部署和交互费用。

Hardhat

Hardhat 是一个流行的 EVM 相关区块链开发框架。它由不同的组件组成,从编译、调试、测试到部署智能合约。你可以使用 SolidityYulAssembly 在 Hardhat 上部署智能合约。你可以在此找到有关 Hardhat 的更多信息。

在下一节中,我们将使用 Hardhat 开始开发我们的智能合约。

项目设置

要设置项目,我们必须创建一个名为 StorageContract 的文件夹并安装所需的依赖项。

为此,请运行以下终端命令:

mkdir StorageContract && cd StorageContract
npm init -y
npm install --save-dev hardhat
npm i dotenv
npm i @nomicfoundation/hardhat-toolbox
npx hardhat

当 Hardhat 提示你创建什么类型的项目时,选择 创建一个空的 hardhat.config.js 选项。

创建 Hardhat 项目后,我们将运行以下终端命令来为我们的智能合约创建一个有组织的开发环境。

mkdir contracts
mkdir test
mkdir scripts
echo > .env

然后,我们将配置 hardhat.config.js 文件,使其包含以下代码:

require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();

module.exports = {
  solidity: "0.8.17",
  networks: {
    nova: {
      url: process.env.RPC_URL,
      accounts: [process.env.PRIVATE_KEY]
    }
  }
};

最后,打开 .env 文件并粘贴以下环境变量。

PRIVATE_KEY=<FILLME>
RPC_URL=<FILLME>

用你在上一节中创建的私钥和 RPC URL 填写这些值。记得保存你到目前为止编辑的文件。

在 Arbitrum Nova 上构建智能合约

是时候开始构建了!如果你还没有 Solidity 经验,请花点时间查看 如何使用 Solidity 创建“Hello World”智能合约 指南中的 Solidity 101 部分。

准备好后,在你的 contracts 文件夹中创建一个名为 SimpleStorage.sol 的文件:

echo > contracts/SimpleStorage.sol

打开文件并输入以下代码:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract SimpleStorage {
    address public owner;  // 公共变量,存储合约所有者的地址
    uint public value;     // 公共变量,存储值

    event NewValueSet(uint value);    // 设置值时发出的事件
    event OwnerChanged(address newOwner); // 所有者更改时发出的事件

    constructor() {
        owner = msg.sender;  // 将所有者初始化为部署合约的地址
    }

    // 修饰器,在执行前检查 msg.sender 是否是所有者
    modifier onlyOwner() {
        require(msg.sender == owner, "只有所有者可以执行此操作。");
        _;
    }

    /**
     * @dev 读取合约中当前存储的值的函数
     * @return uint - 合约中存储的值
     */
    function readValue() public view returns (uint) {
        return value;
    }

    /**
     * @dev 在合约中设置新值的函数
     * @param _value - 要设置的新值
     */
    function setValue(uint _value) public onlyOwner {
        value = _value;
        emit NewValueSet(value);
    }

    /**
     * @dev 读取合约中当前存储的所有者的函数
     * @return address - 合约中存储的值
     */
    function getOwner() public view returns (address) {
        return owner;
    }

    /**
     * @dev 更改合约所有者的函数
     * @param _newOwner - 合约的新所有者
     */
    function changeOwner(address _newOwner) public onlyOwner {
        require(_newOwner != address(0), "新所有者地址不能为 0x0");
        owner = _newOwner;
        emit OwnerChanged(owner);
    }
}

在继续下一节之前,花几分钟时间查看代码注释,以更好地理解存储合约的逻辑。代码使用了 Solidity 概念,如事件、require 语句、修饰器和其他 Solidity 最佳实践。

部署前测试智能合约

在部署这个基本的存储合约之前,我们需要确保合约的行为符合预期。我们可以通过运行一些测试来做到这一点。在你的 test 文件夹中,使用以下命令创建一个名为 storageTest.js 的文件:

echo > test/storageTest.js

然后,在代码编辑器中打开文件并输入以下代码:

const { expect } = require("chai");

describe("Storage Contract Test", function () {
    let owner;

    beforeEach(async function () {
        // 从 ethers 中检索默认账户
        [owner] = await ethers.getSigners();

        // 获取合约实例并在本地部署的辅助函数
        const SimpleStorage = await ethers.getContractFactory("SimpleStorage");
        simpleStorage = await SimpleStorage.deploy();
    });

    it("should set and get value correctly", async () => {
        // 设置一个新值
        const newValue = 12345;
        await simpleStorage.setValue(newValue);

        // 读取值并期望它为 12345
        const value = await simpleStorage.readValue();
        expect(value).to.equal(newValue);
    });

    it('should return the address of the contract owner', async () => {
        // 获取存储在合约中的所有者地址
        const contractOwner = await simpleStorage.getOwner();

        // 期望合约所有者为部署合约的地址
        expect(contractOwner).to.equal(owner.address);
    });

    it("should change the owner correctly", async () => {
        // 将所有权更改为一个新地址
        await simpleStorage.changeOwner("0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5");
        const updatedOwner = await simpleStorage.getOwner();

        // 期望合约所有者为新地址
        expect(updatedOwner).to.equal("0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5");
    });

});

花几分钟时间阅读代码注释并理解代码

要运行测试,请导航到你的主目录(例如 StorageContract)并运行以下终端命令:

npx hardhat test

你应该会看到类似以下的输出:

Hardhat Test

在 Arbitrum Nova 上部署智能合约

本节将把智能合约部署到 Arbitrum Nova 主网。

在你的 scripts 文件夹中,创建一个名为 deploy.js 的文件:

echo > scripts/deploy.js

该文件将包含将我们的合约部署到 Arbitrum Nova 主网所需的逻辑。打开文件并输入以下代码:

const hre = require("hardhat");

async function deploy() {
    // 部署合约
    const SimpleStorage = await hre.ethers.getContractFactory("SimpleStorage");
    const simpleStorage = await SimpleStorage.deploy();

    // 打印部署合约的地址
    console.log("SimpleStorage contract deployed at:", simpleStorage.address);
}

deploy()
    .then(() => console.log("Deployment complete"))
    .catch((error) => console.error("Error deploying contract:", error));

要部署合约,请在终端中运行以下 hardhat 命令:

npx hardhat run --network nova scripts/deploy.js

你应该会看到一个包含你部署的合约地址的输出。

在 Arbitrum Nova 上与智能合约交互

导航到 Arbitrum Nova 的区块浏览器,通过输入从部署脚本返回的地址来验证智能合约是否已部署。

要与存储合约交互,请在 scripts 目录中创建一个名为 interactStorage.js 的附加脚本:

echo > scripts/interactStorage.js

然后打开文件并输入以下代码:

const hre = require("hardhat");

async function main() {
    // 获取 SimpleStorage 合约的合约工厂
    const SimpleStorage = await ethers.getContractFactory("SimpleStorage");

    // 附加到指定地址的已部署合约
    const simpleStorage = await SimpleStorage.attach(
      "DEPLOYED_CONTRACT_ADDRESS" // 你部署的合约地址
    );

    // 调用 readValue 函数以获取当前值
    let getValue = await simpleStorage.readValue();
    console.log("currentValue: ", getValue)

    // 调用 setValue 函数以更新值
    let setValueTx = await simpleStorage.setValue(420)
    console.log("setValue function call. Waiting for confirmation...")

    // 等待 3 个区块以确认交易
    await setValueTx.wait(confirm=3);

    // 再次调用 readValue 函数以获取最新值
    let latestValue = await simpleStorage.readValue();
    console.log("latestValue: ", latestValue)
}

// 启动脚本并处理任何错误
main()
    .then(() => console.log("Script complete"))
    .catch((error) => console.error("Error running script:", error));

上面的脚本将通过调用 setValue 函数来测试在我们的存储合约中设置一个值。它还将调用 readValue 函数以获取存储中的当前值。要运行脚本,请使用以下 hardhat 命令:

npx hardhat run --network nova scripts/interactStorage.js

就是这样!你刚刚使用 Hardhat 和 QuickNode 在 Arbitrum Nova 上创建了一个智能合约!

Arbitrum 生态系统

现在你已经在 Arbitrum Nova 上部署了你的第一个智能合约,探索一些 Arbitrum Nova 链提供的资源:

其他资源

如果你想继续学习 Arbitrum Nova 和智能合约,请查看这些资源:

最后的想法

恭喜!你现在对 Arbitrum Nova 以及如何部署智能合约有了更多的了解!你正在使用 Arbitrum Nova 做什么?我们很想看看你在创建什么!在 DiscordTwitter 上与我们分享你的应用程序。如果你对本指南有任何反馈或问题,我们很乐意听取你的意见!

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

0 条评论

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