Как стать автором
Обновить

Умные контракты на платформе Semux

Что такое Semux?


Многие из вас уже не раз слышали про блокчейн и так называемые «умные контракты», но в этой статье я не буду в очередной раз расписывать теорию и основы. Мы сразу перейдем к делу, а именно, к публикации вашего первого работающего смарт-контракта. Но не на платформе Ethereum, как вы могли подумать, а на другой платформе, более новой и малоизвестной, Semux платформе.

Semux — это экспериментальная высокопроизводительная блокчейн-платформа с открытым исходным кодом, управляемая сообществом. В основе платформы лежит консенсусный механизм Semux BFT. Если сильно упростить то Semux — этот тот же Ethereum, только без PoW (Proof-of-Work) майнеров.

Чтобы детальнее познакомиться с Semux — давайте создадим простенький гемблинг (gambling) смарт контракт «Подбрасывания монетки».

Установка правильной ноды


На данный момент основная сеть Semux не поддерживает EVM (Ethereum Virtual Machine) и работу со смарт контрактами, активация EVM будет немного позже, в конце лета\начало осени 2019. Исходя из этого, нам придется использовать тестовую сеть, где активирована EVM, к тому же монеты в тестовой сети бесплатны.

Скачиваем последнюю версию релиз кандитата тут. На июль 2019 — это Semux v1.5.0 RC4, позже это может быть другая версия, так что будьте внимательны.

Для того чтобы присойдениться к тестовой сети, необходимо указать флаг network=testnet при запуске ноды.

./semux-gui.sh --network testnet

Указываем пароль, создаем новый адрес, теперь у нас есть адрес, но где взять тестовые монеты? Для этого переходим на этот ресурс, вставляем свой адрес и нажимаем «SEND», спустя пару минут на вашем адресе будет 1000 монет для тестовой сети. Теперь мы можем создавать и вызывать смарт-контракты.

Создаем свой смарт-контракт


Поскольку Semux EVM практически идентичная Ethereum EVM, то мы можем использовать старый добрый solidity для написания контрактов. Вот код простенького контракта на solidity

pragma solidity  ^0.4.24;
contract Dice{
struct Bet{
  uint8  currentBet;
  bool  isBetSet; //default value is false 
  uint8  destiny;
 }
mapping(address => Bet) private bets;
uint8 private randomFactor;
event NewBetIsSet(address bidder , uint8 currentBet);
event GameResult(address bidder, uint8 currentBet , uint8 destiny);
constructor() public{
  randomFactor = 10;
 }
function isBetSet() public view returns(bool){
  return bets[msg.sender].isBetSet;
 }
function getNewbet() public returns(uint8){
  require(bets[msg.sender].isBetSet == false);
  bets[msg.sender].isBetSet = true;
  bets[msg.sender].currentBet = random();
  randomFactor += bets[msg.sender].currentBet;
  emit NewBetIsSet(msg.sender,bets[msg.sender].currentBet);
  return bets[msg.sender].currentBet;
 }
function roll() public returns(address , uint8 , uint8){
  require(bets[msg.sender].isBetSet == true);
  bets[msg.sender].destiny = random();
  randomFactor += bets[msg.sender].destiny;
  bets[msg.sender].isBetSet = false;
  if(bets[msg.sender].destiny == bets[msg.sender].currentBet){
   msg.sender.transfer(1000000000);
   emit GameResult(msg.sender, bets[msg.sender].currentBet, bets[msg.sender].destiny);
  }else{
   emit GameResult(msg.sender, bets[msg.sender].currentBet, bets[msg.sender].destiny);
  }
  return (msg.sender , bets[msg.sender].currentBet , bets[msg.sender].destiny);
 }
  function random() private view returns (uint8) {
      uint256 blockValue = uint256(blockhash(block.number-1 + block.timestamp));
      blockValue = blockValue + uint256(randomFactor);
      return uint8(blockValue % 5) + 1;
  }
}

Если вы хотите узнать больше про solidity и детальнее изучить код контракта, переходим сюда.

Итак, у нас есть код контракта, теперь нам нужно опубликовать его в сети Semux. Но EVM не поддерживает человеку понятный solidity код, EVM понимает только на машинном простом языке, на байткоде (bytecode). Для того чтобы получить байткод нашего контракта открываем
remix IDE, создаем новый файл и вставляем туда код контракта.



Теперь нам нужно скомпилировать контракт и получить байткод. Переходим на вкладку «Solidity Compiler» и нажимаем Compile semuxGame.sol. Если все прошло удачно и контракт был скомпилирован, то нажимаем на Bytecode и получаем свой байткод в виде такого объекта.
{
	"linkReferences": {},
	"object": "60806040523480156100......",
	"opcodes": "PUSH1 0x80 PUSH1 0x......",
	"sourceMap": "26:1592:0:-;;;339......"
}

Копируем значение поля object и добавляем 0х в начале. Теперь у нас есть байткод скомпилированного контракта.

Публикуем и вызываем контракт


Вернемся к тестовой ноде Semux'a. Находим в верхнем меню Help -> Console, открывается консоль, вводим /help и подымаемся на самый верх, находим команду call и create:

Call a contract.
	call <from> <to> <gas> <gasPrice> <value> <nonce> <data>
Create a contract
	create <from> <data> <gas> <gasPrice> <value> <nonce>

Немного о параметрах:
  • from — адрес с которого мы хотим создать\вызвать контракт
  • to — адрес контракта, методы которого мы хотим вызвать
  • gas — количество газа
  • gasPrice — стоимость газа
  • value — количество монет Semux
  • nonce — специальный  числовой параметр
  • data — тот самый байт код

У нас есть все данные кроме nonce. Чтобы получить значение nonce пишем в консоль команду getAccount и адрес на котором есть тестовые монеты. Пример:
getAccount 0xf0d0a5a0d3564fb3d1832232a46ebf0aef401d90

Находим поле nonce и запоминаем его значение. Теперь мы готовы создать контракт, вводим команду:
create 0xf0d...401d90 0x608...1b5d0029 10000000 1 10 0

Если все прошло удачно, то мы увидим хеш транзакции в консоли и перейдя на вкладку Transactions найдем эту транзакцию, открываем её и запоминаем адрес на котором был создан сам контракт (значение поля To).



Возвращаемся обратно к remix'y, открываем вкладку «Deploy and run transactions». Выбираем контракт и нажимаем Deploy. Теперь мы опубликовали контракт локально и может протестировать его методы, прежде чем делать это в сети Semux. Нажимаем getNewBet и открываем debugger в консоли remix чтобы найти поле input и скопировать это значение.



Вставляем это значение в качестве параметра data. Должно выйти что-то вроде:
create 0xf0d...401d90 0xb8....32038 10000000 1 0 13 0xe9b903f4

Точно так же можно вызывать метод roll, изменив значение data и nonce.
create 0xf0d...401d90 0xb8....32038 10000000 1 0 14 0xcd5e3c5d

Для того чтобы проверить свои транзакции, можно зайти во вкладку Tranasctions в локальном кошельке или перейти на testnet explorer.



Вот и все, теперь вы знаете, как создавать и вызывать умные контракты на блокчейн платформе Semux.

Ссылки


Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.