以太坊智能合约开发试水-开发一个自己的智能合约需要准备什么

2,567 阅读5分钟

准备工作-必备知识

智能合约

image.png

  • 智能合约就是存在于以太坊区块链上的计算机程序(用 Solidity 语言编写),仅在由用户(或其他合约)发出的交易触发时执行(区块链存储的是状态,智能合约是区块链用于状态转换的方式),无法由发起者直接调用
  • 一旦智能合约发布到以太坊,只要以太坊存在,它就会一直在线并运行,就连创作者也无法让它离线
  • 智能合约并不只是一个可以自动执行的计算机程序,也是一个系统参与者,它可以对接收到的信息进行回应,可以接收和储存价值,也可以向外发送信息和价值
  • 智能合约就像一个可以被信任的人,可以临时保存资产,总是按照事先的规则执行操作-可以理解成自动贩卖机
适合场景

image.png

Solidity

  • Solidity是一种智能合约高级语言,运行在Ethereum虚拟机(EVM)之上
  • Solidity是以太坊的首选语言
  • 语法接近于Javascript,是一种面向对象的语言
  • 使用Solidity,您可以创建用于投票、众筹、盲拍卖和多签名钱包等用途的合同(程序)
  • 文档

image.png

Hardhat

  • Hardhat是一个编译、部署、测试和调试以太坊应用的开发环境。它可以帮助开发人员管理和自动化构建智能合约和dApps过程中固有的重复性任务,并围绕这一工作流程轻松引入更多功能。
  • Hardhat内置了Hardhat网络,这是一个专为开发设计的本地以太坊网络。主要功能有Solidity调试,跟踪调用堆栈、console.log()和交易失败时的明确错误信息提示等。
  • 文档

image.png

QuickNode

  • 高性能以太坊节点服务
  • 使用专用节点以获得更好的区块链访问性能
  • 快捷发布以太坊区块链(帮助广播发布合约和交易,以便快速被挖矿者捕获到,一旦被捕获到,发布和交易行为就会作为合法交易广播到区块链上,链上的所有节点就会就会对自己的数据进行更新)
  • QuikNode支持几乎所有流行的以太坊测试网,这使得开发者在测试网的选择上有了充分的灵活性,可以在自己喜欢的测试网上进行Dapp的测试
  • 官网

image.png

Metamask 加密钱包

  • 购买、存储、发送和交换代币
    • MetaMask可作为浏览器扩展程序和移动应用程序提供,为您提供密钥库、安全登录、令牌钱包和令牌交换——管理您的数字资产所需的一切。
  • 保存个人数据
    • MetaMask在您的设备上生成密码和密钥,因此只有您可以访问您的帐户和数据。您可以选择要分享的内容和保密的内容。
  • 探索区块链应用
    • MetaMask提供了连接到基于区块链的应用程序的最简单但最安全的方式。在新的去中心化网络上进行交互时,您始终处于控制之中。
  • 相当于你的个人账户
  • chrome插件示例: image.png

Goerlieth

  • Goerli 是最活跃的以太坊测试网之一
  • 获取测试以太币,以便进行开发测试
  • 水龙头:goerli-faucet.pk910.de/ ,只要输入你的钱包地址,就可以开始挂机挖矿,可以增加工作数量以提高效率

image.png

Gas

  • 以太坊的Gas(中文直译:气体),是以太坊上衡量工作量的计量单位,类似于我们每小时用了多少度电用千瓦/小时。
  • 以太坊上产生的各种交易、存储等活动都是需要Gas来推动的,Gas好比是燃料,推动以太坊虚拟机(EVM)来工作。
  • 在Goerli上挖到的测试币就是用来支付这个gas费用,同时智能合约里面也能发起转账

image.png

区块交易记录查询

  • 官网
  • 查看所有区块和交易(不管是谁的)
  • 查看指定合约发布状态
  • 查看交易记录和交易内容(无需登录,只需要输入地址hash则可以查看)
  • goerli.etherscan.io/address/[合约…]

image.png

开发过程

本地开发智能合约步骤

  1. 使用hardhat创建项目, 参考文档
  2. 创建xxx.sol文件,使用solidity语法进行合约编写,例如我的合约名称为:WavePortal
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.17;

import "hardhat/console.sol";

contract WavePortal {
    //...
    // 具体实现可参考solidy文档
}
  1. 编写测试js: scripts/run.js(通过hardhat提供的全局对象hre来获取ether环境数据:测试或实际环境)
const waveFactory = await hre.ethers.getContractFactory("WavePortal")

// 发布,并充值0.001(可用于后续合约内部交易)
const waveContract = await waveFactory.deploy({
     value: hre.ethers.utils.parseEther("0.001")
})
  1. 运行测试程序
 npx hardhat run scripts/run.js

发布智能合约步骤

  1. 编写发布js:scripts/deploy.js
// 调用智能合约的方法更新任意参数也视为“交易-transaction”
// 发布一个智能合约也属于-transaction
const mainD = async () => {
  const [deployer] = await hre.ethers.getSigners()
  const accountBalance = await deployer.getBalance()
  console.log('Deploying contracts with account:', deployer.address)
  console.log('Account balance:', accountBalance.toString())

  const waveFactory = await hre.ethers.getContractFactory("WavePortal")
  const waveContract = await waveFactory.deploy({
    value: hre.ethers.utils.parseEther("0.001"),
  })
  await waveContract.deployed()
  console.log('WavePortal address:', waveContract.address)
}

const runMainD = async () => {
  try {
    await mainD();
    process.exit(0)
  } catch (err) {
    console.log(err);
    process.exit(1)
  }
}

runMainD();
  1. 执行发布命令-以下为发布到goerli网络
npx hardhat run scripts/deploy.js --network goerli
  1. 提交修改后的智能合约代码到区块链,尽管只是修改一部分,都相当于是新的一次发布,原来保存在区块内的数据会丢失;
  2. 前端需要更新新的区块地址和abi文件(执行发布后生成的json文件)

前端调用

  1. 连接加密钱包metamask
    • MetaMask会向网页注入一个全局的API变量window.ethereum,可以从用户接入的区块链读取数据,并且能够提示用户签名要提交的交易
    • 通过window.ethereum能获取用户签名的加密钱包账户
  2. 引入发布合约生成的ABI json文件
  3. 安装引用ethers.js 依赖包
    • 根据合约地址和ABI文件实例化合约,以便调用合约方法
    • 连接到以太坊节点,读取账户地址数据等

一个小demo

如果你已经有metamask账户,欢迎访问我的测试Dapp应用: waveportal-starter-project.caryiwong.repl.co/

连接钱包,切换到goerli测试网络后就可以跟我打招呼啦~ image.png