跳至主要內容

Non-Fungible Tokens

Hirsun大约 44 分钟

Non-Fungible Tokens

NFT

Non-Fungible Tokens (NFT)

可替代性:各个单位能够相互替代

代币的概念

代币是区块链上的数字资产,可以代表各种价值,如货币、资产、权益等。

代币可以分为可替代代币(Fungible Tokens)和不可替代代币(Non-Fungible Tokens, NFTs),它们在性质和用途上有显著差异。

可替代代币(如ERC20代币)是指每个代币都是相同的,并且可以分割成更小的单位。这意味着一个代币可以与另一个代币互换,没有区别。

  • 默认情况下,可替代代币使用18个小数位。
    • 这意味着一个完整的代币可以分割成10的18次方个更小的单位。
    • 这种设计允许非常精细的交易。
  • 不可替代代币(NFT,如ERC721代币)是指每个代币都是独一无二的,并且通过一个唯一的tokenID进行标识。
    • 这使得NFT能够代表独特的资产,如艺术品、收藏品等。

FT可以代表各种独特的资产,如收藏品、投票权、统一资源标识符(URIs)等。

  • URIs可以是HTTP链接或IPFS链接,与tokenID相关联。
  • OpenSea是一个流行的NFT交易平台,EIP-721是定义NFT标准的提案。

NFT是对可替代代币的扩展,增加了唯一性和不可分割性,使其能够代表独特的资产。

  • NFT是不可分割的,这意味着一个NFT不能被分割成更小的单位。
  • 每个NFT都是一个完整的、独特的实体。

Multi-tokens (ERC1155): 多代币标准(ERC1155)允许在一个智能合约中包含不同类型的代币,包括可替代代币和不可替代代币。

  • 一个ERC1155合约可以同时包含多种可替代代币和不可替代代币,使得开发者可以在一个合约中管理多种不同类型的资产。
  • 这种设计提高了代币管理的灵活性和效率。

ERC标准

ERC(Ethereum Request for Comments)是以太坊改进提案的缩写,定义了以太坊生态系统中的各种规范和标准。

ERC20和ERC721是两种常见的ERC标准,分别用于定义可替代代币和不可替代代币。

将数字艺术作品转化为NFT

假设你是一位数字艺术家,想要将你的数字艺术作品转化为NFT,并在OpenSea平台上进行销售。

你需要将你的艺术作品铸造成NFT,

  • 这意味着你需要使用ERC721标准创建一个唯一的代币,每个代币代表一件独特的艺术作品。
  • 然后,你需要将这些NFT上传到OpenSea平台进行销售。

NFT的唯一性和不可分割性使其非常适合代表独特的艺术作品。通过将你的艺术作品铸造成NFT,你可以确保每个作品都是独一无二的,并且可以在区块链上进行追踪和交易。

  1. 创建智能合约:编写一个符合ERC721标准的智能合约,定义你的NFT。
  2. 铸造NFT:使用智能合约铸造NFT,每个NFT代表一件艺术作品。
  3. 上传到OpenSea:将铸造的NFT上传到OpenSea平台,设置销售价格和其他相关信息。
  4. 销售和交易:在OpenSea平台上进行销售和交易,买家可以通过区块链购买你的NFT。

ERC20

在以太坊上启用可互换代币

可替代代币(如ERC20代币)是指每个代币在价值和功能上都是完全相同的,可以互换。

例如,一个ERC20代币和另一个ERC20代币在同一合约中具有相同的价值。

  • 从一个账户向其他账户转移代币: ERC20标准定义了一种方法,使得用户可以将代币从一个账户转移到另一个账户。这是通过智能合约中的transfer函数实现的
  • 获取账户代币余额: ERC20标准提供了一个balanceOf函数,允许用户查询特定地址的代币余额
  • ERC20标准中的totalSupply函数返回代币的总供应量。这表示了该代币在整个区块链网络中的总发行量。
  • ERC20标准中的approve函数允许代币持有者授权第三方账户在其名下花费一定数量的代币。这通常用于去中心化交易所或其他需要代币授权的应用。
    • 在去中心化交易所Uniswap中,用户需要首先使用approve函数授权Uniswap智能合约可以代表用户转移一定数量的代币,以便进行代币交换。
    • 在完成授权后,Uniswap会调用transferFrom函数,从用户账户中转移代币到目标账户。这是代币交换过程的一部分。
Example

假设Alice想要在Uniswap上将她的ERC20代币(例如DAI)交换成另一种ERC20代币(例如USDC)。

Alice需要首先批准Uniswap智能合约可以代表她转移一定数量的DAI代币,然后Uniswap智能合约会执行代币交换,将DAI转换成USDC。

这个过程涉及ERC20标准中的approvetransferFrom函数,Alice需要先使用approve函数授权Uniswap智能合约,然后Uniswap智能合约会调用transferFrom函数完成代币转移。

  1. Alice调用DAI合约的 approve 函数,授权Uniswap智能合约可以转移她的100 DAI代币。
    dai.approve(uniswapContractAddress, 100 * 10**18);
    
  2. Uniswap智能合约接收到授权后,Alice可以发起代币交换请求。
  3. Uniswap智能合约调用transferFrom函数,从Alice的账户中转移100 DAI到合约中,并根据当前汇率将等值的USDC转移到Alice的账户中。

Create Your ERC20

利用现有的合约代码可以大大减少开发时间和出错的几率。OpenZeppelin提供了经过社区验证的安全合约实现,非常适合用来构建自己的ERC20代币。

在创建自己的ERC20代币时,你需要重写构造函数(constructor)。构造函数是在合约部署时执行的特殊函数,用于初始化合约的状态。

Example

假设你想创建一个名为“StudentToken”的ERC20代币,每个代币有18位小数,并且在合约部署时向自己铸造1000个代币。

为了实现这个目标,

  • 你需要定义一个合约,继承ERC20标准,
  • 并在构造函数中初始化代币的名称、符号和小数位数。
  • 同时,你需要在合约部署时铸造1000个代币给自己。

ERC20标准提供了一组通用的方法和事件,使代币能够在不同的dApps之间互操作。通过继承ERC20合约并重写构造函数,你可以轻松创建符合ERC20标准的代币。

  1. 创建一个新的Solidity文件,命名为StudentToken.sol
  2. 导入OpenZeppelin的ERC20合约。
  3. 定义一个名为StudentToken的合约,并继承ERC20合约。
  4. 在构造函数中初始化代币的名称、符号和小数位数。
  5. 使用_mint函数在合约部署时向自己铸造1000个代币。

Extend to DeFi

ERC20代币可以部署在公共区块链上。

  • Permissionless:意味着任何人都可以与合约进行交互,不需要得到任何特定实体的授权或许可。
  • Transparency「透明度」:例如,Tether在Etherscan上。Tether是一种ERC20代币,其智能合约的字节码和源代码可以在Etherscan上查看。
  • Composable「可组合的」:智能合约可以相互组合,形成更复杂的金融产品和服务。
    • 例如,一个交换ERC20代币的合约。这样的合约可以自动执行代币交换操作。
    • Uniswap和其他复杂合约 -> 去中心化交易所/去中心化金融。Uniswap是一个去中心化交易所,允许用户在没有中介的情况下进行代币交换。

Swap between 2 ERC20 tokens

在智能合约TokenSwap内部实现代币交换的逻辑。

  • 涉及两个代币合约,分别是token1token2
  • 双方(owner1owner2)必须相互授权,允许对方在限定额度内转移自己的代币。
Example

假设Alice和Bob各自拥有不同的ERC20代币,Alice有TokenA,Bob有TokenB,他们希望交换一定数量的代币。

  • Alice和Bob需要相互授权,并通过智能合约实现代币交换。
  • 使用approve函数进行授权,使用swap函数进行交换。

过程

  • Alice调用TokenA合约的approve函数,授权TokenSwap合约一定数量的TokenA
  • Bob调用TokenB合约的approve函数,授权TokenSwap合约一定数量的TokenB
  • Alice或Bob调用TokenSwap合约的swap函数,执行代币交换。
1732123308527.png
1732123308527.png

Exchanging 2 ERC20 tokens

Order book like centralized exchange

  • 它列出了所有未成交的买卖订单,按价格排序。
  • 交易所通过匹配买卖双方的订单来完成交易。
  • 买方下达购买订单,卖方下达出售订单,当两者的价格和数量匹配时,交易就会执行。
  • 有时,如果订单不能完全匹配,交易所也可以部分执行订单,即部分成交。

另一种替代方案是社区资助的流动性池(Liquidity Pool)。

这些池由用户提供资金,通常包含两种代币,允许用户根据一定的比例进行交换。

  • 用户可以将自己的代币存入池中,为交易提供流动性。
  • 池中的代币数量和比例决定了交易的价格。
  • 如何计算交换汇率?
    1. 预言机(Oracle)是用于从外部世界获取数据的工具。在去中心化金融中,预言机可以提供实时的市场价格和其他信息,帮助计算交换汇率。
    2. 使用包含两种资产的流动性池(AMM)计算交换汇率。AMM通过预设的公式和算法,根据池中代币的数量自动计算汇率。

Automated Market Maker

自动化做市商(AMM)是一种无需订单簿的去中心化交易机制,通过恒定乘积公式来维持市场的流动性。

每次交换都确保恒定乘积c被保持。k1和k2分别代表两种资产的数量,而c是一个恒定值。

例如,假设k1和k2分别等于100,这意味着两种资产的数量相等。

假设有100个Token A和100个Token B,你希望用10个Token A交换Token B。

根据恒定乘积公式,k1 * k2 = c,初始状态下c = 100 * 100 = 10000。你需要计算交易后的Token A和Token B的数量。

恒定乘积公式是AMM的核心原理,它确保了每次交易后的市场流动性。

  1. 初始状态:k1 = 100, k2 = 100, c = 10000。
  2. 交换10个Token A后,新的k1 = 110。
  3. 根据公式,新的k2 = 10000 / 110 ≈ 90.9。
  4. 因此,10个Token A相当于90.9 - 100 = 9.1个Token B。

最终,你用10个Token A交换了9.1个Token B。

但是,AMM也有一些缺点。

  • 小额订单会影响价格,因为每次交易都会改变资产的比例。
  • AMM容易受到三明治攻击和抢先交易(MEV)「vul. to sandwich attack/frontrun (MEV)」的影响。攻击者可以通过观察交易来操纵价格。
  • 攻击者可以看到交易并提前下单,导致价格膨胀。
  • 在AMM中,交易者无法控制交易的具体汇率。

恒定乘积公式

恒定乘积公式是AMM中常用的算法之一。它通过保持池中两种代币的乘积恒定,来计算交易价格。

公式为:x * y = k,其中x和y是两种代币的数量,k是一个常数。

**它表示在一个交易对中,两种资产的乘积是一个恒定值。**这个公式确保了在每次交易后,资产的比例会自动调整以维持市场的流动性。

ERC721

ERC721是以太坊上的一种NFT标准,它定义了一组接口和规则,使得不同的NFT合约能够互操作。

ERC721标准确保每个代币都是唯一的,并且可以被追踪和转移。

Examples

  • Art Blocks 是一个基于区块链的艺术创作平台,允许艺术家使用生成算法创建独特的艺术品
  • ENS(Ethereum Name Service)是一个基于区块链的域名系统,允许用户将复杂的以太坊地址映射到易记的域名。
    • ENS 域名可以以 ERC721 或 ERC20 代币的形式存在。
  • ERC721代币在游戏、元宇宙和论坛中有广泛应用,如数字资产和虚拟角色的管理。
    • 数字资产和虚拟角色(如头像)可以通过ERC721代币进行唯一标识和管理。
    • Gods Unchained 是一个基于区块链的卡牌游戏,使用 ERC721 代币来代表游戏中的独特卡牌。
    • ERC721代币可以帮助跟踪数字资产的所有权,确保每个资产的唯一性和不可篡改性。
  • ERC721代币在票务和会员管理中的应用,如使用NFT代表活动门票或会员资格。

Etherscan

Etherscan 是一个以太坊区块链浏览器,可以查看和验证智能合约。Art Blocks 的智能合约可以在 Etherscan 上查看。

ERC1155 Multi Token Standard

  • 部署一个游戏合约。
    • 游戏货币使用ERC20标准,而游戏中的物品使用NFT(不可替代代币)。
    • 需要为不同的物品创建多个合约。
  • 在一个合约中支持多个ERC20和ERC721代币。
    • 但不能包含现有的ERC20或ERC721代币。
  • 需要实现ERC165标准(接口检测)。
  • 实现方式可以使用OpenZeppelin库。

How to separate FT/NF

如何区分可替代代币(FT)和不可替代代币(NFT)?

将ID位拆分:

  • 前128位用于代币ID。
  • 后128位用于NFT的索引。

zk-SNARK

零知识简洁非交互知识证明

传统区块链系统的 ISSUE

  • Transactions are not private
    • Confidential data are not protected
  • Scalability:指的是区块链系统在处理大量交易时的能力。目前大多数区块链面临扩展性问题,无法高效处理大量交易。
    • 指的是区块链系统在处理大量交易时的能力。目前大多数区块链面临扩展性问题,无法高效处理大量交易。
    • 我们能否将交易移到链下进行?
      • 这指的是将部分计算和数据处理移到区块链之外,以减轻链上负担。
      • 是的,可以使用zkSNARKs。zkSNARKs技术可以用于隐私保护和提高交易效率。
      • Layer 2 解决方案:zkRollup对比Optimistic Rollup。zkRollup和Optimistic Rollup是两种不同的Layer 2扩展技术,各有优缺点。
      • 只需发布正确交易的证明和结果。这意味着只需在链上发布交易的证明,而不需要发布所有细节,从而提高效率。

Intro. to zk-SNARK

Zero knowledge proof

  • 简洁性:证明大小是亚线性的。即,证明的大小远小于输入的大小。
  • 高效的证明/验证:证明和验证的复杂度优于线性复杂度。

例如,证明 (x, r) 的知识,使得 C = com(x; r)。这里,com 是一个承诺函数,x 和 r 是输入。

许多方法(阅读,视频):有多种方法可以实现零知识证明。

  • 主要思想:将关系转换为“电路”(R1CS)。R1CS 是 Rank-1 Constraint System 的缩写,是一种表示计算问题的方式。
  • 使用密码学原语「Polynomial commitment」来证明电路评估的正确性。
    • 交互式开放证明(IOP)、概率检查证明(PCP)和四次齐次多项式(QAP)。
    • 多项式承诺(例如 KZG)、基于配对的论证系统(例如 Groth16)。
    • Bulletproof 内积论证(对于承诺的 a 和 b,a 点乘 b = c)。
  • 有些依赖于可信设置。
Example
  1. Alice 选择一个随机数 r,并计算承诺值 C = com(密码; r)。
  2. Alice 将 C 发送给 Bob。
  3. Bob 选择一个挑战值,并发送给 Alice。
  4. Alice 计算响应值,并发送给 Bob。
  5. Bob 使用响应值验证 Alice 是否知道密码。

Implementation

对于广泛使用的证明系统,我们可以使用circom和snarkjs。

  • circom是一种用于编写电路的语言
  • 而snarkjs是一个用于从可信设置生成和验证证明的工具。

How?

  • 首先,我们需要选择一个zkSNARK证明系统,并进行可信设置以生成公共参数。
  • 接下来,我们需要使用circom编写表示计算的电路,并将其编译为R1CS格式。
  • 然后,我们使用见证数据生成zkSNARK证明,这通常是在链下进行的。
  • 最后,我们使用智能合约和之前生成的参数来验证证明的有效性。

Application Example: e-Voting

电子投票系统对安全性的要求非常高,甚至超过了电子商务

  • 系统必须确保只有合法的选民才能投票,并且每个选民只能投票一次。
  • 系统必须保护选民的隐私,确保没有人能够追踪到选民的投票选择。这涉及到匿名性和隐私保护技术。

NFT可以在治理合约中用作投票工具。每个NFT代表一个投票权,确保投票的唯一性和不可篡改性。