更新我的博客:一个快速的GPT聊天机器人编码实验

本文记录了作者使用 GPT-3 聊天机器人来编写一个自动化脚本更新 ENS 记录的过程。尽管机器人在生成代码时出现了许多错误,作者凭借自己的专业知识成功解决了这些问题,并总结了 AI 作为编程助手的优缺点。

更新我的博客:一次快速的 GPT 聊天机器人编码实验

更新我的博客:一次快速的 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 聊天机器人!

不!!!许多问题。首先,有两件事情是我的错:

  1. 我忘了提这一点,我想要 Javascript,而不是 python。
  2. 它使用了外部依赖。我希望我的 JavaScript 可直接复制粘贴到控制台,所以我不想要任何库。

不过,这些我指定的责任在于我,但是在我接下来的指示中,我会提到这一点。但现在,让我们来看看 确实 是它的错的事情:

  1. Bafyhash 是 base 32,不是 base 58。IPFS 哈希有一个 base-58 格式,但那些被称为“QM 哈希”,而不是“bafyhashes”。
  2. 我说的“二进制”我并不想要字面上的 1 和 0,我想要的是正常的二进制格式,字节或字节数组!

话虽如此,在这个故事的这一部分,我甚至没有意识到 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!

我直接告诉它该使用什么:

这次更成功了。不过,出了两个错误:

  1. 确实需要一个 from 地址。
  2. 你不能将整数放入 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 聊天机器人作为编程辅助工具是有帮助的,但它也犯了很多错误。最终,我能够迅速克服它的错误,因为我有很多领域知识:

  • 我最终能够回忆起哈希全为小写意味着它是 base 32 而不是 base 58
  • 我知道浏览器不太可能内置 base 58,这是一种相对小众的格式,主要在加密领域使用,因此我立即对它建议的 atob 表示怀疑
  • 我知道以太坊交易中的数据必须以 某种 合理的方式编码 IPFS 哈希,这让我最终产生了检查位偏移的想法
  • 我知道在 base A 和 base B 之间转换的“正确”方式是通过某种抽象整数表示作为中间,Javascript 支持大整数
  • 我知道关于 window.ethereum.send
  • 当我收到错误提示不允许将整数放入 gas 字段时,我立即知道它应该是十六进制值。

在这一点上,AI 离成为人类程序员的替代品还有很远。在这个特定情况下,它只让我稍微提速而已:我本来最终可以通过谷歌找到解决方案,确实在一两处我 确实 回去又谷歌了一下。这是说,它确实让我了解到一些我之前没有见过的编码模式,并且它比我自己更快地编写了基数转换器。对于编写用于发送简单交易的 Javascript 的一般任务,它表现得相当不错。

不过,AI 的进步非常迅速,我预计它将继续改进,并逐渐消除这样的错误。

附录:在写这篇文章中涉及更多复制粘贴而非思考的部分时,我开了我的音乐播放列表并设置为随机播放。第一首开始播放的歌是讽刺地,Basshunter 的 Boten Anna(“机器人安娜”)。

  • 原文链接: vitalik.eth.limo/general...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Vitalik Buterin
Vitalik Buterin
https://vitalik.ca/