准备工作-必备知识
智能合约
智能合约
就是存在于以太坊区块链上的计算机程序(用 Solidity 语言编写),仅在由用户(或其他合约)发出的交易触发时执行(区块链存储的是状态,智能合约是区块链用于状态转换的方式),无法由发起者直接调用- 一旦智能合约发布到以太坊,只要以太坊存在,它就会一直在线并运行,就连创作者也无法让它离线
- 智能合约并不只是一个可以自动执行的计算机程序,也是一个系统参与者,它可以对接收到的信息进行回应,可以接收和储存价值,也可以向外发送信息和价值
- 智能合约就像一个可以被信任的人,可以临时保存资产,总是按照事先的规则执行操作-可以理解成自动贩卖机
适合场景
Solidity
- Solidity是一种智能合约高级语言,运行在Ethereum虚拟机(EVM)之上
- Solidity是以太坊的首选语言
- 语法接近于Javascript,是一种面向对象的语言
- 使用Solidity,您可以创建用于投票、众筹、盲拍卖和多签名钱包等用途的合同(程序)
- 文档
Hardhat
- Hardhat是一个编译、部署、测试和调试以太坊应用的开发环境。它可以帮助开发人员管理和自动化构建智能合约和dApps过程中固有的重复性任务,并围绕这一工作流程轻松引入更多功能。
- Hardhat内置了Hardhat网络,这是一个专为开发设计的本地以太坊网络。主要功能有Solidity调试,跟踪调用堆栈、console.log()和交易失败时的明确错误信息提示等。
- 文档
QuickNode
- 高性能以太坊节点服务
- 使用专用节点以获得更好的区块链访问性能
- 快捷发布以太坊区块链(帮助广播发布合约和交易,以便快速被挖矿者捕获到,一旦被捕获到,发布和交易行为就会作为合法交易广播到区块链上,链上的所有节点就会就会对自己的数据进行更新)
- QuikNode支持几乎所有流行的以太坊测试网,这使得开发者在测试网的选择上有了充分的灵活性,可以在自己喜欢的测试网上进行Dapp的测试
- 官网
Metamask 加密钱包
- 购买、存储、发送和交换代币
- MetaMask可作为浏览器扩展程序和移动应用程序提供,为您提供密钥库、安全登录、令牌钱包和令牌交换——管理您的数字资产所需的一切。
- 保存个人数据
- MetaMask在您的设备上生成密码和密钥,因此只有您可以访问您的帐户和数据。您可以选择要分享的内容和保密的内容。
- 探索区块链应用
- MetaMask提供了连接到基于区块链的应用程序的最简单但最安全的方式。在新的去中心化网络上进行交互时,您始终处于控制之中。
- 相当于你的个人账户
- chrome插件示例:
Goerlieth
- Goerli 是最活跃的以太坊测试网之一
- 获取测试以太币,以便进行开发测试
- 水龙头:goerli-faucet.pk910.de/ ,只要输入你的钱包地址,就可以开始挂机挖矿,可以增加工作数量以提高效率
Gas
- 以太坊的Gas(中文直译:气体),是以太坊上衡量工作量的计量单位,类似于我们每小时用了多少度电用千瓦/小时。
- 以太坊上产生的各种交易、存储等活动都是需要Gas来推动的,Gas好比是燃料,推动以太坊虚拟机(EVM)来工作。
- 在Goerli上挖到的测试币就是用来支付这个gas费用,同时智能合约里面也能发起转账
区块交易记录查询
- 官网
- 查看所有区块和交易(不管是谁的)
- 查看指定合约发布状态
- 查看交易记录和交易内容(无需登录,只需要输入地址hash则可以查看)
- goerli.etherscan.io/address/[合约…
开发过程
本地开发智能合约步骤
- 使用hardhat创建项目, 参考文档
- 创建xxx.sol文件,使用solidity语法进行合约编写,例如我的合约名称为:
WavePortal
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.17;
import "hardhat/console.sol";
contract WavePortal {
//...
// 具体实现可参考solidy文档
}
复制代码
- 编写测试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")
})
复制代码
- 运行测试程序
npx hardhat run scripts/run.js
复制代码
发布智能合约步骤
- 编写发布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();
复制代码
- 执行发布命令-以下为发布到goerli网络
npx hardhat run scripts/deploy.js --network goerli
复制代码
- 提交修改后的智能合约代码到区块链,尽管只是修改一部分,都相当于是新的一次发布,原来保存在区块内的数据会丢失;
- 前端需要更新新的区块地址和abi文件(执行发布后生成的json文件)
前端调用
- 连接加密钱包metamask
- MetaMask会向网页注入一个全局的API变量window.ethereum,可以从用户接入的区块链读取数据,并且能够提示用户签名要提交的交易
- 通过window.ethereum能获取用户签名的加密钱包账户
- 引入发布合约生成的ABI json文件
- 安装引用ethers.js 依赖包
- 根据合约地址和ABI文件实例化合约,以便调用合约方法
- 连接到以太坊节点,读取账户地址数据等
一个小demo
如果你已经有metamask账户,欢迎访问我的测试Dapp应用:
waveportal-starter-project.caryiwong.repl.co/
连接钱包,切换到goerli测试网络后就可以跟我打招呼啦~
评论