我已阅读article帐号ERC165,它使我们能够检测合同中实施的接口。
然而,我发现有些ERC721令牌与其他令牌有点不同,例如cryptokitties和cryptohorse。
这些不同的ERC721令牌是否都被钱包应用程序检测为erc721令牌。
erc721如何支持钱包检测令牌的类型。
答案 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