欢迎来到我的博客

记录有价值的内容

解读Radiant: 去中心化借贷平台

0 背景知识 2023年,Radiant异军突起,成为Arbitrum上面TVL规模最大的借贷平台,并且超过了老牌借贷平台Aave。 如果仔细它的项目代码,其实可以发现它的核心代码是复制了Aave v2的核心代码。 同时,在Aave v2的核心代码的基础上,Radiant开发团队也做了一些创新,下面我们来解读一下这个项目。 1 Radiant的产品设计目标 支持无缝跨链的去中心化借贷平台。 2 Radiant的核心竞争力 去中心化。Radiant的所有功能都是智能合约实现并且开源,任何人都可以无需KYC的情况下使用这款产品。 数据公开透明。Radiant的所有数据都是链上公开,任何人都可以方便地从链上获取radiant的营收数据。 无缝跨链。用户可以通过Radiant方便地进行资产跨链,并实现跨链抵押和借贷。 高资金利用率。通过Radiant的loop功能,可以实现杠杆(最高4倍),提高资金的年回报率。 3 Radiant的系统整体设计 系统架构图 系统各模块主要功能 LendingPool: 平台核心逻辑,负责核心总账目的计算。 ETHGateWay: 把ETH转为WETH,和把WETH转为ETH。 MultiFeeDistribution: 分配平台奖励和借贷手续费。 MiddleFeeDistribution: 保存平台的借贷手续费,并把费用分配给用户。 Leverager: 用户存款杠杆。 LockZap: 锁定Zap资产的核心逻辑。 ChefIncentivesController: RNDT奖励的分配计算逻辑。 StargateBorrow: 跨链借贷逻辑。 4 Radiant核心业务逻辑解读 了解了Radiant系统设计框架,那么解析来就逐个解析它的核心业务流程。 4.1 用户存取款业务逻辑 4.1.1 用户存取款业务流程 用户存款流程 用户调用LendingPool合约,发起Token存入。 如果是ETH,就先调用ETHGateway合约把ETH转成WETH。 ETHGateway合约再调用LendingPool合约执行后续流程。 LendingPool合约更新状态、存款利率和借款利率。 LendingPool合约把Token转入rToken合约。 rToken合约mint同等数量的rToken给到用户。 用户按1:1得到rToken。 用户取款流程 用户调用LendingPool合约,发起Token取款。 LendingPool合约更新状态、存款利率和借款利率。 LendingPool合约调用rToken合约burn rToken。 rToken合约按照1:1把同等数量Token给到用户。 用户得到Token。 如果是ETH,就通过ETHGateway合约把ETH转成WETH。 ETHGateway合约再把WETH转给用户。 4....

2023-04-18 · 3 min · 539 words · Xuqi.Zhong

深度解读GMX:去中心化永续合约交易所

0 GMX项目发展史 在2020年10月,xvi10启动了 xvix-contracts 项目,并部署到了Ethereum Mainnet。 在2021年3月,xvi10把 xvix-contracts 升级为 gambit-contracts ,并部署到了BSC。 在2021年9月,xvi10基于 gambit-contracts 启动GMX项目,并部署到了Arbitrum One。 在启动一周后,GMX完成了第一次升级,在eth、wbtc和usdc的基础上,添加了link、uni和usdt。 在启动三个月后,GMX,完成了第二次升级,部署到了Avalanche链上。 1 GMX的产品设计目标 GMX的产品设计目标是打造一个去中心化的永续合约和现货交易平台。不需要任何注册、KYC和地域限制等限制,用户即可方便地用它进行链上资产交易和合约交易。 2 GMX的核心竞争力 去中心化。GMX是一个去中心化的永续合约交易平台,所有资产由智能合约保管,智能合约开源,所有运营数据也是公开透明的。 全额保证金。GMX上面的所有杠杆订单都是有全额保证金的,保障用户的收益能够钢性对付,很多中心化交易所都无法做到全额保证金。 无需许可Permissionless。所有人都可以公平得参与平台做市,并且根据GMX和GLP持有量平等地分到平台的盈利。 市场报价去中心化。系统报价主要由ChainLink和报价机器人组成,报价公开透明,有效避免了恶意插针等扰乱市场的行为。 3 GMX的系统整体设计 3.1 GMX系统架构图 其中,Vault合约是整个GMX的核心,负责管理GMX平台的全部资产。 3.2 系统核心数据模型 { "id": keccak256(_account, _collateralToken, _indexToken, _isLong), // 仓位ID "size": uint256, // Position大小 "collateral": uint256, // 抵押品价格 USD "averagePrice": uint256, // 平均持仓价格 USD "entryFundingRate": uint256, // 入场资金费率 "reserveAmount": uint256, // 抵押品token储备数量 "realisedPnl": int256, // 已兑付盈亏 "lastIncreasedTime": uint256, // 最后加仓时间 } 盈亏USD价值计算:...

2023-02-27 · 3 min · 553 words · Xuqi.Zhong

解读闪电网络Lightning Network原理

随着Damus最近的大火,其内置的比特币闪电网络Lightning Network打赏功能也走进了大众的视野。闪电网络的比特币容量也随之猛增到5400枚,创下历史新高。那么下面我们就重点来介绍一下闪电网络的作用和工作原理。 什么是闪电网络 闪电网络是建立在Bitcoin链上的2层网络,即Bitcoin的L2。它的主要作用是解决比特币扩展性和交易手续费高的问题。 可以说闪电网络的TPS远超市面上所有区块链技术,如下表所示 Lightning Network Solana Visa Paypal Ethereum Bitcoin TPS 40,000,000 65,000 24,000 193 15 7 闪电网络的TPS是目前区块链所有扩容方案中最高的,满足了目前所有的支付场景需求。 闪电网络的工作原理 闪电网络的基本流程就是在用户之间点对点地建立一些支付通道,建立好通道的用户可以方便地进行链下建议。然后随着越来越多的用户之间建立了支付通道,就形成了一张支付通道网络,就此闪电网络就形成了,只要在网络中的用户之间都可以进行相互链下交易。 建立支付通道 支付通道是点对点的,即两个用户之间。打个比方,用户A和用户B要建立一个10btc的支付通道,他们分别都支付了5btc(实际A和B的通道建立金额可以任意),具体如下图所示 上图的流程步骤为: A和B分别用自己的UTXO-A和UTXO-B作为输入,共同签名上链并输出了UTXO-AB A生成链下交易TX-A1,并让B对TX-A1签名。 B生成链下交易TX-B1,并让A对TX-B1签名。 其中UTXO-AB就是A和B之间建立的支付通道,TX-A1和TX-B1不需要广播到链上,如果TX-A1和TX-B1被广播到链上就代表支付通道被关闭了。 TX-A1由A持有,TX-B1由B持有,他们都可以随时关闭通道取出自己的钱。 如果A广播了TX-A1,那么就会生成UTXO-A1-A和UTXO-A1-B。 UTXO-A1-A的使用需要满足以下条件之一即可: 需要等x个区块才能被A密钥使用 可以用B密钥和A1密钥共同签名使用,A1密钥由A保管 UTXO-A1-B的使用需要满足以下条件之一即可: 用B密钥签名即可使用 同理如果B广播了TX-B1,那么就会生成UTXO-B1-A和UTXO-B1-B。 UTXO-B1-A的使用需要满足以下条件之一即可: 用A密钥签名即可使用 UTXO-B1-B的使用需要满足以下条件之一即可: 需要等x个区块才能被B密钥使用 可以用A密钥和B1密钥共同签名使用,B1密钥由B保管 用户之间点对点转账 用户A要向用户B转1个BTC,具体流程图如下 具体流程为 用户A用A2密值构建交易TX-A2,并提交给用户B签名,用户B把TX-A2的签名传给用户A 用户A把A1密值传给B 用户B用B2密值构建交易TX-B2,并提交给用户A签名,用户A把TX-B2的签名传给用户B 用户B把B2密值传给A 完成以上4步后才算转账完成 如何防止用户作恶 假设用户A想作恶,转账给B 1个BTC后,故意把TX-A1广播出去,企图从支付通道中取回5BTC。 具体流程如下...

2023-02-07 · 1 min · 75 words · Xuqi.Zhong

解读Damus和去中心化社交协议Nostr

近期damus社交软件大火,作为web3赛道率先上线app store的应用,很快引起了圈内圈外人士的关注。那么不少会有一个疑问,同样作为社交软件,web3赛道的damus相比于web2赛道的twitter和微博有什么优势,用户为什么要迁移到web3社交产品呢? 首先,看下damus官方给出的web2社交的一些关键问题: web2社交有广告,比如twitter上经常会看到一些广告,非常影响用户体验。 web2社交会使用一些推荐技术让用户上瘾,比如twitter、tiktok都有自己的推荐算法,推荐算法会根据用户喜好不断推荐一些类似的内容,吸引用户留存。 web2产品能封禁用户,比如特朗普的twitter账户就曾被twitter封禁。 web2产品能对用户限流,导致用户的推文无法被其它用户看到。 web2产品有很多垃圾信息。 上述问题导致web2产品无法实现真正的言论自由,根本原因在于web2产品是有专门中心化的公司和机构运营和维护,而且永远无法被替换。这些公司和机构为了盈利的目的,会破坏社交软件的言论自由。 为了实现真正的言论自由,web3就是一个很好的技术发展方向。web3的任何产品都不会由中心化的机构和公司来维护和运营,全靠社区和用户自主来维护,而且产品的代码也是开源的,任何人都可以下载阅读并参与开发。 那么Damus是如何做到的呢?那就不得不说一下它背后的去中心化社交协议Nostr了。打个比方,如果说Damus是一个大楼,那么nostr就是这个大楼的地基。 技术原理 Nostr是什么 Nostr是一个p2p的社交网络协议,基于密码学的公钥私钥和签名技术,并且不需要依赖任何的中心化服务器。 Nostr是如何工作的 Nostr网络由client和relay两个角色组成,用户运行client(比如手机上运行damus客户端),任何个人或者机构都可以运行relay。 发送推文流程 第一步,用户使用客服端需要先生成公钥私钥,私钥相当于用户身份,不能对外公开。 第二步,用户在客户端提交推文内容,client会用私钥对推文内容进行签名, 第三步,client会把推文、公钥和签名发送到配置好的relay,relay会用公钥校验签名正确性。 推文内容格式为 { "id": "<消息ID>", "pubkey": "<用户公钥>", "created_at": "<创建时间>", "kind": "<消息类型>", "tags": [ // <用于订阅规则过滤> ["e", "<其它推文ID>", "<推荐relay地址>"], ["p", "<公钥>", "<推荐relay地址>"] ... // other kinds of tags may be included later ], "content": "<推文内容>", "sig": "<私钥签名>" } 其中,id=sha256(JSON....

2023-02-04 · 2 min · 278 words · Xuqi.Zhong

用Hardhat开发智能合约,并发布ERC721 NFT

1. 安装Hardhat npm install --save-dev hardhat 2. 初始化Hardhat工程 npx hardhat 3. 安装官方contract库 npm install @openzeppelin/contracts 4. 完成ERC721 NFT智能合约代码 目录contracts/DrawNFT.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; contract DrawNFT is ERC721, ERC721URIStorage, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; constructor() ERC721("DrawNFT", "DNFT") {} function safeMint(address to, string memory uri) public onlyOwner { uint256 tokenId = _tokenIdCounter....

2022-08-18 · 3 min · 479 words · Xuqi.Zhong

用Hardhat开发智能合约,并发布ERC20 Token

1. 安装Hardhat npm install --save-dev hardhat 2. 初始化Hardhat工程 npx hardhat 3. 安装官方contract库 npm install @openzeppelin/contracts 4. 完成Token智能合约代码 目录contracts/DrawToken.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; contract DrawToken is ERC20, Ownable { constructor() ERC20("DrawToken", "DTK") {} function mint(address to, uint256 amount) public onlyOwner { _mint(to, amount); } } 5. 完成合约部署代码 目录scripts/deploy.ts import { ethers } from "hardhat"; async function main() { // DrawToken const DrawToken = await ethers....

2022-08-18 · 3 min · 434 words · Xuqi.Zhong

Eth智能合约签名校验 - 可用于实现多签合约

1. 对message进行签名 from eth_account.messages import encode_defunct from web3 import Web3 from eth_keys import keys KEY = ... # 填写账户私钥 w3 = Web3(Web3.HTTPProvider(<input eth node url/>)) # 请填写以太坊的节点url account = w3.eth.account.from_key(KEY) print('address: ', account.address) rawText = 'hello' # 签名message signedMessage = account.sign_message(encode_defunct(text=rawText)) print('message hash: ', signedMessage.messageHash.hex()) # print(signedMessage) print('v: ', int(signedMessage.v)) print('r: ', hex(signedMessage.r)) print('s: ', hex(signedMessage.s)) print('signature: ', signedMessage.signature.hex()) print(w3.eth.account.recover_message(encode_defunct(text=rawText), signature=signedMessage.signature)) 2. 执行脚本,得到 address: 0x1c74c86906d91766e143e1d009C8604b66001363 message hash: 0x50b2c43fd39106bafbba0da34fc430e1f91e3c96ea2acee2bc34119f92b37750 v: 28 r: 0x5a0121bea4f2c1e9e6aad76bd3e06191a533c0b53a77df31e3b6310dbf4f698f s: 0x17216a4bfd7cf812bf2a6d9b44122c807880a5cb3de403d4baa8e0fb352189dd signature: 0x5a0121bea4f2c1e9e6aad76bd3e06191a533c0b53a77df31e3b6310dbf4f698f17216a4bfd7cf812bf2a6d9b44122c807880a5cb3de403d4baa8e0fb352189dd1c 0x1c74c86906d91766e143e1d009C8604b66001363 3....

2022-03-27 · 2 min · 278 words · Xuqi.Zhong

打造以太坊私有链,合约的部署与使用

1. 下载 $ git clone https://github.com/ethereum/go-ethereum.git 2. 编译 $ cd go-ethereum $ make geth 把./build/bin/geth添加到可执行路径中 3. 配置初始状态 保存配置到genesis.json文件 { "config": { "chainId": 7777, "homesteadBlock": 0, "eip150Block": 0, "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 0, "constantinopleBlock": 0, "petersburgBlock": 0, "ethash": {} }, "difficulty": "1", "gasLimit": "8000000", "alloc": { "7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" }, "f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" } } } 执行geth init --datadir data genesis....

2022-03-15 · 3 min · 635 words · Xuqi.Zhong