Как быстро протестировать функцию Solidity?

На этом Ethereum Stack Exchange и других сайтах есть фрагменты и функции кода Solidity. Какие есть способы быстро протестировать их, возможно, немного отладить и поиграть?

Ответы (8)

Один из способов — использовать Remix , браузерный компилятор Solidity в реальном времени и среду выполнения Solidity (ранее называвшуюся browser-solidity).

  1. Вставьте код в Remix .
  2. Оберните функцию внутри, contractесли это необходимо. (Пример: contract C { ... }.)
  3. Нажмите Contractвкладку, а затем Create, чтобы создать экземпляр контракта.
  4. Введите желаемый ввод рядом с функцией.
    • Для bytes1... bytes32используйте шестнадцатеричную строку в кавычках, например "0xabcdef"для bytes3.
    • Для bytesиспользуйте массив шестнадцатеричных строк , например: ["0xab", "0xcd", "0xef"].
    • Убедитесь strings, что они указаны в кавычках.
    • Для больших чисел убедитесь, что они также указаны в кавычках.
    • Для массива используйте [], пример:["hello", 42, "0xabcd"]
  5. Щелкните функцию, чтобы получить результат. Результат кодируется ABI .

Вот пример скриншота:

введите описание изображения здесь

Есть ли способ "console.log"?
Ближайшим эквивалентом является использование такого события , как event print(uint x), тогда в вашей функции вы можете print(255), и вы увидите, что оно отображается в браузере Solidity.
Если вы хотите сделать это в Remix IDE, встроенной в клиент Mist, по умолчанию кнопка «Создать» предложит вам опубликовать транзакцию. Чтобы просто запустить его, как в этом ответе, переключите раскрывающийся список «Среда» на «Javascript VM».

Лично я использую Dapple для написания модульных тестов Solidity. Его преимущество заключается в том, что он не требует слоя инфраструктуры тестирования Javascript, поэтому вы можете полностью оставаться в Solidity. Кроме того, я могу использовать его для тестирования контрактов, использующих импорт, что, я не уверен, возможно в Solidity на основе браузера chriseth.

Изменить: принятый ответ, безусловно, лучший вариант для тех, кто просто хочет почувствовать вкус языка. Я по-прежнему считаю, что Dapple — лучший вариант для таких людей, как я, которым нравится оставаться в командной строке и которые, возможно, захотят выполнить быстрый тест, чтобы пролить свет на некоторые темные уголки языка. (Вы можете легко недооценить мое предпочтение командной строки. Это немного нелепо и распространяется на создание коротких сценариев, чтобы я мог проверять веб-сайты, не переключаясь на браузер.)

Тем не менее, после ответа на этот вопрос я нашел инструмент под названием Solidity REPL , который делает именно то, что следует из названия: дает вам Solidity REPL в командной строке. Для возни с языком и выполнения быстрых проверок работоспособности, как можно было бы с чем-то вроде Python, я рекомендую этот инструмент вместо Dapple.

ИМХО Это позволяет проводить реальное модульное тестирование, а не интеграционное тестирование с вашим клиентом rpc.
Если вы делаете в основном код солидности-солидности, это хороший подход. Если вы пишете приложение с большим количеством взаимодействий с автономными компонентами, я бы посоветовал другой ответ, используя трюфель/пудинг (или создайте свой собственный)
ОП не спрашивает unit testing, почему вы не используете Truffle или Embark?
Truffle и Embark очень удобны для создания децентрализованных приложений на основе браузера и отлично подходят для интеграционных тестов. Но также приятно иметь возможность изолировать то, что вы тестируете, и писать модульные тесты. Большая часть моей работы связана исключительно с Solidity, а другие члены команды занимаются интеграцией и пользовательскими компонентами. Учитывая мой вариант использования, Dapple идеален. Наверное, и не помешает, что я помог сделать это!

Есть несколько способов тестирования контрактов Solidity. Самое простое, по крайней мере, на мой взгляд, — тестирование черного ящика с помощью Truffle . Контракты, как правило, относительно небольшие и автономные, поэтому тестирование методом черного ящика кажется здесь уместным.

Truffle позволяет писать модульные тесты на Javascript, используя Pudding , расширение web3, Mocha и Chai . Типичный тест выглядит так:

contract('MetaCoin', function(accounts) {
  it("should put 10000 MetaCoin in the first account", function(done) {
    // Get a reference to the deployed MetaCoin contract, as a JS object.
    var meta = MetaCoin.deployed();

    // Get the MetaCoin balance of the first account, and assert that it's 10000.
    meta.getBalance.call(accounts[0]).then(function(balance) {
      assert.equal(balance.valueOf(), 10000, "10000 wasn't in the first account");
    }).then(done).catch(done);
  });
});
Я разветвился и создал свою собственную среду, но я согласен. Напишите автоматические регрессионные тесты для контрактов Solidity. Сэкономил мне огромное количество головной боли на ~ 1000 строк Solidity (пока)

Если вы просто ищете действительно быстрый способ протестировать код и поиграть в браузере, вы можете использовать https://ethfiddle.com/

(Полное раскрытие: я являюсь частью команды, которая его построила.)

Я обнаружил, что пользовательский интерфейс Remix во многих случаях сложен и излишен, тогда как большую часть времени все, что я хотел сделать, это 1) быстро запустить и протестировать код контракта, который я нашел в Интернете, и 2) поделиться кодом контракта с другими людьми без им нужно скопировать/вставить его куда-нибудь еще, чтобы запустить. Поэтому мы создали альтернативу, ориентированную в первую очередь на простоту и совместное использование.

Вот краткая демонстрация:

Демонстрация EthFiddle.com

это именно то, что я ищу. Спасибо чувак..
Это очень лаконично, но не удалось отладить контракт.
это потрясающе! к сожалению, он больше не работает - он застрял в "компиляции" и не предлагает функции для вызова.

Другой вариант — использование реализации EthereumJ. Недавно мы выпустили версию 1.2.0 , и в ней есть приятная функция специально для таких случаев. Вы можете проверить образец здесь

StandaloneBlockchain bc = new StandaloneBlockchain();

SolidityContract contract = bc.submitNewContract(
       "contract A { uint a; ... }"
);

contract.callFunction("funcName", "arg1", 2, new byte[] {1,2,3}, "arg4");
bc.createBlock()

System.out.println("Result: " + contract.callConstFunction("getResultFunc"));
Хороший. Надо проверить это.

Самый простой способ быстро протестировать, немного отладить и поиграться — это, ИМХО, solidity-repl , так как его цель — именно быстрое тестирование кода Solidity.

Я считаю, что этот проект лучше всего отвечает на то, о чем просит текст вашего вопроса, и, честно говоря, я чувствую предвзятость, когда вы написали вопрос с учетом своего будущего ответа, чтобы вы его приняли. По крайней мере, remixтег в самом вопросе является довольно убедительным индикатором. :)

Так что, хотя ваши критерии «ожидаемого ответа» на ваш собственный вопрос субъективны и не могут подвергаться сомнению, я все же оставляю Solidity-Repl здесь, потому что другие люди, вероятно, придут сюда с похожим вопросом и найдут этот инструмент лучше подходит.

Спасибо (проголосовал). Этот вопрос и ответ был написан после того, как несколько ответов на другие вопросы заставили меня понять, что объяснение того, как Remix можно использовать для ответа на множество вопросов, повторялось, и ему не хватало более четкой документации :)

Если вас интересует только Solidity, Dapple, как уже было сказано, предоставляет лучшую основу для модульного тестирования.

Но если вы разрабатываете в .Net/Nethereum, вы можете выполнять интеграционные тесты в соответствии с вашим контрактом на солидность:

var contract = web3.Eth.GetContract(abi, receipt.ContractAddress); var test = contract.GetFunction("test4"); Assert.True(await test.CallAsync<bool(BigInteger.Parse("3457987492347979798742")));

Вам нужно будет уже развернуть свой контракт в тестовой сети. В приведенном выше примере мы уже знаем ABI (хранящийся в строке) и используем адрес контракта квитанции для инициализации контракта.

Также важно протестировать события вашего контракта, например, на ERC20 Transfer событие может иметь такой тест:

var allTransfersFilter = await transfersEvent.CreateFilterAsync(new BlockParameter(3000)); var eventLogsAll = await transfersEvent.GetAllChanges<Transfer>(allTransfersFilter);

Assert.Equal(1, eventLogsAll.Count); var transferLog = eventLogsAll.First(); Assert.Equal(transferLog.Log.TransactionIndex.HexValue, transferReceipt.TransactionIndex.HexValue); Assert.Equal(transferLog.Log.BlockNumber.HexValue, transferReceipt.BlockNumber.HexValue); Assert.Equal(transferLog.Event.AddressTo, newAddress); Assert.Equal(transferLog.Event.Value, (ulong)1000);

Выше мы извлекаем событие, проверяем совпадение транзакций и совпадение определенных атрибутов события, таких как адрес, на который отправляется сумма, и значение.

Во- первых, я бы посоветовал вам написать свой код в среде IDE, такой как SublimeText . Затем я бы использовал Remix , чтобы убедиться, что ваш синтаксис правильный и что он скомпилируется.

Люди упоминали Truffle , но, на мой взгляд, это просто меняет кривую обучения. Truffle использует testrpc за кулисами, которые вы можете настроить и использовать независимо. Я бы посоветовал вам потратить время, чтобы изучить все части головоломки.

При этом testrpc только имитирует функциональность. Я всегда советую вам тестировать ваши контракты в «реальной» среде. Тестовая сеть Ropsten — лучшая тестовая сеть для этого.

EthTools.com (моя компания создала его) имеет инструмент для отправки контрактов в цепочку и последующего взаимодействия с ними. Вы можете убедиться, что ваша функциональность работает, взаимодействуя с контрактом и убедившись, что вы получаете правильные ответы. Вы можете сделать это в тестовой сети ropsten или в основной сети (на ваше усмотрение).

Взаимодействие с контрактом

Вот несколько видео: