Использование миграции трюфелей для заполнения большого количества данных внутри смарт-контракта?

Я разрабатываю смарт-контракт (совместимый с ERC-721), который необходимо заполнить большим количеством различных данных.

Приблизительно 300 токенов ERC721 должны быть выпущены внутри контракта в момент развертывания.

У меня есть структура данных json, в которой подробно описаны все необходимые исходные токены и их атрибуты данных, которые должны быть созданы внутри контракта.

В настоящее время я создал новый сценарий миграции, например 4_populated_tokens.js, который запускает трюфель при развертывании в каждой сети.

Это всегда удается локально с ganache, но при работе с любой тестовой сетью I это всегда, кажется, в конечном итоге терпит неудачу, иногда с 80% или более содержимого, обычно по следующей причине:

Error encountered, bailing. Network state unknown. Review successful transactions manually.

Я попытался настроить миграцию с некоторым успехом, выполнив следующие действия:

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

В этом есть некоторый успех.

Мой вопрос :

  • Правильно ли использовать трюфельную миграцию для заполнения таких больших объемов данных, если нет, то какое решение является предпочтительным?

  • Есть ли у других людей такая же проблема с использованием truffle для запуска больших объемов данных в рамках миграции?

Вся помощь приветствуется, спасибо.

truffle — это инструмент общего назначения, поэтому, если есть смысл делать это в Ethereum в целом, имеет смысл делать это и с truffle. «Состояние сети неизвестно» выглядит как проблема с подключением. Как вы подключаетесь к сети? Через что-то вроде Infura или через свой собственный узел?
Я использую Infra и HDWalletProvider
Тогда я предполагаю, что вы, возможно, отправляете транзакции слишком быстро, и срабатывает какой-то механизм квот на стороне infura. Попробуйте добавить сон между отправками и посмотрите, как это поможет.

Ответы (1)

Вы можете использовать truffle execдля дополнительной настройки после развертывания.

Часто вам может понадобиться запустить внешние скрипты, взаимодействующие с вашими контрактами. Truffle предоставляет простой способ сделать это, загружая ваши контракты на основе желаемой сети и автоматически подключаясь к вашему клиенту Ethereum в соответствии с конфигурацией вашего проекта.

Источник

Ниже приведен пример из сообщения в блоге Truffle :

1 - Создайте файл с именем sampletx.jsи сохраните его в корне вашего проекта (в том же каталоге, что и ваш truffle.jsфайл). Затем заполните его этим кодом:

var SimpleStorage = artifacts.require("SimpleStorage");

module.exports = function(done) {
    console.log("Getting deployed version of SimpleStorage...")
    SimpleStorage.deployed().then(function(instance) {
        console.log("Setting value to 65...");
        return instance.set(65, {
            privateFor: ["ROAZBWtSacxXQrOe3FGAqJDyJjFePR5ce4TSIzmJ0Bc="]
        });
    }).then(function(result) {
        console.log("Transaction:", result.tx);
        console.log("Finished!");
        done();
    }).catch(function(e) {
        console.log(e);
        done();
    });
};

Этот код делает две вещи: во-первых, он запрашивает у Truffle абстракцию нашего контракта для контракта SimpleStorage. Затем он находит развернутый контракт и устанавливает значение, управляемое SimpleStorage , равным , используя функцию 65контракта .set()

Параметр privateForне имеет отношения к вам здесь, и вы можете его опустить. Я копирую и вставляю его из источника.

2 - Запустите этот код, используя truffle exec:

$ truffle exec sampletx.js

Ваш вывод должен выглядеть примерно так (но идентификатор вашей транзакции будет другим):

Using network 'development'.

Getting deployed version of SimpleStorage...
Setting value to 65...
Transaction: 0x0a7a661e657f5a706b0c39b4f197038ef0c3e77abc9970a623327c6f48ca9aff
Finished!

Вот сообщение в блоге от создателя Truffle о truffle exec.

Надеюсь это поможет.