本文记录了作者使用 GPT-3 聊天机器人来编写一个自动化脚本更新 ENS 记录的过程。尽管机器人在生成代码时出现了许多错误,作者凭借自己的专业知识成功解决了这些问题,并总结了 AI 作为编程助手的优缺点。
更新我的博客:一次快速的 GPT 聊天机器人编码实验
GPT 聊天机器人 最近非常火热。除了许多重要的应用场景,比如 写歌词、作为 语言学习伙伴 和提出令人信服的论据 支持任意政治观点,许多人对将该聊天机器人用来编写代码的可能性感到兴奋。
在很多情况下,它能够成功和写出相当不错的代码,特别是对于常见的任务。然而,在某些较少探索的领域,它可能会失败:见证它搞笑而又错误地尝试 编写 PLONK 验证器:
(如果你想知道怎么做到这一点, 这里是一个由我编写的 PLONK 验证器)
那么这些工具在一般情况下的表现如何呢?我决定尝试一下 GPT3 聊天机器人,看看是否能让我解决一个对我个人非常重要的问题:更改我 vitalik.eth
ENS 记录中注册的 IPFS 哈希,以便能通过 ENS 查看我刚在博客上发布的 新文章。
更新我博客的 ENS 视图通常包括两个步骤:首先,发布更新的内容,其次,将 ENS 更新为新内容的 IPFS 哈希。 Fleek 很久以前就为我自动化了这个第一部分:我只需将内容推送到 Github,Fleek 会自动将新版本上传到 IPFS。我听说过我可以更改设置,通过 Fleek 赋予编辑我 ENS 的权限,但在这里我想完全“自主”,而不相信第三方,因此我没有这样做。相反,到目前为止,我只能前往 app.ens.domains 的 GUI,点击几次,等待几个加载界面通过,然后最终点击“ADD / EDIT RECORD”,更改 CONTENT
哈希并点击“Confirm”。这是一个繁琐的过程,因此今天我最终决定编写一个 Javascript 脚本,将这一切自动化成单击一次的操作。
任务很简单:发送一笔以太坊交易到正确的地址,携带正确的 calldata,将 ENS 合约中的内容哈希记录更新为 Fleek 给我的 IPFS 哈希。今天,我手动做了这一切(两次,一次发布,一次添加一些更正),我得到的 IPFS 哈希是:
bafybeifvvseiarzdfoqadphxtfu5yjfgj3cr6x344qce4s4f7wqyf3zv4e
bafybeieg6fhbjlhkzhbyfnmyid3ko5ogxp3mykdarsfyw66lmq6lq5z73m
如果你点击每个链接的顶部文章,你将看到两个不同的版本。
这种哈希格式通常被称为“bafyhash”。但有一个问题:在以太坊中保存的哈希格式 不是 bafyhash:
我知道 IPFS 内容哈希是数据的最后两行。为什么我知道?因为我检查了我发送的 两笔 不同的 交易,我看到顶行是一样的,而底行是不同的。足够了。
那么我该如何将 bafyhash 转换为二进制的 IPFS 内容哈希呢?让我尝试问一下 GPT3 聊天机器人!
不!!!许多问题。首先,有两件事情是我的错:
不过,这些我指定的责任在于我,但是在我接下来的指示中,我会提到这一点。但现在,让我们来看看 确实 是它的错的事情:
话虽如此,在这个故事的这一部分,我甚至没有意识到 bafyhash 是 base 32。我首先修复了两个 是 我错的方面:
哇,好糟糕,AI 训练者羞愧地说!atob
函数是用于 base 64,而不是 base 58
好的,继续。几轮后......
一开始很难看出发生了什么,但它是非常错误的。基本上,它不是将整个字符串从 base 58 转换到 base 16,而是将 每个数字 转换为 base 16。不是我想要做的事情!
看来我得告诉它应该使用什么策略:
更好了!我很快开始意识到我不需要 base 58,我需要 base 32,此外我需要 base 32 的 小写 版本。我还想要将代码包装在一个函数中。对于这些更简单的步骤,它变得更合作:
在这一点上,我尝试将我拥有的 bafyhash 传递给这个函数,而得到的输出完全不同,看起来很难接受。看来我不能只假设这是通用的 base 58,我必须深入细节。嗯,我可以问一下 GPT3 聊天机器人吗?
好的,这没有帮助。让我尝试更具体一些。
这是一个……有趣的猜测,但完全错误。在这一点之后,我暂时放弃了 GPT3,继续检查生成的十六进制和 python 中的实际十六进制,直到发现相似之处。最终,我发现了:我实际上需要将两个十六进制都转换为字面二进制,然后从一个中搜索另一个的二进制子串。我发现偏移量为 2 位。
我手动编辑代码,补偿偏移量,通过将 bigint 除以 4:
因为我已经知道该怎么做,我还自己编写生成整个 calldata 的部分:
无论如何,然后我切换到下一个任务:实际上发送交易的那部分 Javascript。我回到 GPT3。
不!!!我说不想要库!!!1!1!
我直接告诉它该使用什么:
这次更成功了。不过,出了两个错误:
from
地址。gas
字段,需使用十六进制值。另外,后 EIP-1559 的话,硬编码一个 gasPrice
确实没有什么意义。从这里开始,我继续自己完成其余的工作。
function bafyToHex(bafyString) {
// 为 base32 字母表创建查找表
var alphabet = 'abcdefghijklmnopqrstuvwxyz234567';
var base = alphabet.length;
var lookupTable = {};
alphabet.split('').forEach(function(char, i) {
lookupTable[char] = i;
});
// 将 base32 编码的字符串解码为大整数
var bigInt = bafyString.split('').reduce(function(acc, curr) {
return acc * BigInt(base) + BigInt(lookupTable[curr]);
}, BigInt(0)) / BigInt(4);
// 将大整数转换为十六进制字符串
var hexString = bigInt.toString(16);
return 'e30101701220' + hexString.slice(-64);
}
function bafyToCalldata(bafyString) {
return (
'0x304e6ade' +
'ee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835' +
'0000000000000000000000000000000000000000000000000000000000000040' +
'0000000000000000000000000000000000000000000000000000000000000026' +
bafyToHex(bafyString) +
'0000000000000000000000000000000000000000000000000000'
)
}
async function setBafyhash(bafyString) {
calldata = bafyToCalldata(bafyString);
const addr = (await window.ethereum.enable())[0];
// 设置交易的 "to" 地址
const to = '0x4976fb03c32e5b8cfe2b6ccb31c09ba78ebaba41';
// 设置交易选项
const options = {
from: addr,
to: to,
data: calldata,
gas: "0x040000"
};
console.log(options);
// 发送交易
window.ethereum.send('eth_sendTransaction', [options], function(error, result) {
if (error) {
console.error(error);
} else {
console.log(result);
}
});
}
我问 GPT-3 一些小问题:如何声明一个 async
函数(第一次问时回答正确),以及在 Twitter 搜索中搜索仅包含图片的推文时需要使用什么关键字(需要为写这篇文章)。它都回答得很完美:声明一个异步函数要使用 async function functionName
,使用 filter:images
过滤包含图片的推文。
GPT-3 聊天机器人作为编程辅助工具是有帮助的,但它也犯了很多错误。最终,我能够迅速克服它的错误,因为我有很多领域知识:
atob
表示怀疑window.ethereum.send
gas
字段时,我立即知道它应该是十六进制值。在这一点上,AI 离成为人类程序员的替代品还有很远。在这个特定情况下,它只让我稍微提速而已:我本来最终可以通过谷歌找到解决方案,确实在一两处我 确实 回去又谷歌了一下。这是说,它确实让我了解到一些我之前没有见过的编码模式,并且它比我自己更快地编写了基数转换器。对于编写用于发送简单交易的 Javascript 的一般任务,它表现得相当不错。
不过,AI 的进步非常迅速,我预计它将继续改进,并逐渐消除这样的错误。
附录:在写这篇文章中涉及更多复制粘贴而非思考的部分时,我开了我的音乐播放列表并设置为随机播放。第一首开始播放的歌是讽刺地,Basshunter 的 Boten Anna(“机器人安娜”)。
- 原文链接: vitalik.eth.limo/general...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!