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

作者分享了使用GPT-3聊天机器人进行编码实验的经历,特别是如何通过GPT-3生成代码来自动更新ENS记录中的IPFS哈希。尽管GPT-3在某些方面表现不错,但在处理特定编码任务时仍存在许多错误,最终作者通过手动修正实现了目标。

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

GPT 聊天机器人最近几天非常流行。除了许多重要的用例,比如写歌词、作为语言学习伙伴以及为任意政治观点提出听起来有说服力的论点外,许多人还对使用聊天机器人编写代码的可能性感到兴奋。

在很多情况下,它可以成功并编写一些非常不错的代码,尤其是对于常见的任务。然而,在涉及较少被探索的领域时,它可能会失败:看看它尝试编写 PLONK 验证器时的搞笑失败:

(如果你想了解如何正确编写,这里是我写的 PLONK 验证器

但这些工具在一般情况下表现如何?我决定试试 GPT3 聊天机器人,看看它能否解决一个对我个人非常相关的问题:更改我 vitalik.eth ENS 记录中注册的 IPFS 哈希,以便通过 ENS 查看我刚刚发布在博客上的新文章

更新我的博客的 ENS 视图通常包括两个步骤:首先,将更新后的内容发布到 IPFS,其次,更新我的 ENS 记录以包含新内容的 IPFS 哈希。Fleek 长期以来为我自动化了第一部分:我只需将内容推送到 Github,Fleek 就会自动将新版本上传到 IPFS。我被告知可以更改设置,让 Fleek 也有权编辑我的 ENS,但在这里我想完全“自主”,不信任第三方,所以我没有这样做。相反,到目前为止,我必须访问 app.ens.domains 的 GUI,点击几次,等待几个加载屏幕过去,最后点击“ADD / EDIT RECORD”,更改 CONTENT 哈希并点击“Confirm”。这一切都是一个繁琐的过程,所以今天我最终决定编写一个 Javascript 脚本,将这一切自动化,变成一个可以复制粘贴到浏览器控制台的单一 Javascript 片段。

任务很简单:向正确的地址发送一个以太坊交易,使用正确的调用数据来更新 ENS 合约中的内容哈希记录,使其等于 Fleek 给我的 IPFS 哈希。昨天,我手动完成了这一切(两次,一次是发布,另一次是添加一些修正),我得到的 IPFS 哈希是:

bafybeifvvseiarzdfoqadphxtfu5yjfgj3cr6x344qce4s4f7wqyf3zv4e

bafybeieg6fhbjlhkzhbyfnmyid3ko5ogxp3mykdarsfyw66lmq6lq5z73m

如果你点击每个哈希中的顶部文章,你会看到两个不同的版本。

这种哈希格式通常被称为“bafyhash”,因为哈希都以“bafy”开头。但有一个问题:保存在以太坊中的哈希格式不是 bafyhash。这是进行更新操作的交易的调用数据:

我确实知道 IPFS 内容哈希是数据的最后两行。我怎么知道的?嗯,我检查了两个不同的交易,我看到顶行是相同的,底部的两行是不同的。这就够了。

那么,我如何将 bafyhash 转换为二进制 IPFS 内容哈希呢?让我试试问问 GPT3 聊天机器人!

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

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

这些都是我的责任,尽管在我的下一个指令中我会指定。但现在我们来看看它的问题:

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

也就是说,在这个故事的这个部分,我甚至没有意识到 bafyhashes 是 base 32。我先解决了我的两个问题:

BAAAAAAAAAAAAAD,AI 训练者不好意思地说!atob 函数是用于 base 64,而不是 base 58

好吧,我们继续。几轮之后...

一开始很难看出发生了什么,但它完全错了。基本上,它不是将整个字符串从 base 58 转换为 base 16,而是将每个单独的字符转换为 base 16。这不是我想做的!

我想我得告诉它应该使用什么策略:

好多了!我很快意识到我不需要 base 58,我需要 base 32,而且我需要的是 base 32 的小写版本。我还希望代码包装在一个函数中。对于这些更简单的步骤,它变得合作多了:

在这一点上,我尝试将实际的 bafyhashes 传递给这个函数,我得到了无法识别的不同输出。看起来我不能假设这是通用的 base 32,我必须深入研究细节。嗯,我可以问问 GPT3 聊天机器人吗?

好吧,这没有帮助。让我试试更具体一点。

这是一个....有趣的猜测,但完全错了。在这之后,我暂时放弃了 GPT3,继续在 python 中检查生成的十六进制和实际的十六进制,直到我发现相似之处。最终,我弄明白了:我实际上将两个十六进制转换为字面二进制,并在另一个中搜索一个二进制子字符串。我发现有一个 2 位的偏移。

我只是手动编辑了代码,通过将大整数除以 4 来补偿偏移:

因为我已经知道该怎么做,我也自己编写了生成整个调用数据的部分:

无论如何,然后我切换到下一个任务:实际发送交易的 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 58,这是一种相对小众的格式,主要用于加密世界,所以我立即对它建议使用 atob 产生了怀疑。
  • 我最终可以回忆起哈希全部小写意味着它是 base 32 而不是 base 58。
  • 我知道以太坊交易中的数据必须以某种合理的方式编码 IPFS 哈希,这最终让我想到了检查位偏移的想法。
  • 我知道在 base A 和 base B 之间转换的一种简单的“正确”方法是通过某种抽象整数表示作为中间步骤,而且 Javascript 支持大整数。
  • 我知道 window.ethereum.send
  • 当我得到错误,说我不能在 gas 字段中放入一个整数时,我立即知道它应该是十六进制的。

在这一点上,AI 还远远不能替代人类程序员。在这个特定的案例中,它只加快了我一点速度:我最终可以通过 Google 弄清楚,而且确实在一两个地方我确实回到了谷歌搜索。也就是说,它确实向我介绍了一些我以前没有见过的编码模式,而且它编写 base 转换器的速度比我自己的要快。对于编写发送简单交易的 Javascript 的样板操作,它做得很好。

也就是说,AI 正在快速改进,我预计它会继续改进,并随着时间的推移消除这样的错误。

附录:在写这篇文章的部分内容时,我打开了我的音乐播放列表并随机播放。巧合的是,第一首开始播放的歌曲是 Basshunter 的 Boten Anna(“Anna The Bot”)。

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

0 条评论

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