трюфель-контракт: невозможно протестировать метод до реального использования эфира

Я использую трюфельный контракт для соединения между интерфейсом и смарт-контрактом. В настоящее время я могу вызывать метод смарт-контракта и успешно потреблять эфир.

const result = await instance.adoptCreeptomas(
aquaQuantity,
firaQuantity,
aetherQuantity,
gaiaQuantity,
referrer,
{ from: accountAddress, value: ether(sendingEther) }

);

Но перед этим я хочу сначала протестировать метод. Поэтому я перехожу к этому методу:

 const data = await instance.adoptCreeptomas.call(
    aquaQuantity,
    firaQuantity,
    aetherQuantity,
    gaiaQuantity,
    referrer,
    { from: accountAddress, value: ether(sendingEther) }
  );

Но при вызове этого я встречаю следующее исключение:

error.js: 38 Uncaught (в обещании) Ошибка: неверный ответ JSON RPC: {"id": 6, "jsonrpc": "2.0", "error": {"code": -32603}}

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

Спасибо

Ответы (1)

Пожалуйста, ознакомьтесь с разницей между transactionи call.

Синтаксис .call()в truffle-contract явно предназначен для вызова , а синтаксис прямого вызова с именем метода :

Мы вызвали функцию sendCoin абстракции напрямую. Это приведет к транзакции по умолчанию (т. е. к записи данных) вместо вызова.

Я могу сказать по сигнатуре вашего метода, что adoptCreeptomasсохраняются некоторые изменения в сети. Так что просто избавься .callи посмотри, что произойдет.

да. adoptCreeptomasсохраняет некоторые данные в блокчейне (а также потребляет эфир). Вот почему я думаю, что мы должны сначала «протестировать» метод. Я основывался на этом: ethereum.stackexchange.com/questions/765/… (рекомендация сначала позвонить, а затем отправить транзакцию)
Значит, трюфельный контракт не поддерживает этот способ?
@hqt Хорошо, я думаю, что тогда я неправильно понял ваш вопрос. Не совсем понял, что вы имели в виду под «сначала метод тестирования» в первый раз.
Если вы работаете с интерфейсом, я не уверен, что вам действительно нужно тестировать такие вещи, потому что обычный провайдер, такой как метамаск, справится с этим. Во всяком случае, я изучаю код трюфельного контракта , и похоже, что он будет поддерживать, если web3.eth.contractподдерживает.
Спасибо. Я протестировал. Я использую web3, встроенный в MetaMask. Как я проверял, web3.eth.contractсуществует. Но я не знаю, как использовать этот метод. Спасибо.
Есть ли у нас ссылка на то, что метамаска сделает это для разработчика? (тестирование перед отправкой транзакции). Спасибо.
Хм.. Я хотел бы отозвать этот комментарий о метамаске, хотя он оценивает газ. Я думаю, может быть, ошибка связана с ганашем. Можете ли вы попробовать это с testrpc?