值的存取应用2.0 | Web3.0 dApp 开发(四)
Eth-Scaffold 之旅~
在 1.0 的版本中,我们创建了一个简单的存值读值的dApp及其配套合约,并将其部署到了 Github-Pages上。 今天,我们对 1.0 的版本进行升级,让他变得更酷,我们甚至能给这个应用设计一个简单的经济模型! > **注:** 本文对 Austin Griffith 的分享有所参考—— > > https://mp.weixin.qq.com/s/cKQkg_q9vjmE9nWL08IajQ > > Repo URL: > > https://github.com/leeduckgo/set-purpose > > https://github.com/leeduckgo/set-purpose-contracts ## 0x01 让合约文件夹成为项目的子 Repo 在 Repo 中,我们会注意到 contracts 文件夹中实质存放的是另一个 Repo,这里用到了 git 中的`submodule`功能。 对于智能合约来说,这样做的好处是,可能对于同一个dApp来说,有不同的合约版本。例如对于 NFT 项目来说,有普通版、白名单版、可升级版等等,这个时候设置智能合约为 submodule,那么我们就可以在该文件夹中独立切换合约了。而不用再把合约移来移去。 以下是一些`submodule`相关的git操作: ```bash # 在该目录下添加 submodule git submodule add submodule-repository-URL # example: # git submodule add https://github.com/leeduckgo/set-purpose-contracts.git # 在 clone 的时候即下载子模块 git clone --recurse-submodules repository-URL # 手动拉取指定 submodule git submodule update --init folder-path # example: # git submodule update packages/hardhat/contracts --init ``` ## 0x02 给 setPurpose 函数加上权限控制 在原有的 `PurposeHandler` 基础上,我们通过 `require` 语句给 `setPurpose` 函数添加了权限控制。当合约调用人不是构造函数中赋值的`owner`的时候,就会报错并不执行下面的语句。 ```solidity pragma solidity >=0.8.0 <0.9.0; //SPDX-License-Identifier: MIT import "hardhat/console.sol"; contract PurposeHandler { //event SetPurpose(address sender, string purpose); string public purpose = "Building Unstoppable Apps"; address public owner = 0x7EF99B0E5bEb8ae42DbF126B40b87410a440a32a; // 这里填写你自己的地址 constructor() { // owner = msg.sender; } function setPurpose(string memory newPurpose) public { // about msg.sender: // https://cryptozombies.io/en/lesson/2/chapter/3 // about require: // https://cryptozombies.io/en/lesson/2/chapter/4 require( msg.sender == owner, "NOT THE OWNER!"); purpose = newPurpose; console.log(msg.sender,"set purpose to",purpose); //emit SetPurpose(msg.sender, purpose); } } ``` > **TIPS:** > > 关于 msg.sender: https://cryptozombies.io/en/lesson/2/chapter/3 > > 关于 require: https://cryptozombies.io/en/lesson/2/chapter/4 回到 set-purpose 根目录,启动本地链、部署合约、启动dApp: ```bash export SKIP_PREFLIGHT_CHECK=true # 设置环境变量 yarn chain # 启动链 yarn deploy # 部署合约 yarn start # 启动dApp ``` ![image-20211029132355937](/Users/liaohua/Documents/image-20211029132355937.png) 访问`http://localhost:3000`。 由 Owner 发起交易的演示: ![set_purpose_v0x02](https://tva1.sinaimg.cn/large/008i3skNgy1gvw62x1b5hg30oq0kbjzo.gif) 非 Owner 发起交易: ![set_purpose_v0x02-wrong](https://tva1.sinaimg.cn/large/008i3skNgy1gvw652dfh0g30oq0kbdmq.gif) > TIPS: > > 如果账户发生 Nonce 相关错误,重置 Nonce 即可: > > Metamask > Settings > Advanced > Reset Account --- --- ## ![slogan.jpeg](https://img.learnblockchain.cn/attachments/2020/05/2MLYUj8y5ec34769dcf2f.jpeg) ---
在 1.0 的版本中,我们创建了一个简单的存值读值的dApp及其配套合约,并将其部署到了 Github-Pages上。
今天,我们对 1.0 的版本进行升级,让他变得更酷,我们甚至能给这个应用设计一个简单的经济模型!
注: 本文对 Austin Griffith 的分享有所参考——
https://mp.weixin.qq.com/s/cKQkg_q9vjmE9nWL08IajQ
Repo URL:
https://github.com/leeduckgo/set-purpose
https://github.com/leeduckgo/set-purpose-contracts
0x01 让合约文件夹成为项目的子 Repo
在 Repo 中,我们会注意到 contracts 文件夹中实质存放的是另一个 Repo,这里用到了 git 中的submodule
功能。
对于智能合约来说,这样做的好处是,可能对于同一个dApp来说,有不同的合约版本。例如对于 NFT 项目来说,有普通版、白名单版、可升级版等等,这个时候设置智能合约为 submodule,那么我们就可以在该文件夹中独立切换合约了。而不用再把合约移来移去。
以下是一些submodule
相关的git操作:
# 在该目录下添加 submodule
git submodule add submodule-repository-URL
# example:
# git submodule add https://github.com/leeduckgo/set-purpose-contracts.git
# 在 clone 的时候即下载子模块
git clone --recurse-submodules repository-URL
# 手动拉取指定 submodule
git submodule update --init folder-path
# example:
# git submodule update packages/hardhat/contracts --init
0x02 给 setPurpose 函数加上权限控制
在原有的 PurposeHandler
基础上,我们通过 require
语句给 setPurpose
函数添加了权限控制。当合约调用人不是构造函数中赋值的owner
的时候,就会报错并不执行下面的语句。
pragma solidity >=0.8.0 <0.9.0;
//SPDX-License-Identifier: MIT
import "hardhat/console.sol";
contract PurposeHandler {
//event SetPurpose(address sender, string purpose);
string public purpose = "Building Unstoppable Apps";
address public owner = 0x7EF99B0E5bEb8ae42DbF126B40b87410a440a32a;
// 这里填写你自己的地址
constructor() {
// owner = msg.sender;
}
function setPurpose(string memory newPurpose) public {
// about msg.sender:
// https://cryptozombies.io/en/lesson/2/chapter/3
// about require:
// https://cryptozombies.io/en/lesson/2/chapter/4
require( msg.sender == owner, "NOT THE OWNER!");
purpose = newPurpose;
console.log(msg.sender,"set purpose to",purpose);
//emit SetPurpose(msg.sender, purpose);
}
}
TIPS:
关于 msg.sender: https://cryptozombies.io/en/lesson/2/chapter/3
关于 require: https://cryptozombies.io/en/lesson/2/chapter/4
回到 set-purpose 根目录,启动本地链、部署合约、启动dApp:
export SKIP_PREFLIGHT_CHECK=true # 设置环境变量
yarn chain # 启动链
yarn deploy # 部署合约
yarn start # 启动dApp
访问http://localhost:3000
。
由 Owner 发起交易的演示:
非 Owner 发起交易:
TIPS:
如果账户发生 Nonce 相关错误,重置 Nonce 即可:
Metamask > Settings > Advanced > Reset Account
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。
- 发表于 2021-12-08 09:56
- 阅读 ( 174 )
- 学分 ( 5 )
- 分类:DApp
- 专栏:狗哥区块链精品内容集
评论