• 注册
  • 小程序
  • 注册
  • 查看作者
    • 买 NFT,实际是在买什么?从底层代码视角的分析

      本文语音阅读 播音源:Aixia

      0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D

      这串乱码是什么?

      这个 42 个字母组成的字符串,其实是一个地址,存在以太坊那个全球所有人公用的大表上。这个神秘的地址里存着什么呢?我们用 web3js 的代码 getCode 去拿一下:

      // use `npm install web3` to install web3const Web3 = require('Web3');const web3 = new Web3(“https://mainnet.infura.io/v3/593eb6ca2f004e8eae398e0d77283dc9”);const ADDRESS = '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D'web3.eth.getCode(ADDRESS).then(console.log)

      得到了如下一堆数字(为了简化,我没有把很长的数字全拷贝过来):

      0x60806040526004361061021a57600…..6f6c63430007000033

      这一堆数字又是什么呢?这就是代码。只不过这是机器可以读得懂的 OPCODE,大家简单地理解为汇编语言好了。直接翻译成人可以看懂一点点的代码就是下面这个样子的:

      PUSH1 0x80PUSH1 0x40MSTOREPUSH1 0x04CALLDATASIZELTPUSH2 0x021aJUMPI…

      从这个角度来说,我们可以把以太坊理解成一个 Github,大家把自己的代码编译以后,放到一个地址去。任何人都可以把这个代码拿下来(Github 叫做 clone 下来)执行。

      我们可以执行这个代码里面的函数。在其中的十几个函数里面(这个函数的列表就是 ERC721 规定的大家都用的),我就对三个函数感兴趣:totalSupply(),symbol(), 还有 tokenURI()。

      // use `npm install web3` to install web3const Web3 = require('Web3');// please use your own ID since this one may be deleted laterconst API = “https://mainnet.infura.io/v3/593eb6ca2f004e8eae398e0d77283dc9″const web3 = new Web3(API);const APE_CONTRACT = '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D'web3.eth.getCode(APE_CONTRACT).then(console.log)const ABI = [ { “name”: “totalSupply”, “type”: “function”, “inputs”: [], “outputs”: [{ “name”: “”, “type”: “uint256” }], }, { “name”: “symbol”, “type”: “function”, “inputs”: [], “outputs”: [{ “name”: “”, “type”: “string” }], }, { “name”: “tokenURI”, “type”: “function”, “inputs”: [{ “name”: “tokenId”, “type”: “uint256” }], “outputs”: [{ “name”: “”, “type”: “string” }], }]const contract = new web3.eth.Contract(ABI, APE_CONTRACT)contract.methods.totalSupply().call().then(console.log)contract.methods.symbol().call().then(console.log)contract.methods.tokenURI(1).call().then(console.log)

      执行得结果如下:

      10000BAYCipfs://QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariGR3jxcaWtq/1

      分别是这个合约的总发行量,Token的简写,以及 1 号 token 的地址。

      我们接着如福尔摩斯一样跟踪 1 号 Token 的 tokenURI 函数返回的地址:

      ipfs://QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariGR3jxcaWtq/1

      这个地址是一个普通的互联网地址,或者 IPFS 地址。IPFS 地址是另外的话题了,不展开,简单地说,可以把 ipfs:// 替换成 http s://  ipfs.io/ipfs/ 就可以转换成普通的互联网网址:

      http s://  ipfs.io/ipfs/QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariGR3jxcaWtq/1

      访问这个地址,得到如下一个描述文件

      { “image”: “ipfs://QmPbxeGcXhYQQNgsC6a36dDyYUcHgMLnGKnF8pVFmGsvqi”, “attributes”: [ { “trait_type”: “Mouth”, “value”: “Grin” }, { “trait_type”: “Clothes”, “value”: “Vietnam Jacket” }, { “trait_type”: “Background”, “value”: “Orange” }, { “trait_type”: “Eyes”, “value”: “Blue Beams” }, { “trait_type”: “Fur”, “value”: “Robot” } ]}

      除了各种类型的描述以外,我们最感兴趣的,是 image 这个属性。根据这个属性给出的地址:

      http s://  ipfs.io/ipfs/QmPbxeGcXhYQQNgsC6a36dDyYUcHgMLnGKnF8pVFmGsvqi

      我们总算找到了这个合约里面规定的 1 号 Token 对应的的图像:

      买 NFT,实际是在买什么?从底层代码视角的分析

      谜底揭晓:

      0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D

      代表的就是无聊猿(Bored Ape Yatch Club)的智能合约。一个智能合约地址和一个 Token 的编号,就唯一的确定了一个数字世界里面的藏品。

      回顾一下:

      我们所说的 NFT ,说到底是一个以太坊的地址上的一个支持 NFT 协议(也就是 ERC721)的智能合约,它支持 tokenURI 等十几个标准函数。给定一个 Tokend 的 ID,它可以告诉你一个区块链以外的地址,这个地址里面给出了图像,名称等等信息。

      我们购买一个 NFT,说到底是购买了某个合约地址里面的某个 TokenID,或者说,就是在那张大大的表上,这个合约地址上的那个 tokenID 这一行的 owner 属性,记录自己的钱包地址。

      除此以外的信息,包括上面这张猴子的头像,其实仅仅如包装纸上的图案一样,仅仅是一个赠品。

      来源 | 王建硕(ID:gardendewalle)

    • 310
    • 11
    • 0
    • 6.54w
    • 烈酒诱鹿白发伊人吕小树冰镜湖必修课红烧鱼学不乖不死小强小恩爱月殇魂囧兔兔樱花落天使的翅膀苍半凉冷夕颜

      请登录之后再进行评论

      登录
    • 69
      @离歌 还用分析啊,除非后期带线快点,不然干嘛?不如天鹰戒
    • 76
      离歌Lv.8
      分析下弓和枪各自的优缺点
    • 77
      法布施Lv.7
      @路人丁 这个太主观了.分析了没什么意义
    • 84
      狼亦尘Lv.7
      @六元 还用分析啊,除非后期带线快点,不然干嘛?不如天鹰戒
    • 74
      路人丁Lv.7
      分析下弓和枪各自的优缺点
    • 99
      六元Lv.7
      分析下弓和枪各自的优缺点
    • 93
      吕小鱼Lv.6
      @橘橘是只喵 哪公司呢。
    • 104
      @橘橘是只喵 也可以做参考,为啥这么低呢?
    • 91
      @橘橘是只喵 请问对专业性要求高吗?
    • 94
      传统行业的,就是用数据帮助公司管理运营和做决策。
    • 89
      分析一下全高画面,包括纹理质量之类的
    • 聊天
      关注 133

      关注

      • 加社群
      • 小程序
      • 公众号
    • 单栏布局 侧栏位置: