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

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

32 голоса | спросил eth 10 AMpSun, 10 Apr 2016 06:12:48 +030012Sunday 2016, 06:12:48

8 ответов


36

Один из способов - использовать Remix , основанный на браузере компилятор 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 .

Вот скриншот :

 введите описание изображения здесь>> </a> </p></body></html>

ответил eth 10 AMpSun, 10 Apr 2016 06:12:48 +030012Sunday 2016, 06:12:48
14

Я лично использую Dapple для написания тестов модуляции Solidity. Преимущество этого заключается в том, что не требуется слой фреймворка тестирования Javascript, поэтому вы можете полностью оставаться в Solidity. Плюс я могу использовать его для проверки контрактов, в которых используются импорт, что я не уверен в возможностях браузера на основе браузера Chriseth.

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

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

ответил ryepdx 10 PMpSun, 10 Apr 2016 19:20:02 +030020Sunday 2016, 19:20:02
11

Существует несколько способов тестирования контрактов Solidity. Самое легкое, по крайней мере, на мой взгляд, тестирование Blackbox с помощью Трюфеля . Контракты имеют тенденцию быть относительно небольшими и автономными, поэтому тестирование черных ящиков здесь представляется уместным.

Трюфель позволяет писать модульные тесты в Javascript, используя Пудинг , расширение web3, Моча и 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);
  });
});
ответил Nick Johnson 10 PMpSun, 10 Apr 2016 17:09:53 +030009Sunday 2016, 17:09:53
9

Другой вариант - использование реализации 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"));
ответил Anton Nashatyrev 11 AMpMon, 11 Apr 2016 01:34:18 +030034Monday 2016, 01:34:18
6

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

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

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

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

 EthFiddle.com Demo

ответил James Duffy 8 32017vEurope/Moscow11bEurope/MoscowWed, 08 Nov 2017 08:55:03 +0300 2017, 08:55:03
4

Если вас интересует только 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. Событие передачи может иметь такой тест:

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);

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

ответил Juan Blanco 12 PMpTue, 12 Apr 2016 19:43:20 +030043Tuesday 2016, 19:43:20
3

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

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

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

ответил David Ammouial 1 J0000006Europe/Moscow 2017, 07:29:04
2

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

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

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

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

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

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

ответил Thomas Clowes 14 PM00000020000004631 2017, 14:51:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132