Bitcoin Forum
April 26, 2024, 01:51:57 PM *
News: Latest Bitcoin Core release: 27.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: « 1 [2]  All
  Print  
Author Topic: Изучаем Solidity  (Read 527 times)
Mitch (OP)
Full Member
***
Offline Offline

Activity: 215
Merit: 117


AtomX.online


View Profile WWW
December 21, 2017, 04:03:26 PM
 #21

Для розыгрыша нужна функция в которую надо передать полное количество билетов участвующих в розыгрыше и на выходе получить случайный номер билета.
random(max_ticket_number);


Но в solidity нет встроенного random, получается его надо написать.
И заняться этим в первую очередь, все таки случайный выбор архиважная часть лотереи.

Итак мы хотим функцию random куда надо передать max_ticket_number и на выходе целое число получить от 1 до max_ticket_number
Я решил попробовать извлечь случайные данные из block.blockhash текущего блока.
Вот такой код я написал в Remix
Хеш беру не текщего блока а предидущего, тк текущий выдает одни нули, а предидущий дал
0x18676e992055c057538d59b378271bb4eacdb7f6abf9e815fd63255dc11166b6
Выглядит очень случайно!

pragma solidity ^0.4.13;
contract Random {
    function get_block_number() public constant returns (uint) {
        return block.number;
    }
        function get_blockhash() public constant returns (bytes32) {
        return block.blockhash(block.number);
    }

}

Осталось перевести byte32 в uint и произвести деление с остатком.
Ну и протестить на случайность, взяв такой рандом за последние 1000 блоков и посмотреть какие он выдаст цифры от 1 до 10 и посмотреть нет ли отклонений выдаче.

You have to trust people!
Of course, not money, or secrets, but in general.
1714139517
Hero Member
*
Offline Offline

Posts: 1714139517

View Profile Personal Message (Offline)

Ignore
1714139517
Reply with quote  #2

1714139517
Report to moderator
Remember that Bitcoin is still beta software. Don't put all of your money into BTC!
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
1714139517
Hero Member
*
Offline Offline

Posts: 1714139517

View Profile Personal Message (Offline)

Ignore
1714139517
Reply with quote  #2

1714139517
Report to moderator
1714139517
Hero Member
*
Offline Offline

Posts: 1714139517

View Profile Personal Message (Offline)

Ignore
1714139517
Reply with quote  #2

1714139517
Report to moderator
Mitch (OP)
Full Member
***
Offline Offline

Activity: 215
Merit: 117


AtomX.online


View Profile WWW
December 22, 2017, 02:19:47 PM
 #22

Пишу читаю, и вдруг я вспомнил про code convetions.
Решил что надо глянуть как принято в solidity писать, и писать так, а не как попало.
Мда, там многобукв Smiley
Пока запомню и внедрю самое важное:

Функции надо называть  разделяя слова заглавными буквами, типа function thisFunctionHasLotsOfArguments()
а в переменных использовать подчеркивания long_variable

И использовать пробелы а не табы (wtf?!), ну ок, стандарт есть стандарт.

You have to trust people!
Of course, not money, or secrets, but in general.
Mitch (OP)
Full Member
***
Offline Offline

Activity: 215
Merit: 117


AtomX.online


View Profile WWW
December 22, 2017, 03:26:36 PM
 #23

Игрался с рандомом, написал вот такой код:
Code:
pragma solidity ^0.4.13;
contract Random {
    uint max_ticket_number;
    uint shift_block;
    uint winner_number;
   
    function Random() public {
       max_ticket_number = 100;
       shift_block = 1;
    }
   
    function setMaxTicketNumber(uint new_max_ticket_number) public {
        max_ticket_number = new_max_ticket_number;
    }
   
    function getWinnerNumber() public {
        uint base_random = uint(block.blockhash(block.number - shift_block));
        //shift_block++;
        winner_number = base_random%max_ticket_number;
    }
    function printWinnerNumber() public constant returns (uint) {
        return winner_number;
    }

    function getShift() public constant returns (uint) {
        return shift_block;
    }
   
    function getBlockNumber() public constant returns (uint) {
        return block.number;
    }
        function getBlockhash() public constant returns (uint) {
        return uint(block.blockhash(block.number - shift_block));
    }

}

Экспериментально выяснил, что когда вызываю функцию изменяющую контракт, то есть объявленную без constant то в блокчейне Remix возникает новый блок.
Такие функции Remix отображает красными квадратиками.
function getWinnerNumber() вычисляет победителя, но почему то не хочет Remix отобразить результат из нее.
Сделал поэтому printWinnerNumber() она чисто отображает результат.
Жмем последовательно, видим, что по хешу блока выдаются разные случайные значения в заданном диапазоне.

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

You have to trust people!
Of course, not money, or secrets, but in general.
bomj
Sr. Member
****
Offline Offline

Activity: 1337
Merit: 288


0xbt


View Profile WWW
September 25, 2018, 02:11:37 PM
 #24

С удовольствием прочитал данный топик.
Как хороший рассказ. Жаль что оборвался.
Интересно было бы узнать конец истории....

circuswp
Jr. Member
*
Offline Offline

Activity: 33
Merit: 1


View Profile WWW
September 25, 2018, 02:35:46 PM
 #25

Отличная тема, действительно интересно - ждём продолжения.
Сам хотел солидол изучать, надо написать пару смарт контрактов для тестирования.
Mitch (OP)
Full Member
***
Offline Offline

Activity: 215
Merit: 117


AtomX.online


View Profile WWW
September 25, 2018, 05:54:44 PM
Merited by esmanthra (1)
 #26

Меня убедили в том, что на одном solidity далеко не уедешь.
Крайне сложно найти клиента которому бы нужен был бы чисто смартконтракт, а не сайт\приложение + смартконтракт.

И в январе я решил что надо изучить Java.
Вот все еще изучаю.
Сначала проходил курсы на hexlet, все что там тогда было по java, курс закончился, а я еще был далек от того чтобы сделать самый простенький сайт на java.
Потом я еще почти 3 месяца занимался на javarush.
Чтож, это было весьма полезно, теория полученая на hexlet отлично дополнилась огромной кучей задачек которые я решал тут сотнями.
Я добрался до 15го уровня javarush
Но.. до java-web было все бесконечно далеко, и в будущих уроках как то не проглядывалось что меня начнут этому учить.

Я пошел на форум программистов и нашел себе учителя, на java-web.
Занимаемся уже 2 недели, и конечно с живым человеком обучение идет гораздо интереснее чем по курсам.
Мне кажется что я уже близок к продакшену и за пару месяцев напишу первый проект который у меня был запланирован.

You have to trust people!
Of course, not money, or secrets, but in general.
bomj
Sr. Member
****
Offline Offline

Activity: 1337
Merit: 288


0xbt


View Profile WWW
September 25, 2018, 06:05:43 PM
 #27

...Я пошел на форум программистов и нашел себе учителя, на java-web.
Занимаемся уже 2 недели, и конечно с живым человеком обучение идет гораздо интереснее чем по курсам.
Мне кажется что я уже близок к продакшену и за пару месяцев напишу первый проект который у меня был запланирован.
Вы все правильно делаете, не останавливайтесь.
Но все же не забывайте иногда выкладывать продолжение истории.
Я и так случайно на нее наткнулся, пролистывая форум на год назад.
Это поучительно и познавательно.
Удачи.

deniben
Newbie
*
Offline Offline

Activity: 42
Merit: 0


View Profile
September 25, 2018, 08:06:23 PM
 #28

Меня убедили в том, что на одном solidity далеко не уедешь.
Крайне сложно найти клиента которому бы нужен был бы чисто смартконтракт, а не сайт\приложение + смартконтракт.

И в январе я решил что надо изучить Java.
Вот все еще изучаю.
Сначала проходил курсы на hexlet, все что там тогда было по java, курс закончился, а я еще был далек от того чтобы сделать самый простенький сайт на java.
Потом я еще почти 3 месяца занимался на javarush.
Чтож, это было весьма полезно, теория полученая на hexlet отлично дополнилась огромной кучей задачек которые я решал тут сотнями.
Я добрался до 15го уровня javarush
Но.. до java-web было все бесконечно далеко, и в будущих уроках как то не проглядывалось что меня начнут этому учить.

Я пошел на форум программистов и нашел себе учителя, на java-web.
Занимаемся уже 2 недели, и конечно с живым человеком обучение идет гораздо интереснее чем по курсам.
Мне кажется что я уже близок к продакшену и за пару месяцев напишу первый проект который у меня был запланирован.

Классно, что на это не закончили. Я тоже кстати  изучаю java и solidity
Pages: « 1 [2]  All
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!