solidity进阶(更新中)

开启第二阶段,主要学习合约部署、测试和预言机。

CryptoZombies的教程是用Truffle,现在主流是Hardhat,但学一学思想也有益无害。

----------------------------

update 5.3 学完了Truffle部署合约,后面几节是部署到它们的Loom网络,就不写这几节的笔记了

  •  启动一个新的终端窗口,创建项目目录并cd进入该目录,运行npm install truffle -g安装 Truffle 并使其全局可用。安装Truffle后,运行 truffle init来初始化我们的新项目。它创建一组具有以下结构的文件夹和配置文件:
├── contracts
    ├── Migrations.sol
├── migrations
    ├── 1_initial_migration.js
└── test
truffle-config.js
truffle.js
  • contracts 是 Truffle 期望找到我们所有智能合约的地方。为了保持代码的组织性,我们还可以创建嵌套文件夹,例如 contracts/tokenstruffle init 会自动创建一个名为 Migrations.sol 的合约以及相应的迁移文件,用于跟踪您对代码所做的更改,它的工作方式是将更改历史记录保存在链上。因此,您不可能将相同的代码部署两次。
  • migrations 目录下的一个 migration 就是一个 JavaScript 文件,告诉 Truffle 如何部署智能合约。
  • test 目录放置单元测试,可以是JavaScript 或 Solidity 文件。合约一旦部署就无法更改,因此我们必须在部署智能合约之前对其进行测试。
  • truffle.js truffle-config.js 是配置文件,用于存储部署的网络设置。 Truffle 需要两个配置文件,因为在Windows上将truffle.jstruffle.exe放在同一个文件夹中可能会导致冲突。如果您运行的是 Windows,建议删除 truffle.js 并使用 truffle-config.js 作为默认配置文件。
  • 我们将使用 Infura 将代码部署到以太坊,但是Infura 不管理私钥,也就是它无法代表我们签署交易。由于部署智能合约需要 Truffle 签署交易,我们需要一个名为 truffle-hdwallet-provider 的工具,它的唯一目的是处理交易签名。由于truffle init 命令期望找到一个空目录,我们在运行 truffle init 之后安装 truffle-hdwallet-provider
  • 以太坊虚拟机无法直接理解我们编写的 Solidity 源代码,编译器将我们的智能合约“翻译”为机器可读的字节码,然后虚拟机执行字节码,并完成我们的智能合约所需的操作。我们将游戏项目的所有智能合约复制到 ./contracts 文件夹中,执行 truffle compile进行编译。此命令应创建构建工件(artifacts)并将它们放置在 ./build/contracts 目录中。构建工件由智能合约的“字节码”版本、ABI 以及 Truffle 用于正确部署代码的一些内部数据组成。避免编辑这些文件,否则 Truffle 可能会停止正常工作。
  • 如果要部署多个合约,则必须为每个合约创建单独的migration文件,Migrations 始终按顺序执行 - 1、2、3 等。从创建好的./contracts/1_initial_migration.js 开始,首先脚本告诉 Truffle 我们想要与 Migrations 合约进行交互,然后导出一个函数,该函数接受 deployer 对象作为参数,该对象充当您(开发人员)和 Truffle 部署引擎之间的接口。我们创建一个新的迁移文件 ./contracts/2_crypto_zombies.js来部署我们自己的合约。
var CryptoZombies = artifacts.require("./CryptoZombies.sol");
module.exports = function(deployer) {
  deployer.deploy(CryptoZombies);
};
  • 有几个公共以太坊测试网可让您在将合约部署到主网之前免费测试您的合约(请记住,一旦将合约部署到主网,就无法更改)。这些测试网络使用与主网不同的共识算法(通常是 PoA),并且以太币是免费的。我们将使用 Rinkeby,由以太坊基金会创建的公共测试网络。在部署之前,我们必须编辑配置文件来告诉 Truffle 我们想要部署到的网络。正常情况下,为了避免泄露您的助记词(或您的私钥),您应该从文件中读取它并将该文件添加到 .gitignore 。此处仅为演示方便。
// Initialize HDWalletProvider
const HDWalletProvider = require("truffle-hdwallet-provider");

// Set your own mnemonic here
const mnemonic = "YOUR_MNEMONIC";

// Module exports to make this configuration available to Truffle itself
module.exports = {
  // Object with configuration for each network
  networks: {
    // Configuration for mainnet
    mainnet: {
      provider: function () {
        // Setting the provider with the Infura Mainnet address and Token
        return new HDWalletProvider(mnemonic, "https://mainnet.infura.io/v3/YOUR_TOKEN")
      },
      network_id: "1"
    },
    // Configuration for rinkeby network
    rinkeby: {
      // Special function to setup the provider
      provider: function () {
        // Setting the provider with the Infura Rinkeby address and Token
        return new HDWalletProvider(mnemonic, "https://rinkeby.infura.io/v3/YOUR_TOKEN")
      },
      // Network id is 4 for Rinkeby
      network_id: 4
    }
  }
};
  • 在进行部署之前,请确保您的帐户中有足够的以太币。获取以太币用于测试目的的最简单方法是通过名为 faucet 的服务。我们推荐在 Rinkeby 上运行的Authenticated Faucet。在终端中运行 truffle migrate --network rinkeby 以把合约部署到 Rinkeby。如果是部署到主网,在测试合约后运行 truffle migrate --network mainnet
  • 为了防止私钥文件被推送到 GitHub,我们创建一个名为 .gitignore 的新文件,然后通过以下命令告诉GitHub,我们希望它忽略保存私钥的文件。我们还需要编辑 truffle.js 配置文件,定义一个从文件中读取私钥并初始化新的 HDWalletProvider 的函数。
touch .gitignore
echo mainnet_private_key >> .gitignore

----------------------------

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章