blockchain
DEFI 把现有的金融产品搬到区块链上,比如储蓄、借贷、交易。
NFTs 非同质化代币,数字藏品,公共记录,游戏。
Gaming
Web 3.0
Metaverse 元宇宙
Smart Contracts 智能合约
IPFS 分布式技术
solidity语言
ganache客户端
快速启动个人以太坊区块链,您可以使用它来运行测试、执行命令和检查状态,同时控制链的运行方式。
rpc server
remix (Solidity IDE)
npm install remix-ide -g
工作区
contracts 合约
scripts 脚本
tests 测试
编译设置
编译
部署环境
提示以及语法
测试
文档
插件
uniswap
ChainIDE (Solidity 国产 IDE)
github授权
编译、部署、交互
MateMask 钱包
私钥:0xf4239xxxxxxxxxxxxxxxxxxxB429409
助记词:pudxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxn
密码:xxxxxxxxxxx
币安测试
链端安全
DAO (去中心化自治组织)
重入攻击(程序的健壮性、fallback()的利用)
alchemy
web3开发者平台。
水龙头
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语法高亮)
HelloWorld.sol
solcjs -V
solcjs .\HelloWorld.sol --bin
(将刚刚的源代码通过编译器编译成了字节码HelloWorld_sol_HelloWorld.bin)
1)、合约编写
2)、合约编译
3)、合约部署与交互
4)、测试网部署
智能合约(开发环境):
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
合约构成:
· 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函数
继承
· 继承通过关键字is来实现
· 函数覆写通过override关键字来实现
· 所有调用都是虚拟的,如果要调用父合约中的方法,可以使用super关键字
HardHat
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.执行脚本,验证合约是否部署成功
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: {
· 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去进行验证
· npx hardhat node 启动本地网络
· 网络名称: xxxx
· 链ID: 31337
· 货币符号: ETH
· 区块浏览器: 空
--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 jsonRPCProvider = new ethers.providers.JsonRpcProvider("http://localhost:8545");
· const privatekey = "xxxxxxxxxx";
· const wallet = new ethers.Wallet(privatekey,jsonRPCProvider);
· 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);
· }
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)