solidity进阶(更新中)

news/2024/10/12 20:28:18

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

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 networknetworks: {// Configuration for mainnetmainnet: {provider: function () {// Setting the provider with the Infura Mainnet address and Tokenreturn new HDWalletProvider(mnemonic, "https://mainnet.infura.io/v3/YOUR_TOKEN")},network_id: "1"},// Configuration for rinkeby networkrinkeby: {// Special function to setup the providerprovider: function () {// Setting the provider with the Infura Rinkeby address and Tokenreturn new HDWalletProvider(mnemonic, "https://rinkeby.infura.io/v3/YOUR_TOKEN")},// Network id is 4 for Rinkebynetwork_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

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/27188.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

11.盛最多水的容器

中等 提示给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:你不能倾斜容器。示例 1:输入:[1,8,6,2,5,4,8,3…

redisson分布式锁原理

参考: 图灵课堂https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 https://blog.csdn.net/asd051377305/article/details/108384490 分布式锁的引入 当在单机单线程情况下,是不用考虑任何并发问题的,一切都是那么的美好,那么的顺其自然。 在单机多线程情况下,…

go学习05

gorm的使用 type User struct {gorm.ModelName stringAge intSex bool }func main() {db, err := gorm.Open("mysql", "root:password@/dbname?charset=utf8&parseTime=True&loc=Local")if err != nil {panic("failed to connect database…

一款现代化、高颜值的一站式智能运维管理平台

orion-ops-pro —— 一款现代化、高颜值的一站式智能运维管理平台,集资产管理、资产授权、批量执行、计划任务、WebShell、WebSftp、角色管理、系统管理等功能于一体,致力于简化运维团队的治理工作。大家好,我是 Java陈序员。 之前给大家介绍了一个简单好用安全的开源交互审…

引以为戒

你知道我要说什么你知道我要说什么你知道我要说什么你知道我要说什么你知道我要说什么你知道我要说什么你知道我要说什么你知道我要说什么你知道我要说什么你知道我要说什么你已经知道接下来会发生什么了,对吧?

【UWP】修改清单脱离沙盒运行

总说周知,UWP 是运行在沙盒里面的,所有权限都有严格限制,和沙盒外交互也需要特殊的通道,所以从根本杜绝了 UWP 毒瘤的存在。但是实际上 UWP 只是一个应用模型,本身是没有什么权限管理的,权限管理全靠 App Container 沙盒控制,如果我们脱离了这个沙盒,UWP 就会放飞自我了…

Oracle之数据库一致性读的原理

1.概述 在Oracle数据库中,undo主要有三大作用:提供一致性读(Consistent Read)、回滚事务(Rollback Transaction)以及实例恢复(Instance Recovery)。 2.原理 一致性读是相对于脏读(Dirty Read)而言的。假设某个表T中有10000条记录,获取所有记录需要15分钟时间。当前时…