0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D
这串乱码是什么?
这个 42 个字母组成的字符串,其实是一个地址,存在以太坊那个全球所有人公用的大表上。这个神秘的地址里存着什么呢?我们
用 web3js 的
代码 getCode
去拿一下:
const 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 0x80
PUSH1 0x40
MSTORE
PUSH1 0x04
CALLDATASIZE
LT
PUSH2 0x021a
JUMPI
...
从这个角度来说,我们可以把以太坊理解成一个 Github,大家把自己的代码编译以后,放到一个地址去。任何人都可以把这个代码拿下来(Github 叫做 clone 下来)执行。
我们可以执行这个代码里面的函数。在其中的十几个函数里面(这个函数的列表就是 ERC721 规定的大家都用的),我就对三个函数感兴趣:
totalSupply
(),
symbol
(), 还有
tokenURI
()。
const Web3 = require('Web3');
const 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)
执行得结果如下:
分别是这个合约的总发行量,Token的简写,以及 1 号 token 的地址。
我们接着如福尔摩斯一样跟踪 1 号 Token 的 tokenURI 函数返回的地址: