47. 可升级合约
WTF Solidity极简入门: 47. 可升级合约
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们将介绍可升级合约(Upgradeable Contract)。教学用的合约由OpenZeppelin中的合约简化而来,可能有安全问题,不要用于生产环境。
可升级合约
如果你理解了代理合约,就很容易理解可升级合约。它就是一个可以更改逻辑合约的代理合约。
简单实现
下面我们实现一个简单的可升级合约,它包含3个合约:代理合约,旧的逻辑合约,和新的逻辑合约。
代理合约
这个代理合约比第46讲中的简单。我们没有在它的fallback()函数中使用内联汇编,而仅仅用了implementation.delegatecall(msg.data);。因此, ...
46. 代理合约
WTF Solidity极简入门: 46. 代理合约
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们介绍代理合约(Proxy Contract)。教学代码由OpenZeppelin的Proxy合约简化而来。
代理模式
Solidity合约部署在链上之后,代码是不可变的(immutable)。这样既有优点,也有缺点:
优点:安全,用户知道会发生什么(大部分时候)。
坏处:就算合约中存在bug,也不能修改或升级,只能部署新合约。但是新合约的地址与旧的不一样,且合约的数据也需要花费大量gas进行迁移。
有没有办法在合约部署后进行修改或升级呢?答案是有的,那就是代理模式。
代理模式将合约数据和逻辑分开,分别保存在不同合约中。我们拿上图中简单的 ...
45. 时间锁
WTF Solidity极简入门: 45. 时间锁
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们介绍时间锁和时间锁合约。代码由Compound的Timelock合约简化而来。
时间锁
时间锁(Timelock)是银行金库和其他高安全性容器中常见的锁定机制。它是一种计时器,旨在防止保险箱或保险库在预设时间之前被打开,即便开锁的人知道正确密码。
在区块链,时间锁被DeFi和DAO大量采用。它是一段代码,他可以将智能合约的某些功能锁定一段时间。它可以大大改善智能合约的安全性,举个例子,假如一个黑客黑了Uniswap的多签,准备提走金库的钱,但金库合约加了2天锁定期的时间锁,那么黑客从创建提钱的交易,到实际把钱提走,需要2天的等待期。在这一段时 ...
44. 代币锁
WTF Solidity极简入门: 44. 代币锁
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们介绍什么是流动性提供者LP代币,为什么要锁定流动性,并写一个简单的ERC20代币锁合约。
代币锁
代币锁(Token Locker)是一种简单的时间锁合约,它可以把合约中的代币锁仓一段时间,受益人在锁仓期满后可以取走代币。代币锁一般是用来锁仓流动性提供者LP代币的。
什么是LP代币?
区块链中,用户在去中心化交易所DEX上交易代币,例如Uniswap交易所。DEX和中心化交易所(CEX)不同,去中心化交易所使用自动做市商(AMM)机制,需要用户或项目方提供资金池,以使得其他用户能够即时买卖。简单来说,用户/项目方需要质押相应的币对(比如ETH ...
43. 线性释放
WTF Solidity极简入门: 43. 线性释放
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们将介绍代币归属条款,并写一个线性释放ERC20代币的合约。代码由OpenZeppelin的VestingWallet合约简化而来。
代币归属条款
在传统金融领域,一些公司会向员工和管理层提供股权。但大量股权同时释放会在短期产生抛售压力,拖累股价。因此,公司通常会引入一个归属期来延迟承诺资产的所有权。同样的,在区块链领域,Web3初创公司会给团队分配代币,同时也会将代币低价出售给风投和私募。如果他们把这些低成本的代币同时提到交易所变现,币价将被砸穿,散户直接成为接盘侠。
所以,项目方一般会约定代币归属条款(token vesting),在归属 ...
42. 分账
WTF Solidity极简入门: 42. 分账
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们介绍分账合约,该合约允许将ETH按权重转给一组账户中,进行分账。代码部分由OpenZeppelin库的PaymentSplitter合约简化而来。
分账
分账就是按照一定比例分钱财。在现实中,经常会有“分赃不均”的事情发生;而在区块链的世界里,Code is Law,我们可以事先把每个人应分的比例写在智能合约中,获得收入后,再由智能合约来进行分账。
分账合约
分账合约(PaymentSplit)具有以下几个特点:
在创建合约时定好分账受益人payees和每人的份额shares。
份额可以是相等,也可以是其他任意比例。
在该合约收到的所有ETH ...
41. WETH
WTF Solidity极简入门: 41. WETH
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们将学习WETH–带包装的ETH。
什么是WETH?
WETH (Wrapped ETH)是ETH的带包装版本。我们常见的WETH,WBTC,WBNB,都是带包装的原生代币。那么我们为什么要包装它们?
在2015年,ERC20标准出现,该代币标准旨在为以太坊上的代币制定一套标准化的规则,从而简化了新代币的发布,并使区块链上的所有代币相互可比。不幸的是,以太币本身并不符合ERC20标准。WETH的开发是为了提高区块链之间的互操作性 ,并使ETH可用于去中心化应用程序(dApps)。它就像是给原生代币穿了一件智能合约做的衣服:穿上衣服的时候,就变 ...
40. ERC1155
WTF Solidity极简入门: 40. ERC1155
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们将学习ERC1155标准,它支持一个合约包含多种代币。并且,我们会发行一个魔改的无聊猿 - BAYC1155:它包含10,000种代币,且元数据与BAYC一致。
EIP1155
不论是ERC20还是ERC721标准,每个合约都对应一个独立的代币。假设我们要在以太坊上打造一个类似《魔兽世界》的大型游戏,这需要我们对每个装备都部署一个合约。上千种装备就要部署和管理上千个合约,这非常麻烦。因此,以太坊EIP1155提出了一个多代币标准ERC1155,允许一个合约包含多个同质化和非同质化代币。ERC1155在GameFi应用最多,Decentr ...
39. 链上随机数
WTF Solidity极简入门: 39. 链上随机数
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
很多以太坊上的应用都需要用到随机数,例如NFT随机抽取tokenId、抽盲盒、gamefi战斗中随机分胜负等等。但是由于以太坊上所有数据都是公开透明(public)且确定性(deterministic)的,它没法像其他编程语言一样给开发者提供生成随机数的方法。这一讲我们将介绍链上(哈希函数)和链下(chainlink预言机)随机数生成的两种方法,并利用它们做一款tokenId随机铸造的NFT。
链上随机数生成
我们可以将一些链上的全局变量作为种子,利用keccak256()哈希函数来获取伪随机数。这是因为哈希函数具有灵敏性和均一性,可以得到“看似”随机 ...
38. NFT交易所
WTF Solidity极简入门: 38. NFT交易所
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
OpenSea是以太坊上最大的NFT交易平台,总交易总量达到了$300亿。OpenSea在交易中抽成2.5%,因此它通过用户交易至少获利了$7.5亿。另外,它的运作并不去中心化,且不准备发币补偿用户。NFT玩家苦OpenSea久已,今天我们就利用智能合约搭建一个零手续费的去中心化NFT交易所:NFTSwap。
设计逻辑
卖家:出售NFT的一方,可以挂单list、撤单revoke、修改价格update。
买家:购买NFT的一方,可以购买purchase。
订单:卖家发布的NFT链上订单,一个系列的同一tokenId最多存在一个订单,其中包含挂单价格p ...