Skip to content

Latest commit

 

History

History
93 lines (72 loc) · 7.09 KB

File metadata and controls

93 lines (72 loc) · 7.09 KB

第四十一课 WETH

WETH (Wrapped ETH)是ETH的带包装版本。我们常见的WETH,WBTC,WBNB,都是带包装的原生代币。

为什么要有WETH? 在2015年,ERC20标准出现,该代币标准旨在为以太坊上的代币制定一套标准化的规则,从而简化了新代币的发布,并使区块链上的所有代币相互可比。不幸的是,以太币本身并不符合ERC20标准。WETH的开发是为了提高区块链之间的互操作性 ,并使ETH可用于去中心化应用程序(dApps)。它就像是给原生代币穿了一件智能合约做的衣服:穿上衣服的时候,就变成了WETH,符合ERC20同质化代币标准,可以跨链,可以用于dApp;脱下衣服,它可1:1兑换ETH。

WETH符合ERC20标准,它比普通的ERC20多了两个功能:

  1. 存款:包装,用户将ETH存入WETH合约,并获得等量的WETH。
  2. 取款:拆包装,用户销毁WETH,并获得等量的ETH。
    // 存款函数,当用户存入ETH时,给他铸造等量的WETH
    function deposit() public payable {
        _mint(msg.sender, msg.value);
        emit Deposit(msg.sender, msg.value);
    }

    // 提款函数,用户销毁WETH,取回等量的ETH
    function withdraw(uint amount) public {
        require(balanceOf(msg.sender) >= amount);
        _burn(msg.sender, amount);
        payable(msg.sender).transfer(amount);
        emit Withdrawal(msg.sender, amount);
    }

第四十二课 分账

分账合约,该合约允许将ETH按权重转给一组账户中,进行分账。

分账合约场景

分账就是按照一定比例分钱财。在现实中,经常会有“分赃不均”的事情发生;而在区块链的世界里,Code is Law,我们可以事先把每个人应分的比例写在智能合约中,获得收入后,再由智能合约来进行分账。

特点

分账合约(PaymentSplit)具有以下几个特点:

  1. 在创建合约时定好分账受益人payees和每人的份额shares。
  2. 份额可以是相等,也可以是其他任意比例。
  3. 在该合约收到的所有ETH中,每个受益人将能够提取与其分配的份额成比例的金额。
  4. 分账合约遵循Pull Payment模式,付款不会自动转入账户,而是保存在此合约中。受益人通过调用release()函数触发实际转账。
状态变量

分账合约中共有5个状态变量,用来记录受益地址、份额、支付出去的ETH等变量:

  1. totalShares:总份额,为shares的和。
  2. totalReleased:从分账合约向受益人支付出去的ETH,为released的和。
  3. payees:address数组,记录受益人地址
  4. shares:address到uint256的映射,记录每个受益人的份额。
  5. released:address到uint256的映射,记录分账合约支付给每个受益人的金额。
函数
  1. 构造函数:始化受益人数组_payees和分账份额数组_shares,其中数组长度不能为0,两个数组长度要相等。_shares中元素要大于0,_payees中地址不能为0地址且不能有重复地址。
  2. receive():回调函数,在分账合约收到ETH时释放PaymentReceived事件。
  3. release():分账函数,为有效受益人地址_account分配相应的ETH。任何人都可以触发这个函数,但ETH会转给受益人地址account。调用了releasable()函数。
  4. releasable():计算一个受益人地址应领取的ETH。调用了pendingPayment()函数。
  5. pendingPayment():根据受益人地址_account, 分账合约总收入_totalReceived和该地址已领取的钱_alreadyReleased,计算该受益人现在应分的ETH。
  6. _addPayee():新增受益人函数及其份额函数。在合约初始化的时候被调用,之后不能修改。

第四十三课 线性释放

线性释放指的是代币在归属期内匀速释放。

线性释放场景

在传统金融领域,一些公司会向员工和管理层提供股权。但大量股权同时释放会在短期产生抛售压力,拖累股价。因此,公司通常会引入一个归属期来延迟承诺资产的所有权。同样的,在区块链领域,Web3初创公司会给团队分配代币,同时也会将代币低价出售给风投和私募。如果他们把这些低成本的代币同时提到交易所变现,币价将被砸穿,散户直接成为接盘侠。

线性释放

线性释放指的是代币在归属期内匀速释放。举个例子,某私募持有365,000枚ICU代币,归属期为1年(365天),那么每天会释放1,000枚代币。

四十四课 代币锁

代币锁(Token Locker)是一种简单的时间锁合约,它可以把合约中的代币锁仓一段时间,受益人在锁仓期满后可以取走代币。

代币锁场景

在去中心化交易所中, 需要用户或项目方提供资金池,以使得其他用户能够即时买卖。作为补偿,DEX会给他们铸造相应的流动性提供者LP代币凭证,证明他们质押了相应的份额。通过通过LP代币,资金提供方可以获取池子中对应的资金。如果项目方毫无征兆的撤出流动性池中的LP代币,那么投资者手中的代币就无法变现,直接归零了。这种行为也叫rug-pull。但是如果LP代币是锁仓在代币锁合约中,在锁仓期结束以前,项目方无法撤出流动性池,也没办法rug pull。因此代币锁可以防止项目方过早跑路。

四十五课 时间锁

时间锁合约是一种给函数调用加上时间限制的方法,可以预防黑客的攻击等问题

时间锁应用场景

如果有一个金库合约有漏洞,黑客通过某个方法可以提取合约中的token。如果这个方法有时间锁,金库合约加了2天锁定期的时间锁,那么黑客从创建提钱的交易,到实际把钱提走,需要2天的等待期。在这一段时间,项目方可以找应对办法,投资者可以提前抛售代币减少损失。

四十六课 代理合约

代理模式将合约数据和逻辑分开,分别保存在不同合约中。

代理模式的好处

  1. 可升级:当我们需要升级合约的逻辑时,只需要将代理合约指向新的逻辑合约。
  2. 省gas:如果多个合约复用一套逻辑,我们只需部署一个逻辑合约,然后再部署多个只保存数据的代理合约,指向逻辑合约。

代理模式的实现方式

代理合约(Proxy)通过delegatecall,将函数调用全权委托给逻辑合约(Implementation)执行,再把最终的结果返回给调用者(Caller)。

四十七课 可升级合约

可升级合约是指我们在部署合约的时候将逻辑代币和数据代码分开为两个合约部署,当逻辑合约不符合现在的要求的时候,通过修改数据合约(Proxy)中的逻辑合约(Logic)的地址来达到升级数据处理方式的目的。

特点

  1. 在proxy合约中,会存储代理合约的地址。
  2. 由于函数调用的上下文内容是在proxy,所以login的数据读取逻辑根据logic合约中的数据位置,去proxy中拿到对应的数据。 在proxy合约中的数据位置要和login合约中的数据位置一一对应,否则会出现数据错误更新的情况。