Как узнать, какую версию Solidity использовать при развертывании контрактов?

Я заметил в различных руководствах по смарт-контрактам, что разные версии Solidity объявляются вверху. Я бы предположил, что вы просто будете использовать последнюю версию, но я заметил, что некоторые контракты, кажется, работают на одной платформе, не работают на другой, то есть развертывание одного и того же контракта через Remix и MetaMask против Mist?

Ответы (1)

Это функция безопасности.

Может быть полезно думать о solcкомпиляторе как о возможном источнике дефектов. Это способ указать версию компилятора, которая использовалась при разработке и тестировании.

Рассмотрим ситуацию, в которой команда провела кропотливое тестирование с большими затратами. Затем ряд неудачных обстоятельств приводит к компиляции с использованием более нового компилятора. Они запустили его в производство, ошибочно полагая, что он был тщательно протестирован, но на самом деле он другой и сломанный. Ой!

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

pragma solidity 0.4.11; // version 0.4.11. Nothing else will do.

pragma solidity ^0.4.11; // version 0.4.11 or newer 

На мой взгляд , нотация ^ удобна для неформальной разработки. Перед обширным тестированием или выпуском требуется точное обозначение.

По сути, это говорит о том, что «этот код был скомпилирован с 0.4.11», и люди могут сами скомпилировать исходный код и убедиться, что он точно соответствует. Неявно, если тестируемая версия была скомпилирована с чем-то другим, то «этот» байт-код вообще не тестировался.

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

Ах, это имеет смысл! Я думал о том, чтобы объявить, что я пишу код на определенной версии языка Solidity, но на самом деле это объявление версии компилятора, с которым я разработал и протестировал код. И в конкретном примере выше, когда я разработал код с Remix с использованием последнего компилятора, Mist не будет развертываться, поскольку он не может безопасно проверить, что тот же результат будет получен из их версии компилятора.