# 编程日记:测试链部署合约(2022-08-22) **Published by:** [Corror](https://paragraph.com/@corror/) **Published on:** 2022-08-25 **URL:** https://paragraph.com/@corror/2022-08-22 ## Content 编程学习内容目录安装环境迁移智能合约编译智能合约部署智能合约方法一:contract factoty准备 Provider, 用于和网络建立连接;准备 Wallet, 用于签署交易;创建 contract factory, 并提供 .abi, .bin 以及 Wallet 来获取实例。通过 contract factory 的 deploy 方法,将合约部署至以太坊网络上。方法二:raw transaction将 transaction 用 raw 的形式 tx = {} 写出来。使用钱包的 sendTransaction() 方法,为 tx 进行签名和发送。td 交互智能合约做了什么?成功部署合约准备阶段:成功利用 ethers.js 中的 JsonRpcProvider, 建立连接起了程序和网络的连接,让程序和网络之间可以实现通讯;成功利用 ehters.js 中的 Signer, 创建了用于签名交易的钱包 (wallet);成功利用 Node.js 文件系统,导入了 .abi 接口文件以及 .bin 二进制文件,从而提供了合约的具体内容。部署阶段:成功利用 abi, bin 和 wallet 创建了 contract factory, 为部署合约提供了 initcode.成功部署了 initcode, 并发送了 initcode transaction, 从而成功部署了合约。成功确认了 initcode transaction, 并获得了交易收据。收获了什么?Provider 与 Wallet 的含义和作用含义:Provider 是一种接口,它负责为钱包和网络建立起连接;Wallet 是和以太坊账户相关的一种类,它负责使用私钥来对消息和交易进行签名。作用:是合约部署准备过程的一部分:准备 Provider 和 Wallet.准备智能合约的 .bin 和 .abi 格式。用法:const provider = new ethers.providers.JsonRpcProvider(url); const Wallet = new ethers.Wallet(privateKey, provider); UTF-8 与 Character Encoding 的关系含义:Character Encoding 是指字符编码,它定义了字节和文本之间的映射关系 (a mapping between bytes and text).UTF-8 是最常用的字节和文本之间的映射关系。关联: 每一串字节都可以根据不同的映射关系,被解释成为不同的文本,而 UTF-8 就是最常用的字符编码 (Character Encoding). 用法:fs.readFileSync(path, "utf8"); Contract Factory概念:Contract Factory 是一种类,它负责用来创建合约。 原理:Contract Factory 可以在实例化后发送一种特殊的交易 (initcode transaction), 该交易的结果是一串代码,它会被部署为新的 contract. 应用:async function deploy() { const factory = new ethers.ConstractFactory(abi, bin, wallet); const constract = await factory.deploy(); } 这里的 factory.deploy() 方法之前需要加 await 的原因是:根据 ehter.js 可以知道,该方法会返回一个 Promise< Constract >, 因此需要通过 async 和 await 来处理返回值 Promise。 如果既不不加 async 也不加 await, 那么在处理返回值 Promise 的时候,会由于不认识 .then() 方法而导致报错。 所以,如果要处理 Promise, 那么一定需要写上 async 和 await.交易部署逻辑原理:先运行 transaction factory 的 deploy() 方法,将 transaction factory 部署至以太坊网络上;再运行 transaction factory 的deployTransaction() 方法,从而真正将智能合约部署在以太坊网络当中,并获得 transaction response;最后,在以太坊网络响应了 transaction response 并经过区块确认交易后,会获得 transaction receipt,即我们在区块链浏览器上所看见的交易账单。步骤:参考代码 1️⃣ 部署 Transaction Factoryconst contract = factory.deploy(); 2️⃣ 部署智能合约constract.deployTransaction 3️⃣ resolve 交易收据contract.deployTransaction.wait() ## Publication Information - [Corror](https://paragraph.com/@corror/): Publication homepage - [All Posts](https://paragraph.com/@corror/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@corror): Subscribe to updates