- 浏览: 762726 次
- 性别:
- 来自: 深圳
文章列表
2.compound
2.1 存钱:不会1:1给ctoken,是1:50左右的比例,最开始是1/0.02,把用户转账过来的token存到资金池里,根据当前时刻的汇率给用户发放cToken
2.2 抵押系数:对于抵押品cToken来说每个市场都有一个抵押系数(Collateral Factor,或者叫抵押 ...
aave:去中心化借贷系统,aave借款人必须先提供抵押品才能借款。此外,他们只能借到他们发布的抵押品的价值。
1.用户抵押获取1:1的aToken,作为凭证.并且aToken无法交易
2.当用户从协议中贷出资产,获得 1:1 数量的 debt tokens.其中包括稳定利率债务币和浮动利率债务币
(usersStableRate * currentBalance + amount * rate) / (currentBalance + amount)
2.1 固定利率借贷:用户以固定利率借贷资产,将以当前固定利率来计息,不随市场波动,但不同时间贷款的固定利率可能是不同的,任何人每借一次钱, ...
multicall的solidity调用与ethers.js调用
// contracts/Box.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/Multicall.sol";
import "hardhat/console.sol";
contract TestMulticall {
function testMulticall(address addr) external ...
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
contract MyTokenCheck {
using ERC165Checker for address;
bytes4 private ...
2.栈和内存操作码
2.1 POP:取出栈顶元素
2.2 PUSH:向栈顶加入数据(可以直接在后边跟一个数字来指定要加入的字节数,取值范围为1到32,即最大为一个"字")
2.3 MLOAD:从内存中取出一个"字"
2.4 MSTORE:存储一个"字"到内存中
2.5 JUMP:修改程序计数器(PC)的位置
2.6 PC:程序计数器(program counter)
2.7 MSIZE:目前已激活(已使用)的内存大小(以"字"为单位)
2.8 GAS:可用的gas数量(当前交易内)
2.9 DUP:复制栈里的元素到栈 ...
EVM会根据发送者地址和nonce经过RLP编码后再进行keccak256得到hash的低160位(即96到255)共计20字节作为生成合约的地址
const rlp = require("rlp");
const keccak = require("keccak");
function calculateContractAddr(sender,nonce){
// var nonce = 0x00; //The nonce must be a hex literal!
// var sender = "0xf39F ...
1.internal:类似c++中的protected,通过JUMP指令实现,参数以内存指针传递,消耗gas最少
2.external:函数参数直接从calldata读取,内存分配比较便宜
3.public:会自动创建getter,通过jump指令调用,会复制函数参数到memory(因为不知道调用者是external还是internal),也这是比external更消耗gas的一个原因
4.private:私有,仅当前合约能访问
5.constant:被修饰的函数没有能力改变区块链上的状态变量,它们可以读取状态变量返回给调用者
6.view:不能修改,类似constant
7.pure:不能读写 ...
1. abi.encode()returns(bytes):对给定参数进行编码
2. abi.encodePacked()returns(bytes):对给定参数进行紧打包编码
3. abi.encodeWithSelector(bytes4 selector,...) returns(bytes):对给定参数进行编码,并以给定的函数选择器作为起始的4字段数据一起返回
4. abi.encodeWithSignature(string signature,...) returns (bytes):等价于abi.encodeWithSelector(bytes4(keccak256(signatu ...
1.函数参数包括返回的参数默认是memory
2.局部变量默认是storage,状态变量强制是storage
3.外部函数的参数强制是calldata与memory类似,是一块只读且不会永久存储的位置
https://www.paradigm.xyz/2023/01/eth-rng#introduction
extcodesize
- 博客分类:
- solidity
extcodesize取出的byte code长度,若长度大于0就表示是合约发出的,等于0还不一定是EOA地址,因为在合约的构造函数发出,其byte code尚未初始化,仍为0
// SPDX-License-Identifier: MIT
pragma solidity >= 0.6.0;
import "hardhat/console.sol";
contract GatekeeperTwoAttack {
constructor(address addr,address addr2){
//构造函数
at ...
Elevator.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.6.0;
import "hardhat/console.sol";
interface Building {
function isLastFloor(uint256) external returns (bool);
}
contract Elevator {
bool public top;
uint256 public floor;
function test(uin ...
AccessControl
- 博客分类:
- openzeppelin
// SPDX-License-Identifier: MIT
pragma solidity >= 0.6.0;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "hardhat/console.sol&qu ...
1.和require类似,在一些复杂代码时可以结合error使用
// SPDX-License-Identifier: MIT
pragma solidity >= 0.6.0;
import "hardhat/console.sol";
contract Revert {
error TooEarly(uint time);
error TooLate(uint time);
function test(uint t)external{
if(t<100){
rever ...
// SPDX-License-Identifier: MIT
pragma solidity >= 0.6.0;
import "hardhat/console.sol";
contract Vault {
bool public locked;
bytes32 private password;
uint256 private data;
constructor(bytes32 _password) public {
locked = true;
password = _password;
...