web3了解

blockchain
DEFI 把现有的金融产品搬到区块链上,比如储蓄、借贷、交易。
NFTs 非同质化代币,数字藏品,公共记录,游戏。
Gaming
Web 3.0
Metaverse 元宇宙
Smart Contracts 智能合约
IPFS 分布式技术
solidity语言

ganache客户端

https://trufflesuite.com/ganache/

快速启动个人以太坊区块链,您可以使用它来运行测试、执行命令和检查状态,同时控制链的运行方式。

rpc server

remix (Solidity IDE)

npm install remix-ide -g

https://github.com/ethereum/remix-ide.git

工作区

contracts 合约

scripts 脚本

tests 测试

编译设置

编译

部署环境

提示以及语法

测试

文档

插件

uniswap

ChainIDE (Solidity 国产 IDE)

https://chainide.com/

github授权

编译、部署、交互

MateMask 钱包

私钥:0xf4239xxxxxxxxxxxxxxxxxxxB429409

助记词:pudxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxn

密码:xxxxxxxxxxx

币安测试

https://testnet.bscscan.com/

https://testnet.binance.org/faucet-smart 币安测试水龙头

链端安全

DAO (去中心化自治组织)

重入攻击(程序的健壮性、fallback()的利用)

alchemy

https://dashboard.alchemyapi.io/

web3开发者平台。

水龙头

https://fauceth.komputing.org/ (Rinkeby 测试网络)

https://faucets.chain.link/rinkeby (Rinkeby 测试网络)

https://faucet.egorfine.com/ (Ropsten 测试网络)

https://antcave.club/

1、Solidity 入门上手 - 以太坊智能合约本地开发环境搭建 https://www.youtube.com/watch?v=wK3gpGkLXrY

remix-ide安装 (Solidity编译器)

npm install -g solc

npm install -g ethereumjs-testrpc 重命名为(ganache-cli),启动命令为testrpc , 8545端口,提供10个公钥10个私钥,HD钱包以及助记词

vscode安装插件 remix(Ethereum Remix)

vscode安装插件 solidity (vscode .sol语法高亮)

2、Solidity 入门上手 - HelloWorld 合约开发及编译 https://www.youtube.com/watch?v=Y4B3lfpTEDA

HelloWorld.sol

solcjs -V

solcjs .\HelloWorld.sol --bin

(将刚刚的源代码通过编译器编译成了字节码HelloWorld_sol_HelloWorld.bin)

3、Remix IDE 如何进行智能合约部署? https://www.youtube.com/watch?v=ZuUbiOvs7Gw

1)、合约编写

2)、合约编译

3)、合约部署与交互

4)、测试网部署

4、Solidity入门上手 - Solidity 智能合约开发环境全讲解(最佳实践) https://www.youtube.com/watch?v=opAzBhEPJP0&list=PLuS5nCGcQ8Max62jOV-Kba_K1sjSaKdUv&index=10

智能合约(开发环境):

1、本地Solidity环境(不推荐)

1)、安装Solidity编译器。
2)、安装web3.js/ethers.js。
3)、本地Ganache启动测试网络进行调试。
4)、编写Solidity并部署调用ABI交互。
5)、Etherscan上传源文件验证合约)、

2、线上IDE环境(轻量)

1)、Remix IDE环境 (无法长期存储,容量5M;插件比较多,可直接部署调试)
2)、Replit 线上环境 (支持线上Solidity开发部署、支持UI可视化交互)

3、框架采用

1)、Hardhat (js/ts)
2)、Brownie (py)
3)、Truffle

Solidity基本语法 https://www.youtube.com/watch?v=3sfknquTwXs

合约构成:

· license: 版权许可
// SPDX-License-Identifier: MIT
· pragma: 版本标识指令,指定使用的编译器版本
pragma solidity ^0.6.0;
contract Sample {
· 状态变量: owner、state,这些变量会被永久存储,也可以被函数修改
address private owner;
uint public state;
· 函数修改器: onlyOwner,可以用来给函数添加一些额外的功能
modifier onlyOwner(){
require(msg.sender==owner,"only owner");
_;
}
· 事件: StateChanged,前段可以通过监听这个事件得到结果
event StateChanged(uint state);
· 构造函数: 用于在部署时初始化合约
constructor() public {
owner = msg.sender;
}
· 函数: setState,用于修改状态变量
function setState(uint _state) external onlyOwner {
state = _state;
emit StateChanged(_state);
}
}

状态变量:

状态变量是永久的存储再合约中的值,记录了合约的业务信息
状态变量的声明方式为: [类型] [访问修饰符-可选] [字段名]
状态变量的访问修饰符可以有public、internal、private三种,默认是internal
声明为public的状态变量会自动生成getter函数

构造函数:

·构造函数用于初始化合约,允许用户传入数据,写入到状态变量中
constructor() public {
owner = msg.sender;
}
· 构造函数不支持重载
· 构造函数再合约创建的时候由evm自动调用
· 如果没有构造函数,合约会采用默认构造函数,状态变量被初始化为默认值

函数修改器(modifier):

· 函数修改器放在函数的声明上,可以修改函数的行为
· 函数修改器是可以被继承的
· 如果同一个函数有多个修改器,它们之间用空格隔开,依次检查执行
_表示调用函数

事件(event)

· 合约中的时间会被记录到区块链的LOG中
· 应用程序可以通过web3订阅和监听事件
· 事件可以被继承
· 最多有三个参数可以被标记为indexed,它们被存储为一个特殊的数据结构,可以被索引,非indexed的参数存储在LOG的数据部分
· 定义事件 event StateChanged(uint state);
· 激发事件 emit StateChanged(_state);

函数

· 函数是合约的可执行单元,可用来读写状态变量
· 函数可以定义在合约内,也可以定义在合约外,合约外的函数只能内部访问
· 函数可以接受输入参数和返回值,返回值可以有多个
· 函数的定义
function () {internal|external} [pure|view|payable] [returns ()]
function setState(uint _state) external onlyOwner
· 函数可见性有external public internal private四种
· external或者public函数可以通过.address取地址, .selector取到标志符

数据类型

整形
· uint/int,以8位位步长递增
· 对于整形x,可以使用type(x).min和type(x).max取这类型的最小值和最大值
定长字节数组
· 从bytes1到bytes32
· byte是bytes1的别名
· 可以通过下标访问元素
· 可以通过.length读取长度
address
· address: 保存一个20字节的地址
· address payable: 可支付的地址,有成员函数transfer和send
合约类型
· 每一个contract定义都有他自己的类型
· 合约可以隐式转换为它的父合约
· 合约可以显式转换为address
· 合约不支持任何运算符
· 可以使用new创建一个新合约
枚举
· 枚举是Solidity中创建用户定义类型的一种方法
映射(mapping)
· 声明形式为 mapping(_KeyType => _ValueType)
· mapping无法遍历
数据存储位置
· 三种位置,内存(memory)、存储(storage)、调用数据(calldata)
· calldata是不可修改的、非持久的函数参数存储区域,效果大多类似memory
· calldata是external函数的参数所必须指定的位置,也可用于其他变量
· 在存储和内存之间两两赋值,会创建一份独立的拷贝
· 在内存之间赋值只创建引用
· 从存储到本地存储之间的赋值也只创建引用
· 其他向存储的赋值都会进行拷贝
数组
· 数组可以在声明时指定长度,也可以动态调整大小(长度)
变长字节数组(bytes)与字符串(string)
· bytes类似于byte[],但他在calldata和memory中会被紧打包(将元素连续地村在一起,不会按每32字节一单元的方式来存放)
结构体(struct)
· Solidity允许开发者自定义结构对象。结构体既可以作为状态变量存储,也可以再函数中作为局部变量存在。
单位
· 以太单位
· 单位之间的换算就是在数字后边加上wei、gwei或ether来实现
· 如果后面没有跟单位,默认为wei
错误处理和异常
· Assert、Require、Revert
两个特殊的函数
· receive函数
· receive() EXTERNAL PAYABLE
· fallback函数
· fallback() external [PAYABLE] 或 fallback(bytes calldata_input) external [payable] returns (bytes memory_output)
继承
· 继承通过关键字is来实现
· 函数覆写通过override关键字来实现
· 所有调用都是虚拟的,如果要调用父合约中的方法,可以使用super关键字

HardHat

十五分钟搭建智能合约开发环境(hardhat+vsc+ethers.js) https://www.youtube.com/watch?v=9DGlfrflH_Q

npm init

npm install --s-d hardhat // 安装hardhat依赖包

npx hardhat init // 初始化hardhat项目

create an empty hardhat.config.js // 创建一个空的hardhat配置文件

新建一个contracts文件夹 -> TestContract.sol

pragma solidity ^0.8.8;

contract TestContract {

uint256 value;

function setValue(uint256 _value) public {

value = _value

}

}

用ether部署该合约 npm install -s-d @nomiclabs/hardhat-ethers 'ethers@^5.0.0'

在hardhat.config.js 引入 require("@nomiclabs/hardhat-ethers")

创建一个scripts文件夹 -> deploy.js

const { hre } = require("hardhat);

const { ethers } = hre;

async function main (){

const TestContract = await ethers.getContractFactory('TestContract');

const testContract = await TestContract.deploy();

console.log(testContract.address)

}

main()

执行npx hardhat node

执行npm hardhat run scripts/deploy.js --network localhost

1.npm 工程初始化

2.装了hardhat的包

3.初始化hardhat配置

4.写了简单的合约

5.部署脚本,hardhat-ethers.js库

6.执行脚本,验证合约是否部署成功

十分钟学会向ropsten测试网络部署智能合约(hardhat+ethers.js) https://www.youtube.com/watch?v=Ca2BOPB7SKM

1、npm install dotenv -s

· 新建.env文件,导出

· PUBLIC_KEY_0="xxxxxxxxxxxxxxxxxx"

· PRIVATE_KEY_0="xxxxxxxxxxxxxxxxx"

-- hardhat.config.js

· require("dotenv).config();

· 用一下hardhat的task功能

· task("accounts","print account").setAction(async ()=>{

· console.log(process.env.PRIVATE_KEY_0)

· console.log(process.env.PUBLIC_KEY_0)

· })

· 终端npx hardhat accounts,打印出公钥私钥地址

2、配置Alchemy服务

· module.exports = {

· solidity: "0.8.8",

· networks: {

· ropsten: {

· url: "https://eth-repsten.alchemyapi.io/v2/${ALCHEMY_API_KEY}(dashboard.alchemyapi.io申请一个key,提供一个跟主网连接的节点)",

· accounts: [${process.env.PRIVATE_KEY_0}自己的账户私钥]

· }

· }

· }

· npx hardhat run scripts/deploy.js --network ropsten

· 验证是否部署到ropsten网络(ropsten.etherscan.io)

·

· 1、Ropsten

· 2、环境变量存放自己的账户(公钥+私钥)

· 3、Alchemy 节点

· 4、执行部署脚本

· 5、通过ropsten.etherscan.io去进行验证

Metamask 添加本地测试网络 https://www.youtube.com/watch?v=KhxXnHADWyw

· npx hardhat node 启动本地网络

· Metamsk添加本地测试网络:

· 网络名称: xxxx

· 新增RPC URL: http://localhost:8545

· 链ID: 31337

· 货币符号: ETH

· 区块浏览器: 空

与部署在链上的智能合约进行交互 https://www.youtube.com/watch?v=G3IwcLm17TU

--TestContract.sol

· pragma solidity ^0.8.8;

· contract TestContract {

· uint256 public value;

· function setValue(uint256 _value) public {

· value = _value;

· }

· }

· npx hardhat compile

·

--test_contract.js

· const { ethers } = require("hardhat");

· async function main() {

· const TestContract = await ethers.getContractFactory("TestContract");

· const testContract = await TestContract.attach("xxxxx合约地址xx");

· console.log(testContract.address);

· let value = await testContract.value();

· console.log(value);

· await testContract.setValue(5);

· value = await testContract.value();

· console.log(value);

· }

· main()

· // 部署合约,读取合约里的值,把新的值写入合约,再读取值进行校验

· npm hardhat node

· npx hardhat run scripts/test_contract.js --network localhost

·

· // 原生部署

· const { ContractFactory } = require("ethers");

· const fs = require("fs");

· async function main(){

· const metadata = JSON.parse( fs.readFileSync("./artifacts/contracts/TestContract.sol/TestContract.json") );

· const jsonRPCProvider = new ethers.providers.JsonRpcProvider("http://localhost:8545");

· const privatekey = "xxxxxxxxxx";

· const wallet = new ethers.Wallet(privatekey,jsonRPCProvider);

· const factory = new ContractFactory(metadata.abi, metadata.bytecode, wallet);

· const options =

· const testContract = await factory.deploy(options);

· console.log(testContract.address)

· let value = await testContract.value();

· console.log(value);

· await testContract.setValue(5);

· value = await testContract.value();

· console.log(value);

· }

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

posted @   Comedyy  阅读(520)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示