Глава 3
____________________________________
[ 92 ]
___________________________________
При этом мы получим доказательство владения, сохранив пару, состоящую из хеша
файла и имени владельца. Мы получим доказательство существования, сохранив
пару, состоящую из хеша файла и метки времени блока. Наконец, сохранение само-
го хеша доказывает целостность файла. Если файл изменить, то его хеш тоже изме-
нится, и контракт больше не сможет найти файл, что послужит доказательством
изменения файла.
В листинге 3.15 приведен исходный код контракта, который решает эту задачу
10
.
Листинг 3.15. Пример контракта, доказывающего владение файлом
contract Proof
{
struct
FileDetails
{
uint
timestamp;
string
owner;
}
mapping (string => FileDetails) files;
event logFileAddedStatus(bool status, uint timestamp, string owner,
string
fileHash);
//функция для сохранения владельца файла и метки времени блока
function set(string owner, string fileHash)
{
//не существует корректного способа проверить,
//есть ли уже такой ключ,
//поэтому мы проверяем значение по умолчанию (все биты нулевые)
if(files[fileHash].timestamp
==
0)
{
files[fileHash]
=
FileDetails(block.timestamp,
owner);
//мы создаем событие, благодаря которому программа-оболочка
//узнает от контракта, что наличие файла
//и принадлежности сохранено
logFileAddedStatus(true,
block.timestamp,
owner,
fileHash);
}
10
Дополнительно напомним начинающим разработчикам, что смарт-контракт сам по себе не общает-
ся с пользователем. Это back-end (серверная часть). Пользователь же имеет дело с приложением front-
end, то есть с приложением уровня клиентского интерфейса. Например, это может быть оболочка ко-
шелька, приложение для голосования или веб-интерфейс. Приложения front-end вызывают методы
контракта и получают от него ответные данные.
Разработка
смарт-контрактов
____________________________________
[ 93 ]
___________________________________
else
{
//здесь мы сообщаем программе-оболочке, что
//подтверждение существования
//и принадлежности не могут быть сохранены, потому
//что данные файла
//уже
были
сохранены
раньше
logFileAddedStatus(false,
block.timestamp,
owner,
fileHash);
}
}
//функция для получения сведений о файле
function get(string fileHash) returns (uint timestamp, string owner)
{
return
(files[fileHash].timestamp,
files[fileHash].owner);
}
}
Компиляция и развертывание контракта
Ethereum имеет собственный компилятор SOLC (SOLidity Compiler), взаимодейст-
вие с которым происходит через командную строку. По адресу:
http://solidity.
readthedocs.io/en/develop/installing-solidity.html#binary-packages
вы найдете ру-
ководство по установке, а по адресу:
https://solidity.readthedocs.io/en/develop/
using-the-compiler.html
получите инструкции по использованию компилятора.
Но мы не станем работать с компилятором напрямую. Мы воспользуемся инстру-
ментами, которые называются solcjs и браузер Solidity. Утилита solcjs позволяет
компилировать код Solidity в среде Node.js, а браузер Solidity — это среда разра-
ботки (IDE), которая подходит для небольших контрактов.
Давайте прямо сейчас скомпилируем контракт из листинга 3.15 при помощи брау-
зера Solidity, который нам предоставляет платформа Ethereum. Прочитать больше
об этом браузере можно по адресу:
https://Ethereum.github.io/browser-Solidity/
11
.
Вы также можете по ссылке:
https://github.com/Ethereum/browser-Solidity/tree/
gh-pages
скачать исходный код браузера и использовать его локально, без подклю-
чения к сети.
Главное преимущество браузера Solidity заключается в том, что он имеет встроен-
ный редактор и генерирует код для развертывания контракта.
Итак, скопируйте и вставьте в редактор исходный код из листинга 3.15 — вы уви-
дите, что контракт компилируется и получается код web3.js для развертывания кон-
тракта при помощи интерактивной консоли Geth (см.
главу 2
).
11
На момент подготовки перевода ссылка не работала. Воспользуйтесь общей ссылкой:
https://github.com/
ethereum/
, чтобы выбрать нужную тему.
Do'stlaringiz bilan baham: |