- 浏览: 762707 次
- 性别:
- 来自: 深圳
文章列表
tact:
一.函数:
1.extends:扩展函数,第一个参数名必须为self,调用时可省略,函数内只能使用,不能修改
2.mutates:可变扩展函数,第一个参数名必须为self,调用时可省略,函数内只能使用,可以修改
extends mutates fun(self:Int,c:Int){
let res:Int = 1;
repeat(c){
res = res * self;
}
self = res;
}
95.fun(2)
3.原生函数:native,直接绑定到func的函数,也可以可变和扩展
@name(store_uint)
native storeUint ...
package.json 添加:"@nomicfoundation/hardhat-ethers": "^3.0.5"
"ethers": "^6.12.0",
"devDependencies": {
"@nomicfoundation/hardhat-ethers": "^3.0.5",
"@nomicfoundation/hardhat-toolbox": "^5.0.0",
&qu ...
一.solidity
1.EVM 不是基于寄存器的,而是基于栈的,因此所有的计算都在一个被称为栈(stack)的区域执行,最大有1024个元素,每个元素长度是一个字(256位)
1.1.收到一个区块时,会遍历里面的所有交易,然后将交易进行applyMessage
1.2.取出当前的状态数据库,判断交易是转账还是合约交易
1.3.进到evm后,会先设置一个快照,方便revert后,undo回到快照.
1.4.对合约进行预编译判定,如果有预编译,则由可以执行合约
1.5.如果没有预编译,则由解释器对合约进行解释执行,通过本地的jump_table,取出对应的每一个"脚本"的执行函 ...
tornado:当用户将资金放入资金池(也称为存款)时,会生成一张私人票据。该私人笔记用作用户以后访问这些资金的私钥。要提取它们,同一用户可以使用不同的地址——旧地址或新地址——并通过这个私钥收回他/她的资金
存钱
5.1 链下计算好一个secret给用户,拥有这个数据相当于有提款的权利
5.1 链下计算要提交的数据(commitment)
const preimage = secret + nullifier;
const commitment = pedersenHash(preimage);
5.2 存钱的时候将byte32的commitment数据上传,并将其作为叶子节点插入到一个M ...
opensea:其中链下的订单簿负责存储用户的挂单信息,并对订单进行撮合。最终的成交和转移 NFT 是由 Seaport Protocol 来负责的。
Seaport 采取了一种不同的方法:offerer 可以同意提供一定数量的 ETH/ERC20/ERC721/ERC1155 项目--这就是 offer。为了使该offer被接受,offerer必须收到一定数量的物品,这就是 consideration。
当 offer 是 ERC721/ERC1155 的时候,offerer 就是卖家,卖出 ERC721/ERC1155 来换取 ETH/ERC20。
当 offer 是 ETH/ERC20 ...
Address
- 博客分类:
- solidity
- openzeppelin
// contracts/Box.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/Address.sol";
import "hardhat/console.sol";
contract MyTestContract {
function foo(uint i) view external {
console.log("foo",i);
...
9.gmx:去中心化AMM合约交易所,在Arbitrum和Avalanche网络发行版本,最高允许30倍杠杆.同时也支持swap,只不过用的是预言机的价格,所以没有无偿损失
9.1 用户类型:
散户和lp提供者,相当于散户和lp对赌的期货合约交易所,因为做合约输的机 ...
8.Lido
8.1 Lido收集到用户的 ETH 后,会每次在以太坊智能合约上质押32个ETH,DAO就会从治理控制的注册表中选择一个新的验证者。然后调用存款合约,将32个ETH 分配给该验证人,并生成 Lido DAO 的提款凭证。
8.2 在Lido 中,stETH 持有只能获得以太坊2.0质押奖励的 90%,5%分配给 Lido 的节点运营商,5%给Lido金库
8.3 Lido的stTokens有两个版本,分别是stETH和wstETH。这两种代币都是 ERC-20 代币,但它们以不同的方式反映了应计的质押奖励。
stETH 实施变基机制,这意味着 stETH 余额会定期增加。
wst ...
7.dydx采用链下撮合链上结算的订单稀释模式,架设在以太坊二层网络Starkware上,采用了StarkEx交易引擎,实现了资产的去中心化自托管
7.1 订单簿模式,下单和挂单是中心化的
7.2 在安全和私密性上,Starkware的二层技术通过零识证明提高了安全性和隐私性,引擎不开源,去中心化程度不高
7.3 需要创建账户和充值usdc,eth...,项目方和coinbase有一定关链,使用的是usdc,杠杆最高20倍
7.4 项目方通过交易手续费获得收入,手续费比例最高为0.1%,可通过质押平台代币获得折扣,项目也通过交易挖矿等手段来激励交易量。交易挖矿会持续存在,每月为一个纪元,会有固定 ...
Beacon
- 博客分类:
- solidity
- openzeppelin
Beacon
a.Implementation地址并不存放在Proxy合约里,而是存放在Beacon合约里,Proxy合约里存放的是Beacon合约的地址
b.在合约交互的时候,用户同样是和Proxy合约打交道,不过此时因为Proxy合约中并未保存Implementation地址,所以它要先访问Beacon合约获取Implementation地址,然后再通过delegatecall调用Implementation。
c.在合约升级的时候,管理员并不需要和Proxy合约打交道,而只需要交互Beacon合约,把Beacon合约存储的Implementation改掉就行了。
d.就是多个Proxy共享 ...
a.Proxy直接把所有的请求都通过delegatecall丢给Implementation(如果是升级,Implementation的升级函数会确认一下是否为管理员)
b.需要实现_authorizeUpgrade函数以确保只有管理员账户可以进行升级
c.升级函数upgradeTo在Implementation合约中
// SPDX-License-Identifier: MIT
pragma solidity >= 0.8.0;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializab ...
Transparent
- 博客分类:
- solidity
Transparent:
a.如果Proxy合约发现自己被ProxyAdmin合约调用,那么它会调用自身的函数代码;如果调用者是ProxyAdmin之外的账户,那么它会通过delegatecall去调用Implementation的代码。这样就保障了合约升级的安全性。
b.升级函数在proxy里面,proxy里面的函数基本都有ifAdmin修饰符校验
TransparentAdmin.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.8.0;
import "@openzeppelin/contracts/ ...
string转bytes
- 博客分类:
- solidity
const data = Buffer.from('');//string转bytes
let a = ethers.utils.formatBytes32String("6"); //string转bytes32
1.前置准备,运行一个新项目
mkdir my-project
cd my-project
npm init --yes
npm install --save-dev hardhat@2.8.2 -g
npm install --save-dev @nomiclabs/hardhat-truffle5 @nomiclabs/hardhat-web3 web3
2.console.log
适用于view,但不适用于pure,最多调用uint,string,bool,address4个参数
3.编译
npx hardhat compile
强制编译
npx hardhat compile --f ...