Напишите смарт-контракт с помощью ChatGPT MetaMask Infura и Truffle

Напишите смарт-контракт с помощью ChatGPT MetaMask Infura и Truffle

8 мая 2023 г.

Вы, наверное, слышали, что генеративный ИИ продемонстрировал потенциал революционных изменений в огромном количестве отраслей и рабочих мест   и web3 не исключение. Но насколько хорошо ChatGPT может создавать смарт-контракты? Может ли использование ChatGPT для кодирования смарт-контрактов сделать вас десятикратным разработчиком? В этой статье мы попробуем и посмотрим. Мы рассмотрим написание и развертывание смарт-контракта Ethereum с использованием MetaMask, Infura и Truffle... и мы запросим у ChatGPT инструкции о том, как сделать все, от кода до развертывания.

Цель состоит в том, чтобы посмотреть, сможем ли мы разбить задачу создания смарт-контракта на набор простых подсказок. В идеале ChatGPT может анализировать эти подсказки и давать на них правильные (и точные) ответы, что делает нас более быстрыми и лучшими разработчиками.

Давайте посмотрим, что мы можем сделать!

Примечание о точности

ChatGPT – это модель большого языка (LLM), которая чрезвычайно хорошо объясняет концепции блокчейна, дает советы и даже создает фрагменты кода, связанные с разработкой Web3. Однако имейте в виду, что некоторый код или ответы, которые он генерирует, могут быть частично или полностью неправильными. Доступ к ChatGPT не избавляет от необходимости знать основы разработки блокчейна. Однако даже новичок может использовать искусственный интеллект, чтобы значительно повысить производительность.

Второй момент, который следует отметить, заключается в том, что бесплатная общедоступная версия ChatGPT не очень хорошо осведомлена о событиях, обновлениях и методах, появившихся после 2021 года. Это может быть проблемой в такой области, как разработка веб-3, где все улучшается и меняется с бешеной скоростью. Однако можно получить хорошие ответы, если что-то, о чем вы спрашиваете, является фундаментальным и стабильным на протяжении многих лет (например, Truffle и Solidity).

Создайте договор условного депонирования с Truffle и ChatGPT

Чтобы увидеть, на что способен ChatGPT, мы попросим его создать смарт-контракт условного депонирования, который позволит покупателю и продавцу обмениваться деньгами, а ChatGPT назначит арбитра для разрешения споров. Давайте посмотрим, на что способен Генеративный ИИ!

Шаг 1. Установите MetaMask

Сначала нам нужно настроить кошелек. Мы будем использовать MetaMask кошелек  — «самый популярный вариант Ethereum» — и добавим тестовую сеть Sepolia. MetaMask безопасен и прост в использовании.

Вы можете загрузить расширение MetaMask для своего браузера здесь. Затем просто установите и настройте кошелек. Вам будет дана «секретная фраза» — держите ее в тайне и в безопасности! Никогда не храните его в общедоступных местах.

Примечание. Если вам нужна предыстория или введение в web3, ознакомьтесь с этой предыдущей статьей, которую я написал по изучению web3/смарт-контрактов/Solidity.

Затем нажмите на вкладку «Сеть» в правом верхнем углу. Нажмите на опцию, чтобы показать тестовые сети.

Теперь вы должны увидеть тестовую сеть Sepolia в раскрывающемся списке. Выберите это.

Шаг 2. Получите SepoliaETH

Для развертывания смарт-контракта и взаимодействия с ним вам потребуется ETH. Поскольку мы используем тестовую сеть Sepolia, нам потребуется тестовый ETH Sepolia. Не беспокойтесь — это бесплатно!

Вы можете получить бесплатный SepoliaETH из недавно выпущенного сборщика Infura здесь. Этот сборщик дает до 0,5 SepoliaETH каждый день бесплатно.

Шаг 3. Установите Node и NPM

Чтобы создать систему условного депонирования с помощью Truffle, нам потребуются Node и NPM.

Чтобы проверить, установлен ли он, запустите:

$ node -v

Вы должны увидеть версию Node.

Шаг 4. Зарегистрируйтесь в Infura

Infura – поставщик RPC. Они обеспечивают простой доступ на основе API ко всему, что нам нужно для подключения и работы с блокчейном Ethereum (и многими другими).

Зарегистрируйте бесплатную учетную запись здесь. Затем перейдите на панель инструментов и выберите "Создать новый ключ".

Выберите Web3 API в качестве сети и назовите новый ключ Escrow (хотя вы можете назвать его как хотите).

Нажмите «Создать», и Infura сгенерирует ключ API. Этот ключ необходим для доступа к конечной точке RPC. Для наших целей нам просто нужна конечная точка Sepolia.

https://sepolia.infura.io/v3/<ваш API="" ключ="">

Шаг 5. Создайте проект узла

Далее нам нужно создать наш проект Node, а затем завершить установку всеми необходимыми пакетами.

$ mkdir escrow && cd escrow
$ npm init -y

Для развертывания и тестирования нашего контракта мы будем использовать Truffle. Truffle — это набор инструментов, который дает вам все необходимое для разработки, тестирования и развертывания смарт-контрактов. Давайте установим его:

$ npm install save truffle

Вы можете создать скелет проекта с помощью Truffle, запустив:

$ npx truffle init

Чтобы убедиться, что все работает правильно:

$ npx truffle test

Теперь у нас успешно настроен Truffle. Теперь давайте установим пакет контрактов OpenZeppelin. Этот пакет даст нам доступ к еще нескольким полезным функциям, которые могут нам понадобиться.

$ npm install @openzeppelin/contracts

Мы почти закончили настройку! Далее мы должны позволить MetaMask и Truffle работать вместе. Нам нужно, чтобы Truffle мог подписывать транзакции, оплачивать газ и т. д. Для этого мы будем использовать hdwalletprovider. Установите его:

$ npm install @truffle/hdwallet-provider

И, наконец, давайте воспользуемся dotenv, чтобы защитить информацию о нашем кошельке.

$ npm install dotenv

Шаг 6. Зарегистрируйтесь в ChatGPT

Мы не будем писать код смарт-контракта условного депонирования с нуля. Вместо этого мы посмотрим, на что способен ChatGPT.

Чтобы использовать ChatGPT, зарегистрируйте бесплатную учетную запись в OpenAI.

Зарегистрировав учетную запись, посетите эту страницу. Вы должны увидеть примерно такой интерфейс:

Шаг 7. Создайте договор условного депонирования

Далее ChatGPT создаст чрезвычайно простой договор условного депонирования, который позволяет покупателю и продавцу обмениваться определенной суммой денег, а арбитр разрешает споры.

Давайте воспользуемся следующей подсказкой в ​​ChatGPT.

`Как опытный разработчик смарт-контрактов, создайте смарт-контракт, используя Solidity, который реализует условное депонирование.

Будет три стороны: покупатель, продавец и арбитр.

Конструктор установит покупателя, продавца и арбитра. Он также установит значение, которое будет равно сумме, отправленной конструктору.

Будет две функции.

Первая функция позволяет покупателю или арбитру переводить средства продавцу.

Вторая функция позволяет покупателю или арбитру вернуть сумму обратно покупателю.

Реализуйте любые другие функции, которые, по вашему мнению, могут быть уместны.`

Обратите внимание на начало подсказки «Как опытный разработчик смарт-контрактов». Этот тип «ролевых игр» с ChatGPT работает очень хорошо.

Теперь ChatGPT сгенерирует для вас уникальный ответ. И этот ответ будет меняться каждый раз. Таким образом, вы можете получить не тот результат, который показан ниже, но он должен быть чем-то похожим.

Sure, here's an example implementation of an escrow smart contract in Solidity:

Прагма прочности ^0.8.0;

контракт условного депонирования { адрес подлежащего уплате государственного покупателя; адрес платного государственного продавца; обратиться к общественному арбитру; необщественное значение; bool публикуется; bool public возмещен;

constructor(address payable _buyer, address payable _seller, address _arbiter) {
    buyer = _buyer;
    seller = _seller;
    arbiter = _arbiter;
    value = msg.value;
}

function release() public {
    require(!released, "Funds have already been released.");
    require(msg.sender == buyer || msg.sender == arbiter, "Only buyer or arbiter can release funds.");
    released = true;
    seller.transfer(value);
}

function refund() public {
    require(!refunded, "Funds have already been refunded.");
    require(msg.sender == buyer || msg.sender == arbiter, "Only buyer or arbiter can refund funds.");
    refunded = true;
    buyer.transfer(value);
}

function getBalance() public view returns (uint) {
    return address(this).balance;
}

function setArbiter(address _arbiter) public {
    require(msg.sender == arbiter, "Only arbiter can set arbiter.");
    arbiter = _arbiter;
}

function setSeller(address payable _seller) public {
    require(msg.sender == seller, "Only seller can set seller.");
    seller = _seller;
}

The `Escrow` contract has a constructor that takes three arguments: the addresses of the buyer, seller, and arbiter, and sets the `value` equal to the amount sent to the constructor.

The `release()` function allows the buyer or the arbiter to release the funds to the seller. It first checks that the funds haven't already been released, and that the caller is either the buyer or the arbiter. If both conditions are met, the `released` variable is set to `true`, and the `value` is transferred to the seller's address.

The `refund()` function allows the buyer or the arbiter to refund the funds back to the buyer. It first checks that the funds haven't already been refunded, and that the caller is either the buyer or the arbiter. If both conditions are met, the `refunded` variable is set to `true`, and the `value` is transferred back to the buyer's address.

The `getBalance()` function returns the balance of the contract.

The `setArbiter()` function allows the arbiter to set a new arbiter.

The `setSeller()` function allows the seller to set a new seller.

Note that this is a very basic implementation of an escrow contract and should not be used in production without thorough testing and auditing. Also, there may be additional features that you may want to add to suit your specific use case.

После проверки фрагмент, предоставленный ChatGPT, довольно хорош! Но у него есть ошибка — конструктор не помечен как payable, хотя мы обращаемся к msg.value и ожидаем, что ему будет отправлен эфир.

Еще раз важное замечание: Никогда не ожидайте, что ChatGPT предоставит вам код, который на 100 % правильный. Чаще всего вам придется вносить небольшие исправления, как мы сделали здесь.

Также обратите внимание, что ChatGPT использует более раннюю версию Solidity и использует практику перевода средств, которая больше не считается лучшей практикой. Для целей этого руководства мы просто оставим это как есть.

В папке контрактов вашего проекта создайте новый файл с именем Escrow.sol и добавьте код, предоставленный ChatGPT, с исправлениями.

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

contract Escrow {
    address payable public buyer;
    address payable public seller;
    address public arbiter;
    uint public value;
    bool public released;
    bool public refunded;

    constructor(address payable _buyer, address payable _seller, address _arbiter) payable {
        buyer = _buyer;
        seller = _seller;
        arbiter = _arbiter;
        value = msg.value;
    }

    function release() public {
        require(!released, "Funds have already been released.");
        require(msg.sender == buyer || msg.sender == arbiter, "Only buyer or arbiter can release funds.");
        released = true;
        seller.transfer(value);
    }

    function refund() public {
        require(!refunded, "Funds have already been refunded.");
        require(msg.sender == buyer || msg.sender == arbiter, "Only buyer or arbiter can refund funds.");
        refunded = true;
        buyer.transfer(value);
    }

    function getBalance() public view returns (uint) {
        return address(this).balance;
    }

    function setArbiter(address _arbiter) public {
        require(msg.sender == arbiter, "Only arbiter can set arbiter.");
        arbiter = _arbiter;
    }

    function setSeller(address payable _seller) public {
        require(msg.sender == seller, "Only seller can set seller.");
        seller = _seller;
    }
}

Убедитесь, что контракт компилируется правильно, запустив:

$ npx truffle compile

Шаг 8. Обновите конфигурацию Truffle

Далее мы проведем небольшую настройку без использования ChatGPT. Это стандартная настройка, и она будет зависеть от используемой среды.

Создайте новый файл .env в корневом каталоге вашего проекта и добавьте следующее:

INFURA_API_KEY = "https://sepolia.infura.io/v3/<insert API key here>"

MNEMONIC = "<insert metamask secret phrase here>"

Теперь давайте настроим конечную точку Infura. В truffle.config.js замените существующий код этой стандартной конфигурацией:

require('dotenv').config();
const HDWalletProvider = require('@truffle/hdwallet-provider');
const {INFURA_API_KEY, MNEMONIC} = process.env;

module.exports = {
    networks: {
      development: {
        host: "127.0.0.1",
        port: 8545,
        network_id: "*"
      },
      sepolia: {
        provider: () => new HDWalletProvider(MNEMONIC, INFURA_API_KEY),
        network_id: '11155111',
      }
    }
};

Шаг 9. Разверните контракт

Пришло время развертывания! Вместо того, чтобы давать вам сценарий для развертывания нашего контракта с помощью Truffle, давайте запросим у ChatGPT соответствующие инструкции.

В том же окне, которое вы использовали для запроса кода контракта условного депонирования, мы введем следующую подсказку:

Дайте мне сценарий миграции, который развертывает договор условного депонирования с помощью Truffle.

Мне нужно отправить 0,001 ETH конструктору во время развертывания. И мне нужен адрес, который развертывает контракт, чтобы быть покупателем.

Мы получаем такой ответ:

Sure, here's an example migration script that deploys the `Escrow` contract and sends 0.001 ETH to the constructor during deployment. In this script, the address that deploys the contract will be set as the buyer.

1. Create a new JavaScript file named `2_deploy_escrow.js` (the number at the beginning indicates the order in which the migrations will be executed).
2. Copy the following code into `2_deploy_escrow.js`:

const Escrow = артефакты.require("Депонирование");

module.exports = асинхронная функция (развертывание, сеть, учетные записи) { постоянный покупатель = аккаунты[0]; // устанавливаем покупателя как адрес, который разворачивает контракт const продавец = "0x222222222222222222222222222222222222222"; // заменить на адрес продавца const arbiter = "0x3333333333333333333333333333333333333333"; // заменить на адрес арбитра константное значение = web3.utils.toWei('0.001', 'эфир'); // изменить на значение, которое вы хотите отправить

await deployer.deploy(Депонирование, продавец, арбитр, {от: покупатель, значение: значение}); };

3. Replace the seller and arbiter addresses with the actual Ethereum addresses of the parties involved in the escrow transaction.
4. Save the file.
5. Make sure you have a network configured in your `truffle-config.js` file. If you want to deploy to a testnet, you'll need to configure your Truffle project to use the network you want to deploy to.
6. Run `truffle migrate --network <network-name>` to deploy the contract to the specified network. Replace `<network-name>` with the name of the network you want to deploy to, e.g. `ropsten` for the Ropsten testnet. This will deploy the contract and send 0.001 ETH to the constructor with the address that deploys the contract set as the buyer.

Опять же, инструкции, предоставленные ChatGPT, в основном верны. Он неправильно называет имя (мы хотим, чтобы оно имело префикс 1_, а не 2_) и допускает небольшую ошибку при установке аргументов функции deploy.

Давайте создадим новый файл 1_deploy_contract.js в папке migrations. Добавьте следующий слегка измененный код.

const Escrow = artifacts.require("Escrow");

module.exports = async function (deployer, network, accounts) {
    const buyer = accounts[0]; // set the buyer as the address that deploys the contract
    const seller = accounts[1]; // replace with seller address
    const arbiter = accounts[2]; // replace with arbiter address
    const value = web3.utils.toWei('0.001', 'ether'); // change to the value you want to send

    await deployer.deploy(Escrow, seller, arbiter, { from: buyer, value: value });
};

И, наконец, давайте развернем наш контракт:

$ truffle migrate --network sepolia

Вы должны увидеть что-то похожее на это:

Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.


Migrations dry-run (simulation)
===============================
> Network name:    'sepolia-fork'
> Network id:      11155111
> Block gas limit: 30000000 (0x1c9c380)


1_deploy_contract.js
====================

   Deploying 'Escrow'
   ------------------
   > block number:        3400252
   > block timestamp:     1682974543
   > account:             0xc361Fc33b99F88612257ac8cC2d852A5CEe0E217
   > balance:             0.506876109994053108
   > gas used:            849556 (0xcf694)
   > gas price:           2.500000007 gwei
   > value sent:          0.001 ETH
   > total cost:          0.003123890005946892 ETH

   -------------------------------------
   > Total cost:     0.003123890005946892 ETH

Summary
=======
> Total deployments:   1
> Final cost:          0.003123890005946892 ETH




Starting migrations...
======================
> Network name:    'sepolia'
> Network id:      11155111
> Block gas limit: 30000000 (0x1c9c380)


1_deploy_contract.js
====================

   Deploying 'Escrow'
   ------------------
   > transaction hash:    0x7a7804d92a6b6e805991eeb8249d79a2b8c5da43cffe633a31f987e9fe596654
   > Blocks: 1            Seconds: 33
   > contract address:    0x64ccE52898F5d61380D2Ec8C02F2EF16F28436de
   > block number:        3400258
   > block timestamp:     1682974584
   > account:             0xc361Fc33b99F88612257ac8cC2d852A5CEe0E217
   > balance:             0.506876109994053108
   > gas used:            849556 (0xcf694)
   > gas price:           2.500000007 gwei
   > value sent:          0.001 ETH
   > total cost:          0.003123890005946892 ETH

   > Saving artifacts
   -------------------------------------
   > Total cost:     0.003123890005946892 ETH

Summary
=======
> Total deployments:   1
> Final cost:          0.003123890005946892 ETH

Чтобы проверить развертывание, вы можете найти адрес своего контракта на Sepolia Etherscan:

n Поздравляем! Вы развернули свой контракт. И вы сделали это, используя ChatGPT, чтобы сгенерировать более 95 % вашего кода.

Советы и рекомендации

Вот несколько советов и рекомендаций по использованию ChatGPT при написании кода:

* ChatGPT имеет ограниченные знания, и его база знаний заканчивается в сентябре 2021 года. Таким образом, некоторые из этих лучших практик и последних разработок в области смарт-контрактов будут отсутствовать в его знаниях. * Существует несколько версий ChatGPT. GPT-4, как правило, дает лучшие ответы, но это платная услуга. GPT-3.5 (которую мы использовали здесь) бесплатна и работает довольно хорошо. * Сделайте ваши вопросы как можно более конкретными. * Не останавливайтесь на написании кода. ChatGTP может отлаживать ваш код, проверять его, документировать, делать красивым, анализировать, находить уязвимости и т. д.

Заключение

ChatGPT был чрезвычайно полезным соразработчиком. Но это было не идеально. Я бы не стал использовать его для создания немодифицированного кода, который я отправил в основную сеть, особенно если бы я был новым разработчиком. Но как партнер по кодированию и как отправная точка это было полезно. Это сэкономило мне много времени и создало удивительно хороший код. Думаю, в руках опытного разработчика производительность может увеличиться во много раз. Я планирую активно использовать его в будущих проектах вместе с MetaMask, Infura и Truffle.

Хорошего дня!


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE