背景:线下将一批ENS地址需要转换成Address。由于本人是后端出生,本次任务挑选的技术栈是python。本以为10分钟能搞定的事情,花了整整2小时。。。以下是踩坑总结:
第一步:按照Web3.py的文档执行pip install web3
命令,非常顺利。
第二步:根据doc中ens的文档依葫芦画瓢写下以下代码:
from web3 import Web3
from ens import ENS
# provider = IPCProvider(...) --我改成http的方式接入provider
node_url = "我的节点"
ns = ENS(Web3.HTTPProvider(node_url))
eth_address = ns.address('jasoncarver.eth')
print("【eth_address】: " + eth_address)
assert eth_address == '0x5B2063246F2191f18F2675ceDB8b28102e957458'
输出结果与文档一直且符合预期,真tm简单😊:
控制台输出:
【eth_address】: 0x5B2063246F2191f18F2675ceDB8b28102e957458
第三步:看看换个输入是否ok呢?换成我自己的ens试试。
from web3 import Web3
from ens import ENS
# provider = IPCProvider(...) --我改成http的方式接入provider
node_url = "我的api url"
ns = ENS(Web3.HTTPProvider(node_url))
eth_address = ns.address('webber-woo.eth')
print(eth_address)
输出结果
None
难道是网络没连接上?重试了N次也是None,None,None……。 物理学以太坊不存在了?!😱😱😱一时间脑瓜子嗡嗡作响。
==============================================================
喝了杯咖啡,胖揍了我那只乱叫的傻狗后再次坐在电脑前——我试试js的方式吧。
在Alchemy中找到了example,再次以葫芦画瓢并执行我的脚本
import { Network, Alchemy } from 'alchemy-sdk';
const settings = {
apiKey: "我的api key",
network: Network.ETH_MAINNET,
};
const alchemy = new Alchemy(settings);
const wl = [
"webber-woo.eth",
"jasoncarver.eth",
"vitalik.eth",
];
for (var i=0; i<wl.length; i++) {
var addr = await alchemy.core.resolveName(wl[i]);
console.log(wl[i] + ", " + addr);
}
输出结果如下:
webber-woo.eth, 0x24e76Ed92D5c0B1CACA4fA4A9e0A8FFBC63BB67C
jasoncarver.eth, 0x5B2063246F2191f18F2675ceDB8b28102e957458
vitalik.eth, 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
世界没有坏!🧐 有人在捣鬼,好奇心驱使我去抓鬼。
==============================================================
回到ENS(Web3.HTTPProvider(node_url))
这行代码。它的构造函数可以传入address
如果未传入address则使用内部写死的‘0x314159265dd8dbb310642f98f50c066173c1259b’
这个合约地址构造ens合约对象。这个合约是在上古时代创建的。
而ENS官网推荐的地址是:0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e
,它是升级后的(找寻到该文档花费时间近2小时)。
将python代码中ENS构造方法添加推荐地址,
from web3 import Web3
from ens import ENS
# provider = IPCProvider(...) --我改成http的方式接入provider
node_url = "我的api url"
ns = ENS(Web3.HTTPProvider(alchemy_url), '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e')
eth_address = ns.address('webber-woo.eth')
print(eth_address)
输出结果符合预期。
0x24e76Ed92D5c0B1CACA4fA4A9e0A8FFBC63BB67C
由此世界太平了。