thử nghiệm mã hóa chatbot GPT nhanh

Rate this post


2022 Th12 06
Xem tất cả bài viết
Cập nhật blog của tôi: thử nghiệm mã hóa chatbot GPT nhanh

Chatbot GPT đã trở nên thịnh hành trong vài ngày qua. Cùng với nhiều trường hợp sử dụng quan trọng như viết lời bài háthoạt động như một bạn học ngoại ngữ và đưa ra những lập luận nghe có vẻ thuyết phục cho ý kiến ​​​​chính trị độc đoánmột trong những điều khiến nhiều người hào hứng là khả năng sử dụng chatbot để viết mã.

Trong nhiều trường hợp, nó có thể thành công và viết một số mã khá tốt, đặc biệt là cho các tác vụ thông thường. Tuy nhiên, trong những trường hợp bao phủ mặt đất ít bị giẫm đạp hơn, nó có thể thất bại: chứng kiến ​​​​nỗ lực bị phá vỡ vui nhộn của nó để viết trình xác minh PLONK:

(Trong trường hợp bạn muốn biết cách thực hiện đúng cách, đây là trình xác minh PLONK do tôi viết)

Nhưng những công cụ này thực sự hoạt động tốt như thế nào trong trường hợp trung bình? Tôi đã quyết định dùng thử chatbot GPT3 và xem liệu tôi có thể sử dụng nó để giải quyết một vấn đề rất liên quan đến cá nhân tôi hay không: thay đổi hàm băm IPFS đã đăng ký trong tài khoản của tôi. vitalik.eth Bản ghi ENS, để làm cho bài viết mới mà tôi vừa phát hành trên blog của mình có thể xem được thông qua ENS.

Quá trình cập nhật chế độ xem ENS của blog của tôi thường bao gồm hai bước: thứ nhất, xuất bản nội dung đã cập nhật lên IPFS và thứ hai, cập nhật bản ghi ENS của tôi để chứa hàm băm IPFS của nội dung mới. Fleek đã tự động hóa phần đầu tiên của việc này cho tôi trong một thời gian dài: Tôi chỉ cần đẩy nội dung lên Github và Fleek sẽ tự động tải phiên bản mới lên IPFS. Tôi đã được thông báo rằng tôi có thể thay đổi cài đặt để cung cấp cho Fleek quyền chỉnh sửa ENS của mình, nhưng ở đây tôi muốn hoàn toàn “tự chủ” và không tin tưởng bên thứ ba, vì vậy tôi đã không làm điều này. Thay vào đó, cho đến nay, tôi phải truy cập GUI tại app.ens.domains, nhấp một vài lần, đợi một vài màn hình tải trôi qua và cuối cùng nhấp vào “THÊM / CHỈNH SỬA BẢN GHI”, thay đổi CONTENT băm và nhấp vào “Xác nhận”. Đây là một quá trình rườm rà, và vì vậy hôm nay tôi cuối cùng đã nghĩ rằng mình sẽ viết một kịch bản bằng javascript để tự động hóa tất cả những điều này thành một đoạn Javascript duy nhất mà tôi có thể chỉ cần sao chép-dán vào bảng điều khiển trình duyệt của mình trong tương lai.

Nhiệm vụ rất đơn giản: gửi một giao dịch Ethereum đến đúng địa chỉ với đúng calldata để cập nhật bản ghi hàm băm nội dung trong hợp đồng ENS để bằng với hàm băm IPFS mà Fleek cung cấp cho tôi. Hôm qua, tôi đã làm tất cả việc này theo cách thủ công (hai lần, một lần để xuất bản và một lần nữa để thêm một số chỉnh sửa) và hàm băm IPFS mà tôi nhận được là:

bafybeifvvseiarzdfoqadphxtfu5yjfgj3cr6x344qce4s4f7wqyf3zv4e

bafybeieg6fhbjlhkzhbyfnmyid3ko5ogxp3mykdarsfyw66lmq6lq5z73m

Nếu bạn nhấp qua bài viết hàng đầu trong mỗi bài viết, bạn sẽ thấy hai phiên bản khác nhau.

Định dạng băm này thường được gọi là “bafyhash”, bởi vì tất cả các giá trị băm đều bắt đầu bằng “bafy”. Nhưng có một vấn đề: định dạng của hàm băm được lưu trong Ethereum là không phải một bafyhash. Đây là calldata của giao dịch đã thực hiện một trong các hoạt động cập nhật:

Vâng, tôi đã kiểm tra, đó là không phải ASCII thập lục phân.

Tôi biết rằng hàm băm nội dung IPFS là hai hàng dữ liệu cuối cùng. Làm sao tôi biết? Chà, tôi đã kiểm tra hai giao dịch khác nhau mà tôi đã gửi cho hai bản cập nhật của mình và tôi thấy rằng hàng trên cùng giống nhau và hai hàng dưới cùng thì khác nhau. Đủ tốt.

Vậy tôi phải làm gì để chuyển đổi từ bafyhash thành hàm băm nội dung IPFS nhị phân? À để em thử hỏi chatbot GPT3 xem sao!

Không!!!!!!!! Nhiều vấn đề. Đầu tiên, hai điều đó là lỗi của tôi:

  1. Tôi quên đề cập đến điều này, nhưng tôi muốn Javascript chứ không phải python.
  2. Nó sử dụng các phụ thuộc bên ngoài. Tôi muốn bản sao javascript của mình có thể dán vào bảng điều khiển, vì vậy tôi không muốn bất kỳ thư viện nào.

Tuy nhiên, những điều này là do tôi chỉ định và trong hướng dẫn tiếp theo của tôi với chatbot, tôi sẽ làm. Nhưng bây giờ chúng ta có được những điều mà lỗi của nó:

  1. Bafyhash là cơ sở 32, không phải cơ sở 58. Có một định dạng cơ sở 58 cho hàm băm IPFS, nhưng chúng được gọi là “băm QM”, không phải “bafyhash”.
  2. Theo “nhị phân”, tôi không muốn các số nguyên và số 0, tôi muốn định dạng nhị phân bình thường, một byte hoặc bytearray.

Điều đó nói rằng, ở phần này của câu chuyện, tôi thậm chí không nhận ra rằng bafyhash là cơ sở 32. Tôi đã khắc phục hai vấn đề mà lỗi của tôi đầu tiên:

BAAAAAAAAAAAAAAD, huấn luyện viên AI ngượng ngùng nói! Các atob chức năng dành cho cơ sở 64, không phải cơ sở 58.

OK, chúng ta hãy tiếp tục đi. Vài vòng sau…

Ban đầu, thật khó để biết chuyện gì đang xảy ra, nhưng nó cực kỳ sai lầm. Về cơ bản, thay vì chuyển đổi toàn bộ chuỗi từ cơ số 58 sang cơ số 16, nó đang chuyển đổi từng chữ số riêng lẻ đến căn cứ 16. Không phải điều tôi muốn làm!

Đoán tôi sẽ phải nói cho nó biết nên sử dụng chiến lược nào:

Tốt hơn! Tôi sớm bắt đầu nhận ra rằng tôi không cần cơ sở 58, tôi cần cơ sở 32 và hơn nữa tôi cần chữ thường phiên bản cơ sở 32. Tôi cũng muốn mã được bọc trong một hàm. Đối với các bước đơn giản này, nó sẽ hợp tác hơn nhiều:

Tại thời điểm này, tôi thực sự thử chuyển các bafyhash mà tôi có vào chức năng này và tôi nhận được các kết quả đầu ra khác nhau đến khó nhận ra. Có vẻ như tôi không thể cho rằng đây là cơ sở chung 32, và tôi phải tìm hiểu chi tiết. Hmm, tôi có thể hỏi chatbot GPT3 không?

Được rồi, điều này không hữu ích. Hãy để tôi cố gắng cụ thể hơn.

Đây là một …. phỏng đoán thú vị, nhưng nó hoàn toàn sai. Sau thời điểm này, tôi từ bỏ GPT3 một thời gian và tiếp tục xem hex được tạo và hex thực tế trong python cho đến khi tôi tìm thấy điểm tương đồng. Cuối cùng, tôi hiểu ra: Tôi thực sự chuyển đổi cả hai hệ thập lục phân thành nhị phân theo nghĩa đen và tìm kiếm từ một chuỗi con nhị phân của chuỗi này sang chuỗi khác. Tôi phát hiện ra rằng có độ lệch 2 bit.

Tôi chỉ chỉnh sửa mã theo cách thủ công, bù phần bù bằng cách chia bigint cho 4:

Bởi vì tôi đã biết phải làm gì, tôi cũng chỉ viết mã phần tạo ra toàn bộ calldata:

Dù sao đi nữa, sau đó tôi chuyển sang nhiệm vụ tiếp theo: phần Javascript thực sự gửi một giao dịch. Tôi quay lại GPT3.

KHÔNGOOOO! TÔI ĐÃ NÓI KHÔNG CÓ THƯ VIỆN!!!!1!1!

Tôi nói với nó những gì để sử dụng trực tiếp:

Điều này là thành công hơn. Hai lỗi mặc dù:

  1. Một from địa chỉ thực sự là bắt buộc.
  2. Bạn không thể dính một số nguyên vào gas trường, bạn cần một giá trị hex.

Ngoài ra, đăng EIP-1559, thực sự không có ích gì nhiều trong việc mã hóa cứng một gasPrice. Từ đây, tôi tự làm phần việc còn lại.


function bafyToHex(bafyString) {
  // Create a lookup table for the base32 alphabet
  var alphabet="abcdefghijklmnopqrstuvwxyz234567";
  var base = alphabet.length;
  var lookupTable = {};
  alphabet.split('').forEach(function(char, i) {
    lookupTable[char] = i;
  });

  // Decode the base32-encoded string into a big integer
  var bigInt = bafyString.split('').reduce(function(acc, curr) {
    return acc * BigInt(base) + BigInt(lookupTable[curr]);
  }, BigInt(0)) / BigInt(4);

  // Convert the big integer into a hexadecimal string
  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];
  // Set the "to" address for the transaction
  const to = '0x4976fb03c32e5b8cfe2b6ccb31c09ba78ebaba41';

  // Set the transaction options
  const options = {
    from: addr,
    to: to,
    data: calldata,
    gas: "0x040000"
  };
  console.log(options);

  // Send the transaction
  window.ethereum.send('eth_sendTransaction', [options], function(error, result) {
    if (error) {
      console.error(error);
    } else {
      console.log(result);
    }
  });
}

Tôi hỏi GPT-3 một số câu hỏi nhỏ: cách khai báo async chức năng và từ khóa nào sẽ sử dụng trong tìm kiếm Twitter để chỉ tìm kiếm các tweet có chứa hình ảnh (cần thiết để viết bài đăng này). Nó trả lời cả hai hoàn hảo: làm async function functionName để khai báo một chức năng không đồng bộ và sử dụng filter:images để lọc các tweet có chứa hình ảnh.

kết luận

Chatbot GPT-3 hữu ích như một công cụ hỗ trợ lập trình, nhưng nó cũng mắc nhiều lỗi. Cuối cùng, tôi đã có thể nhanh chóng vượt qua những sai lầm của nó vì tôi có nhiều kiến ​​thức về miền:

  • Tôi biết rằng các trình duyệt khó có thể tích hợp sẵn cho cơ sở 58, đây là một định dạng tương đối thích hợp chủ yếu được sử dụng trong thế giới tiền điện tử và vì vậy tôi ngay lập tức nghi ngờ về nỗ lực đề xuất của nó atob
  • Cuối cùng tôi có thể nhớ lại rằng hàm băm là chữ thường có nghĩa là nó là cơ sở 32 chứ không phải cơ sở 58
  • Tôi biết rằng dữ liệu trong giao dịch Ethereum phải mã hóa hàm băm IPFS trong một số cách hợp lý, khiến tôi cuối cùng nảy ra ý tưởng kiểm tra độ lệch bit
  • Tôi biết rằng một cách “chính xác” đơn giản để chuyển đổi giữa cơ sở A và cơ sở B là trải qua một số biểu diễn số nguyên trừu tượng dưới dạng ở giữa và Javascript đó hỗ trợ các số nguyên lớn.
  • tôi biết về window.ethereum.send
  • Khi tôi gặp lỗi không được phép nhập số nguyên vào gas trường, tôi biết ngay rằng nó được coi là hex.

Tại thời điểm này, AI còn khá xa mới có thể thay thế các lập trình viên con người. Trong trường hợp cụ thể này, nó chỉ giúp tôi tăng tốc một chút: cuối cùng tôi có thể tìm ra mọi thứ với Google và thực sự ở một hoặc hai điểm tôi đã làm quay lại googling. Điều đó nói rằng, nó đã giới thiệu cho tôi một số mẫu mã hóa mà tôi chưa từng thấy trước đây và nó đã viết trình chuyển đổi cơ sở nhanh hơn so với khả năng của riêng tôi. Đối với thao tác viết sẵn Javascript để gửi một giao dịch đơn giản, nó hoạt động khá tốt.

Điều đó nói rằng, AI đang cải thiện nhanh chóng và tôi hy vọng nó sẽ tiếp tục cải thiện hơn nữa và khắc phục những lỗi như thế này theo thời gian.

Phụ lục: trong khi viết phần liên quan đến sao chép-dán nhiều hơn là suy nghĩ của bài đăng này, tôi đã bật danh sách phát nhạc của mình ở chế độ xáo trộn. Tình cờ, bài hát đầu tiên bắt đầu phát lại là Boten Anna của Basshunter (“Anna The Bot”).

Thanh Thuy

Leave a Reply

Your email address will not be published. Required fields are marked *