如何检测以太坊ERC721令牌

时间:2018-03-20 12:00:39

标签: ethereum solidity

我已阅读article帐号ERC165,它使我们能够检测合同中实施的接口。

然而,我发现有些ERC721令牌与其他令牌有点不同,例如cryptokittiescryptohorse

这些不同的ERC721令牌是否都被钱包应用程序检测为erc721令牌。

erc721如何支持钱包检测令牌的类型。

2 个答案:

答案 0 :(得分:2)

是的,某些ERC-721合同未遵循该标准。大多数原因是因为它们是在实际确认ERC-721标准之前部署的。这些例子之一就是CryptoKitties。

使用ERC-721验证程序来检查智能合约是否完全遵循ERC-721标准:https://erc721validator.org

答案 1 :(得分:1)

在golang中,您可以通过调用EVM并检查输出来检测合同是否为令牌,如下所示:

// Getting token Decimals 
input, err = erc20_token_abi.Pack("decimals")
if err!=nil {
    utils.Fatalf("packing input for decimals failed: %v",err)
}
msg=types.NewMessage(fake_src_addr,addr,0,value,gas_limit,gas_price,input,false)
evm_ctx=core.NewEVMContext(msg,block_header,chain,nil)
ethvirmac=vm.NewEVM(evm_ctx,statedb,bconf,vm_cfg)
gp=new(core.GasPool).AddGas(math.MaxBig256)
ret,gas,failed,err=core.ApplyMessage(ethvirmac,msg,gp)
tok.decimals_found=false
if (failed) {
    log.Info(fmt.Sprintf("vm err for decimals: %v, failed=%v",err,failed))
}
if err!=nil {
    log.Info(fmt.Sprintf("getting 'decimals' caused error in vm: %v",err))
}
if !((err!=nil) || (failed)) {
    int_output:=new(uint8)
    err=erc20_token_abi.Unpack(int_output,"decimals",ret)
    if err!=nil {
        log.Info(fmt.Sprintf("Contract %v: can;t upack decimals: %v",hex.EncodeToString(addr.Bytes()),err))
    } else {
        tok.decimals=int32(*int_output)
        tok.decimals_found=true
    }
}

但是,如果您不想直接使用EVM弄脏手,则可以检查事件签名:

erc20_approval_signature,_ = hex.DecodeString("8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925")
erc20_transfer_signature,_ = hex.DecodeString("ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef")

这些位于event.Topics [0],因此,如果Topics [0]与上述字符串匹配,则合同为ERC20令牌的可能性很高。如果您收集所有合同事件并总结使用哪种方法,则可以确定是ERC20还是ERC721