我读过关于ERC165的article,它使我们能够检测在契约中实现了哪个接口。
然而,我发现一些ERC721令牌与其他令牌有点不同,比如cryptokitties和cryptohorse。
这些不同的ERC721令牌都被钱包应用程序检测为erc721令牌。
以及erc721如何支持wallet检测令牌的类型。
发布于 2019-01-03 12:46:08
是的,一些ERC-721合同不遵循该标准。其中大多数原因是因为它们是在ERC-721标准得到实际确认之前部署的。CryptoKitties就是其中一个例子。
使用ERC-721验证器检查智能合约是否完全遵循ERC-721标准:https://erc721validator.org
发布于 2018-06-30 04:08:00
在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,因此如果主题与上面的字符串匹配,则合约是ERC20令牌的概率很高。如果收集合约的所有事件,并推导出它使用的方法的摘要,则可以决定它是ERC20还是ERC721
https://stackoverflow.com/questions/49383663
复制相似问题