Non-Fungible Tokens
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,你可以确保每个作品都是独一无二的,并且可以在区块链上进行追踪和交易。
- 创建智能合约:编写一个符合ERC721标准的智能合约,定义你的NFT。
- 铸造NFT:使用智能合约铸造NFT,每个NFT代表一件艺术作品。
- 上传到OpenSea:将铸造的NFT上传到OpenSea平台,设置销售价格和其他相关信息。
- 销售和交易:在OpenSea平台上进行销售和交易,买家可以通过区块链购买你的NFT。
ERC20
在以太坊上启用可互换代币
可替代代币(如ERC20代币)是指每个代币在价值和功能上都是完全相同的,可以互换。
例如,一个ERC20代币和另一个ERC20代币在同一合约中具有相同的价值。
- 从一个账户向其他账户转移代币: ERC20标准定义了一种方法,使得用户可以将代币从一个账户转移到另一个账户。这是通过智能合约中的
transfer
函数实现的 - 获取账户代币余额: ERC20标准提供了一个
balanceOf
函数,允许用户查询特定地址的代币余额 - ERC20标准中的
totalSupply
函数返回代币的总供应量。这表示了该代币在整个区块链网络中的总发行量。 - ERC20标准中的
approve
函数允许代币持有者授权第三方账户在其名下花费一定数量的代币。这通常用于去中心化交易所或其他需要代币授权的应用。- 在去中心化交易所Uniswap中,用户需要首先使用
approve
函数授权Uniswap智能合约可以代表用户转移一定数量的代币,以便进行代币交换。 - 在完成授权后,Uniswap会调用
transferFrom
函数,从用户账户中转移代币到目标账户。这是代币交换过程的一部分。
- 在去中心化交易所Uniswap中,用户需要首先使用
Example
假设Alice想要在Uniswap上将她的ERC20代币(例如DAI)交换成另一种ERC20代币(例如USDC)。
Alice需要首先批准Uniswap智能合约可以代表她转移一定数量的DAI代币,然后Uniswap智能合约会执行代币交换,将DAI转换成USDC。
这个过程涉及ERC20标准中的approve
和transferFrom
函数,Alice需要先使用approve
函数授权Uniswap智能合约,然后Uniswap智能合约会调用transferFrom
函数完成代币转移。
- Alice调用DAI合约的
approve
函数,授权Uniswap智能合约可以转移她的100 DAI代币。dai.approve(uniswapContractAddress, 100 * 10**18);
- Uniswap智能合约接收到授权后,Alice可以发起代币交换请求。
- 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标准的代币。
- 创建一个新的Solidity文件,命名为
StudentToken.sol
。 - 导入OpenZeppelin的ERC20合约。
- 定义一个名为
StudentToken
的合约,并继承ERC20合约。 - 在构造函数中初始化代币的名称、符号和小数位数。
- 使用
_mint
函数在合约部署时向自己铸造1000个代币。
Extend to DeFi
ERC20代币可以部署在公共区块链上。
- Permissionless:意味着任何人都可以与合约进行交互,不需要得到任何特定实体的授权或许可。
- Transparency「透明度」:例如,Tether在Etherscan上。Tether是一种ERC20代币,其智能合约的字节码和源代码可以在Etherscan上查看。
- Composable「可组合的」:智能合约可以相互组合,形成更复杂的金融产品和服务。
- 例如,一个交换ERC20代币的合约。这样的合约可以自动执行代币交换操作。
- Uniswap和其他复杂合约 -> 去中心化交易所/去中心化金融。Uniswap是一个去中心化交易所,允许用户在没有中介的情况下进行代币交换。
Swap between 2 ERC20 tokens
在智能合约TokenSwap
内部实现代币交换的逻辑。
- 涉及两个代币合约,分别是
token1
和token2
。 - 双方(
owner1
和owner2
)必须相互授权,允许对方在限定额度内转移自己的代币。
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
函数,执行代币交换。
Exchanging 2 ERC20 tokens
Order book like centralized exchange
- 它列出了所有未成交的买卖订单,按价格排序。
- 交易所通过匹配买卖双方的订单来完成交易。
- 买方下达购买订单,卖方下达出售订单,当两者的价格和数量匹配时,交易就会执行。
- 有时,如果订单不能完全匹配,交易所也可以部分执行订单,即部分成交。
另一种替代方案是社区资助的流动性池(Liquidity Pool)。
这些池由用户提供资金,通常包含两种代币,允许用户根据一定的比例进行交换。
- 用户可以将自己的代币存入池中,为交易提供流动性。
- 池中的代币数量和比例决定了交易的价格。
- 如何计算交换汇率?
- 预言机(Oracle)是用于从外部世界获取数据的工具。在去中心化金融中,预言机可以提供实时的市场价格和其他信息,帮助计算交换汇率。
- 使用包含两种资产的流动性池(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的核心原理,它确保了每次交易后的市场流动性。
- 初始状态:k1 = 100, k2 = 100, c = 10000。
- 交换10个Token A后,新的k1 = 110。
- 根据公式,新的k2 = 10000 / 110 ≈ 90.9。
- 因此,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
- Alice 选择一个随机数 r,并计算承诺值 C = com(密码; r)。
- Alice 将 C 发送给 Bob。
- Bob 选择一个挑战值,并发送给 Alice。
- Alice 计算响应值,并发送给 Bob。
- Bob 使用响应值验证 Alice 是否知道密码。
Implementation
对于广泛使用的证明系统,我们可以使用circom和snarkjs。
- circom是一种用于编写电路的语言
- 而snarkjs是一个用于从可信设置生成和验证证明的工具。
How?
- 首先,我们需要选择一个zkSNARK证明系统,并进行可信设置以生成公共参数。
- 接下来,我们需要使用circom编写表示计算的电路,并将其编译为R1CS格式。
- 然后,我们使用见证数据生成zkSNARK证明,这通常是在链下进行的。
- 最后,我们使用智能合约和之前生成的参数来验证证明的有效性。
Application Example: e-Voting
电子投票系统对安全性的要求非常高,甚至超过了电子商务
- 系统必须确保只有合法的选民才能投票,并且每个选民只能投票一次。
- 系统必须保护选民的隐私,确保没有人能够追踪到选民的投票选择。这涉及到匿名性和隐私保护技术。
NFT可以在治理合约中用作投票工具。每个NFT代表一个投票权,确保投票的唯一性和不可篡改性。