Alchemy 0撸教程:第二周任务 通往web3.0之路 手把手教你搭建“给我买杯咖啡”的
时间:2023-07-21 16:03:01 | 来源:网站运营
时间:2023-07-21 16:03:01 来源:网站运营
Alchemy 0撸教程:第二周任务 通往web3.0之路 手把手教你搭建“给我买杯咖啡”的 DeFi dapp:写在前面:接下来我会把Alchemy 1-10周的任务全部写出来。(1-10周理解成10个任务,完成后每个任务会有一个NFT,并不是代表你这周只能做第一个,下周只能做第二个)
注意:所有任务,只能用电脑做,因为Alchemy这个项目是教大家写Web3.0代码的,通过这些任务让你知道智能合约是怎么部署的,NFT画廊以及平台是怎么搭建的,swap dapp是怎么搭建的,以及gamefi的简单代码之类的。它是从纯粹技术角度来帮助大家更加深刻理解Web3.0。
电脑配置要求:win 8及以上的系统。(因为需要装一些软件,那些软件的配置对电脑的要求至少是win 8)
小狐狸钱包:最好是空钱包,你不用的,因为涉及到要在软件上传一些私钥之类的重要信息。
Alchemy项目介绍:
2019年12月,Alchemy完成
1500万刀A轮融资,投资机构是Pantera Capital,斯坦福大学,Coinbase以及三星等
2021年4月,Alchemy完成
8000万刀B轮融资,Coatue和Addition领投,DFJ Growth、K5 Global、Chainsmokers(烟鬼组合)、演员Jared Leto和Glazer家族参投。
2021年10月,Alchemy完成
2.5亿刀C轮融资,由a16z领投的。
2022年2月,Alchemy又完成2亿美元融资,Lightspeed与Silver Lake领投。
截止目前为止一共融资5.45亿刀。估值为105亿刀。
有a16z领投的项目放心就撸就可以了。项目背景强大、经费充足、踏实做事、还没有发token,目前每完成一个任务给一个灵魂绑定的NFT(NFT在你的钱包不可以卖,跟钱包是绑定的,Web3.0后期玩法非常多)
并且由于任务难度太大,并且任务比较多,劝退了很多人。并没有那么多撸子能坚持下来。第一遍做1-10个任务,快的话需要两天,一般需要三天时间,每天十个小时的那种。做到后面账号就快很多,但是一整天时间是要的。并且做完后官方快照速度慢。这又劝退了一大部分人。能坚持做下来的没几个。如果项目最后空投,那么绝对是大毛。一个NFT预估1000刀应该不是什么大问题。(开玩笑的,你们自己判断。这种毛先撸为尽)
教程开始1.安装环境(第二周就要搭建安装环境了,后面任务都要用到)
注意:这里对电脑配置就有要求了。至少是win8及以上的系统。不然后面任务都做不了了。
安装Nodejs软件,选择最新版本。(怎么安装Nodejs大家直接自行百度,我在这里不放链接了。)
安装完毕之后,还要做接下来的设置。(如果不设置,后面部署dapp一定出错!!!)
在你的电脑输入 cmd指令,并且依次输入node -v npm -v npx -v看这三个的版本号。
安装VScode(怎么安装VScode大家直接自行百度,我在这里不放链接了。)
2.对 BuyMeACoffee.sol 智能合约进行编码
1.按win+R调出命令框,输入cmd,进入控制台。
2.输入mkdir BuyMeACoffee-contracts按回车创建文件夹,再输入cd BuyMeACoffee-contracts 按回车进入该文件夹。(注意看路径,文件夹就在那个路径,多账号做的时候最好在1-10任务做完之后,把那些文件粘贴到新的文件,因为第二个账号做的时候,又会生成一样的文件。至于文件是否保留,还是你直接删除,这个你们自己决定。我是每一个账号做的文件我都是分好类的。没有删除。创建的文件一般都是在C:/Users/*** 路径下 你可以去找到那个文件夹)
3.输入npm init -y 开始新项目。
4.输入npx hardhat创建示例项目。(然后连续按三下 enter键)
6.按照提示输入下面代码,坐等安装完毕。出现警告不管。
npm install --save-dev "hardhat@^2.10.1" "@nomicfoundation/hardhat-toolbox@^1.0.1"
7.打开vscode,点击file,点击open folder。(在第5行。如果实在不习惯英文版本,VScode有中文版本的。你们下载中文版本的也一样。)
8.找到刚才创建的BuyMeACoffee-contracts文件夹,点击选择文件夹。(创建的文件一般都是在C:/Users(用户)/*** 路径下 你可以去找到那个文件夹)
9.打开后如图所示。
10.右键rename将合约文件lock.sol重命名为
BuyMeACoffee.sol
11.
BuyMeACoffee.sol
代码替换成下面的并保存!(不保存没用啊,要点保存。如果实在不知道怎么保存就看我图片红色标出来的地方,会有你现在正在运行的文件,边上有一个×,你关闭它,会弹出来让你保存的提示。你点保存就好了。)
//SPDX-License-Identifier: Unlicense
// contracts/BuyMeACoffee.sol
pragma solidity ^0.8.0;
// Switch this to your own contract address once deployed, for bookkeeping!
// Example Contract Address on Goerli: 0xDBa03676a2fBb6711CB652beF5B7416A53c1421D
contract BuyMeACoffee {
// Event to emit when a Memo is created.
event NewMemo(
address indexed from,
uint256 timestamp,
string name,
string message
);
// Memo struct.
struct Memo {
address from;
uint256 timestamp;
string name;
string message;
}
// Address of contract deployer. Marked payable so that
// we can withdraw to this address later.
address payable owner;
// List of all memos received from coffee purchases.
Memo[] memos;
constructor() {
// Store the address of the deployer as a payable address.
// When we withdraw funds, we'll withdraw here.
owner = payable(msg.sender);
}
/**
* @dev fetches all stored memos
*/
function getMemos() public view returns (Memo[] memory) {
return memos;
}
/**
* @dev buy a coffee for owner (sends an ETH tip and leaves a memo)
* @param _name name of the coffee purchaser
* @param _message a nice message from the purchaser
*/
function buyCoffee(string memory _name, string memory _message) public payable {
// Must accept more than 0 ETH for a coffee.
require(msg.value > 0, "can't buy coffee for free!");
// Add the memo to storage!
memos.push(Memo(
msg.sender,
block.timestamp,
_name,
_message
));
// Emit a NewMemo event with details about the memo.
emit NewMemo(
msg.sender,
block.timestamp,
_name,
_message
);
}
/**
* @dev send the entire balance stored in this contract to the owner
*/
function withdrawTips() public {
require(owner.send(address(this).balance));
}
}
3 创建一个 buy-coffee.js 脚本来测试你的合约
1.将deploy.js重命名为
buy-coffee.js
并将代码替换成下面的:(不保存没用啊,要点保存。如果实在不知道怎么保存就看我图片红色标出来的地方,会有你现在正在运行的文件,边上有一个×,你关闭它,会弹出来让你保存的提示。你点保存就好了。)
const hre = require("hardhat");
// Returns the Ether balance of a given address.
async function getBalance(address) {
const balanceBigInt = await hre.ethers.provider.getBalance(address);
return hre.ethers.utils.formatEther(balanceBigInt);
}
// Logs the Ether balances for a list of addresses.
async function printBalances(addresses) {
let idx = 0;
for (const address of addresses) {
console.log(`Address ${idx} balance: `, await getBalance(address));
idx ++;
}
}
// Logs the memos stored on-chain from coffee purchases.
async function printMemos(memos) {
for (const memo of memos) {
const timestamp = memo.timestamp;
const tipper = memo.name;
const tipperAddress = memo.from;
const message = memo.message;
console.log(`At ${timestamp}, ${tipper} (${tipperAddress}) said: "${message}"`);
}
}
async function main() {
// Get the example accounts we'll be working with.
const [owner, tipper, tipper2, tipper3] = await hre.ethers.getSigners();
// We get the contract to deploy.
const BuyMeACoffee = await hre.ethers.getContractFactory("BuyMeACoffee");
const buyMeACoffee = await BuyMeACoffee.deploy();
// Deploy the contract.
await buyMeACoffee.deployed();
console.log("BuyMeACoffee deployed to:", buyMeACoffee.address);
// Check balances before the coffee purchase.
const addresses = [owner.address, tipper.address, buyMeACoffee.address];
console.log("== start ==");
await printBalances(addresses);
// Buy the owner a few coffees.
const tip = {value: hre.ethers.utils.parseEther("1")};
await buyMeACoffee.connect(tipper).buyCoffee("Carolina", "You're the best!", tip);
await buyMeACoffee.connect(tipper2).buyCoffee("Vitto", "Amazing teacher", tip);
await buyMeACoffee.connect(tipper3).buyCoffee("Kay", "I love my Proof of Knowledge", tip);
// Check balances after the coffee purchase.
console.log("== bought coffee ==");
await printBalances(addresses);
// Withdraw.
await buyMeACoffee.connect(owner).withdrawTips();
// Check balances after withdrawal.
console.log("== withdrawTips ==");
await printBalances(addresses);
// Check out the memos.
console.log("== memos ==");
const memos = await buyMeACoffee.getMemos();
printMemos(memos);
}
// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
2.在控制台输入npx hardhat run scripts/buy-coffee.js,出现下图就对了。
4.使用Alchemy 和 MetaMask 将你的 BuyMeACoffe.sol 智能合约部署到以太坊 Goerli 测试网
1.右键点击scipts,点击new file,创建一个名为deploy.js的文件。
2.在deploy.js中粘贴以下代码。(把代码粘贴好后,点那个×,会弹出窗口让你保存。)
// scripts/deploy.js
const hre = require("hardhat");
async function main() {
// We get the contract to deploy.
const BuyMeACoffee = await hre.ethers.getContractFactory("BuyMeACoffee");
const buyMeACoffee = await BuyMeACoffee.deploy();
await buyMeACoffee.deployed();
console.log("BuyMeACoffee deployed to:", buyMeACoffee.address);
}
// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
3.在控制台输入npx hardhat run scripts/deploy.js ,并按回车,出现下面那句BuyMeACoffee deployed to: 0x5FbDB2315678afecb367f032d93F642f64180aa3就对了。
4.打开你的
hardhat.config.js
文件,删除它里面的所有代码并将下面的代码粘贴到其中。记得保存。
// hardhat.config.js
require("@nomiclabs/hardhat-ethers");
require("@nomiclabs/hardhat-waffle");
require("dotenv").config()
// You need to export an object to set up your config
// Go to
https://hardhat.org/config/ to learn more
const GOERLI_URL = process.env.GOERLI_URL;
const PRIVATE_KEY = process.env.PRIVATE_KEY;
/**
* @type import('hardhat/config').HardhatUserConfig
*/
module.exports = {
solidity: "0.8.4",
networks: {
goerli: {
url: GOERLI_URL,
accounts: [PRIVATE_KEY]
}
}
};
5.在控制台输入npm install dotenv,安装dotenv。如图所示
6.在控制台输入echo test>.env 创建一个.env文件
然后在这里可以看到。
7.将以下代码粘贴进.env
GOERLI_URL=
https://eth-goerli.alchemyapi.io/v2/<your api key>
GOERLI_API_KEY=<your api key>
PRIVATE_KEY=<your metamask api key>
注意:第7步的这三行代码不是最终的,三行全部要换成自己对应的链接,继续往下看。8.替换GOERLI_URL。
登录进你的Alchemy帐户(谷歌邮箱登录)。进入dashboard,点击create app。(有些用户系统会自动给你创建好一个Goerli账户。没有就创建一个。)
点击view key
复制HTTPS的框内内容,切换到vscode,粘贴到如下位置。(=后面全部删了,粘贴刚刚的https里面的链接进去。)
9.替换GOERLI_API_KEY。
将API KEY框内内容复制,然后切换到vscode粘贴到如下位置。(跟上面一样的)
10.替换PRIVATE_KEY。(这一步要用到你小狐狸钱包的私钥。你直接把私钥复制进去。有些私钥是0x开头的,有些不是。如果是0x开头的,那么0x不要复制进去。)
11.访问领水网站并使用你的 Alchemy 帐户登录以获得一些免费的测试eth。(网站自己手敲)
顺便来把Goerli测试网络加到你的小狐狸钱包(不管你的小狐狸钱包现在有没有Goerli测试网,你添加一个新的。网络名称可以随便取,但是你自己要以后看得懂。如果你需要撸多个钱包,那么建议你把钱包最后三位来命名。比如321-Goerli网络 这样以后你看到这个你就明白是尾号312钱包对应的测试网络,就不会乱。 RPC URL就是你之前复制的 HTTPS URL)
12.运行部署脚本npx hardhat run scripts/deploy.js --network goerli ,会发现出现红色的报错。
13.直接输入npm install --save-dev @nomiclabs/hardhat-waffle 安装第11步的缺的包。安装时有一堆warn不需要管。
14.再运行npx hardhat run scripts/deploy.js --network goerli ,出现下面那行BuyMeACoffee deployed to: 某个地址(
这个地址就是你部署的合约地址,记得复制粘贴下来)就对了。(如果你的钱包没有测试币,部署合约一定会失败。或者如果上面的步骤你没有做好,也一定会失败。如果部署合约失败,你就把电脑中的文件夹删了。重头再来。这样最保险。)
5.实施一个withdraw脚本
1.右键点击script创建withdraw.js文件,将下列代码粘贴进去。
// scripts/withdraw.js
const hre = require("hardhat");
const abi = require("../artifacts/contracts/BuyMeACoffee.sol/BuyMeACoffee.json");
async function getBalance(provider, address) {
const balanceBigInt = await provider.getBalance(address);
return hre.ethers.utils.formatEther(balanceBigInt);
}
async function main() {
// Get the contract that has been deployed to Goerli.
const contractAddress="0xDBa03676a2fBb6711CB652beF5B7416A53c1421D";
const contractABI = abi.abi;
// Get the node connection and wallet connection.
const provider = new hre.ethers.providers.AlchemyProvider("goerli", process.env.GOERLI_API_KEY);
// Ensure that signer is the SAME address as the original contract deployer,
// or else this script will fail with an error.
const signer = new hre.ethers.Wallet(process.env.PRIVATE_KEY, provider);
// Instantiate connected contract.
const buyMeACoffee = new hre.ethers.Contract(contractAddress, contractABI, signer);
// Check starting balances.
console.log("current balance of owner: ", await getBalance(provider, signer.address), "ETH");
const contractBalance = await getBalance(provider, buyMeACoffee.address);
console.log("current balance of contract: ", await getBalance(provider, buyMeACoffee.address), "ETH");
// Withdraw funds if there are funds to withdraw.
if (contractBalance !== "0.0") {
console.log("withdrawing funds..")
const withdrawTxn = await buyMeACoffee.withdrawTips();
await withdrawTxn.wait();
} else {
console.log("no funds to withdraw!");
}
// Check ending balance.
console.log("current balance of owner: ", await getBalance(provider, signer.address), "ETH");
}
// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
如图所示,记得保存。
2.在控制台输入npx hardhat run scripts/withdraw.js ,运行后如下图就行(这一步是看你小狐狸钱包还有多少测试币已经等下你要买咖啡需要多少以太测试币的)
6.使用 Replit 和 Ethers.js 构建前端 Buy Me A Coffee 网站 dapp1.在此处访问官方示例项目,并创建您自己的副本以进行修改,点击fork repl复制代码到你的replit.
BuyMeACoffee - Solidity DeFi Tipping app - Node.js Repl
2.进入该界面,没用过replit的要注册一下。注册用你的谷歌邮箱。
3.下面那一串合约地址换成你在第14步得到的BuyMeACoffee deployed to:冒号后面的地址。(也就是你部署的合约地址。这里就是把官方的示例代码里面的合约地址替换成你自己的,让dapp跟你的合约进行绑定。这样理解就好了。)
4.在 pages/index.js 中按ctrl+f将名称字符串Albert (有三处)全部改成为你自己的名称。(名称你随便取。)
5.点击run 按钮,出现如图所示即可。
6.右上角点击publish。(如果右上角没有publish,那么在左上角里面有。)
7.一直点下一步(要你写文字的地方,你随便写什么都可以),最后publish即可。
8.进入自己创建的网站链接小狐狸钱包试着几笔打赏就可以了。里面要写一些文字,你随便写什么都可以的。(那个网站你记得保存下来。点击 go to templates跳转就是你的网站。)
然后第二周任务,就完成了。(这个任务你最好把你部署的合约地址和你的dapp的网站地址都复制出来,方便你填任务表格时候用。)
【注意】你要保存的资料:你的谷歌账号 你的钱包地址 你的任务合约地址/Github代码地址/你任务的网址中的一个(有些任务只有合约地址 有些任务都有,都有的你就选一个填) 这些都会在领取NFT的时候用上。建议多做几个任务后,然后一起提交表格。表格链接要去官方的discord里面问。