Smart Contract Developer
2mo
最近 ERC-6551 的热度很高,我们就来聊聊 ERC-6551 到底是什么。这篇文章我想从它的原理,代码实现,以及应用案例来讲解 6551。相信看完这篇文章后大家应该会对 6551 有一个比较全面的认识。 什么是 ERC-6551 简单来说,6551 是一个为 NFT 创建钱包的标准。这是什么意...
7mo
最近在读 Sudoswap 的合约代码,发现其中应用了 EIP-1167 的玩法,有些写法感觉很有意思,因此想特地写篇文章来记录分享一下。对于 EIP-1167 还不太了解的朋友可以看看我之前写的这篇文章。 工厂合约 在 Sudoswap 代码中,LSSVMPairFactory 合约是 Pair ...
10mo
Lens protocol 是 Aave 团队出品的 SocialFi 项目,我们今天结合它的文档来聊聊它的业务逻辑和合约代码。这篇文章主要着重于对大家看 Lens 代码的一个引导,不会详细解读代码的每一个点,主要是方便大家在看完文章后能对代码更熟悉一些,更快地理解代码。 代码分析 在大体业务上来说...
1y
这两天 XEN 特别火,看了看代码,相对比较简单。这篇文章就来结合文档来解读一下合约代码,仅做学习交流用。对于玩法还不熟悉的朋友可以先看看我昨天发的推文。 整个玩法分成两部分,我这里将其区别为: 时间挖矿(claim to mint),也就是在参与时指定时间,时间到期后即可领取对应的 XEN,唯...
流动性挖矿应该是上个牛市最火热的内容,基本上整个 DeFi 都是在围绕着流动性挖矿展开的,今天我们就来看看它到底是什么以及合约代码层面是怎么实现的。 流动性挖矿简介 首先我们先从用户的角度来理解一下流动性挖矿是什么,实际上就是用户通过在合约中质押一个 token 从而赚取另一个 token 的过程。...
概述 EIP-1167,又称 Minimal Proxy Contract,提供了一种低成本复制合约的方法。它有什么意义呢?我们先来看个例子: function createPair(address tokenA, address tokenB) external returns (address ...
我们今天来研究一下前段时间 Audius 项目被黑的原因。这部分涉及到了内存槽位和合约升级方面的内容,如果有朋友不了解这一块,可以看看我之前写的这个系列。看完之后再来看这篇文章就比较容易理解了。 代码分析 我们先看一下 Audius 的合约架构,它采用了可升级合约的架构: 我们知道,可升级合约架构...
今天我们来聊聊调用合约方法在字节码层面是怎么实现的。同样地,我们以一个简单的合约作为例子: 编译合约 // SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.15; contract Demo { constructor() {...
上篇文章我们简要介绍了一下合约的字节码构造以及内存布局,今天我们来从字节码层面聊聊合约的部署过程。 编译合约 我们来看一个例子: // SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.15; contract Demo { c...
今天我们来聊聊 EVM,那么什么是 EVM?EVM 其实就是执行 bytecode(字节码)的机器,它的全称是 Ethereum Virtual Machine(以太坊虚拟机),和 Java 的 JVM 很类似。我们平时写合约都是用 Solidity (或者 Vyper)编写的,但是这种语言机器是没...
XCarnival 是一个 NFT 借贷协议,用户可以将 NFT 抵押给协议,从而借出 token。同时也可以将 token 抵押给协议,获得利息收益。 这次攻击事件的原理是,用户在将 NFT 从协议中取出后,仍然可以借出 token。黑客利用这个 bug,不断新建合约,将其作为抵押人,抵押 NFT...
我们继续来学习 LooksRare 的代码,上篇文章中我们学习了它的主合约 LooksRareExchange,这篇文章我们着重于其它的辅助合约,包括各种管理合约以及交易策略合约等。 源码解读 TransferSelectorNFT 上篇文章的最后,我们谈到了 NFT 的转账操作: 可以看到,需要...
Test Order...
最近研究了 LooksRare 的合约代码,他们的代码写得比较简单易懂,同时文档内容也比较丰富。学习了几天,基本算是把整个合约代码都研究明白了,因此写篇文章来做做笔记,同时也希望能够帮助到有需要的朋友。 系统架构 名词解释 ask 代表卖家卖出,bid 代表买家买入。 maker 代表主动挂单的人...
contract Box { uint256 private _value; function store(uint256 value) public { _value = value; } function retrieve() public v...
Events 是 Solidity 中记录事件的工具,可以简单理解为日志。Events 的优点在于,一是能够利用较少的 Gas 就能将数据记录在区块链上,二是可以方便链下对链上数据进行监听。 代码示例 先来看一段简单的代码: pragma solidity 0.8.10; contract Eve...
Hardhat fork 可以使我们将主网的区块 fork 到本地,这样我们就可以在本地与真实的链上数据进行交互,同时也可以模拟任意账户,方便我们进行一些测试,速度快,并且不用花费 Gas。 基本命令 首先,我们先创建一个 Hardhat 项目,不熟悉的朋友可以看看这里。创建完毕之后,就可以在本地 ...
之前的文章我们介绍过如何对数据进行签名,利用签名技术我们可以实现一些功能例如白名单校验等。但是这种签名技术的应用场景比较简单,一般就是给一串字符串,或者一串哈希签名,如果我们想为更复杂的数据签名就无法实现了。 EIP-712 的出现就是为了解决这个问题,利用 EIP-712,我们可以对更大的数据集,...
Ethers.js 是一个与 evm-compitable 区块链交互的 JavaScript 库。用户通过编写 JavaScript 代码就可以与区块链进行交互,包括读写等操作。同时还有一个名为 web3.js 的库也可以与区块链交互,与之相比,Ethers.js 更加轻量级,上手更加简单。 安装...
前面的文章我们基本把合约升级的原理介绍完了,这篇文章我们来实际操作一下,部署一个可升级合约。我们将会使用到 hardhat 框架和 OpenZeppelin 的可升级合约库。这个库和 OZ 的普通合约库的区别是,所有的合约中都没有构造函数,作为代替的是 initialize 函数,用来作初始化操作。...