Pages:
Author

Topic: Изучаем Solidity - page 2. (Read 588 times)

sr. member
Activity: 377
Merit: 282
Finis coronat opus
December 17, 2017, 06:29:41 PM
#8
Насколько я знаю, универсального языка смарт контрактов и не существует, у каждой монеты свой.
У меня есть задача - занять какую то узкую нишу в программировании, где платят хорошие деньги, и чтоб пониже порог входа по объему технологий которые надо изучить.
Можете предложить вариант лучше?

Без обид, но вы не туда пришли в таком случае. Все, что вы выучите, скорее всего пойдет вам на пользу в плане личностного развития, но не карьерного.
Вы хотите работать в блокчейне, но вопрос: Почему вы не работаете программистом просто так? Например фуллстак разработчиком? Или не пишете контроллеры на плюсах?

Проблема того же Солидити, что он высокоуровневый. Он довольно сырой и забагован, притом, мало кто сейчас понимает как Солидити взаимодействует с системой на низком уровне (большинство "взломов" смартконтрактов, их некорректной работы связанны именно с этим) Человек видит облочку, пишет контракт. Если смотреть по программе - все корректно и хорошо. Контракт запускается в сеть, и хоп, что-то вылазит. Или не вылазит, а кто-то пользуется тем, что на низком уровне все работает не совсем так.

Например, у меня в закладках была статья с примерами так называемого "говнокодинга" на Солидити. Ужас был в том, что по коду все выглядело красиво, но работало не так. Из того что помню, был код, элементарный, который через Н дней отправлял платеж на некий адрес. Но так как первая транзакция не подтвердилась (не успела или сеть была загружена) контракт наспамил еще пару транзакций пока баланс не опустел.

Что бы писать на Солидити, нужно понимать низкие уровни. Поэтому я бы вам советовал написать некий смарт контракт с помощью сети Биткоина (его язык позволяет писать элементарные контракты). Это намного поможет вашему пониманию.
full member
Activity: 216
Merit: 117
AtomX.online
December 17, 2017, 05:22:52 PM
#7
Еще не добрался до этого вопроса.
Погуглил сейчас - пишут что встроенной функции random() нету в solidity
и что это вообще может быть проблемой, тк VM одна и таже и непонятно откуда взять случайность.

Было бы логично использовать nonce из текущего блока в момент розыгрыша, но пишут что к этому значению нет доступа изнутри контракта.
Это кстати меня удивило.

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

Смотрю на доступные переменные, думаю может использовать block.blockhash (function(uint) returns (bytes32)): hash of the given block - only works for 256 most recent blocks
Например в 12:00 "продажу билетов завершаем"
Ждем 10 минут, и используем как базу для случайного числа хеш блока найденого после 12:05
member
Activity: 112
Merit: 10
C++/Golang Dev
December 17, 2017, 03:36:01 PM
#6
Как Вы будете генерировать случайное число в смарт-контракте?
По поводу неправильного времени у майнера: если оно будет таковым, скорее всего блок не будет подтвержден остальными майнерами и соответственно не будет принят в цепочку.
full member
Activity: 216
Merit: 117
AtomX.online
December 17, 2017, 07:39:19 AM
#5
Гуглил как же выяснять кто нам слал деньга на контракт и как работать с временем, нагуглил еще один сайт с уроками по смарт контрактам
http://inaword.ru/smart-kontrakty/

Итак, можно используя "fallback function" (которая вызывается в момент прихода эфира на контракт)
записывать в переменные состояния новую запись.
Данные логично хранить в структуре вроде
mapping (address => uint256) client_tickets;
Надо теперь глубже с массивами разобраться.
Архитектурно получается вот так
адрес1 -> сумма1
адрес2 -> сумма2
.....
адресN -> сумма_N
значит в момент розыгрыша надо:
- сложить все полученные суммы от сумма1 до сумма_N
- сгенерить случайное число X, такое что 0 < X < N
- X соответственно покажет адрес победителя которому надо отдать приз (складываем суммы начиная с первой полученной и до тех пор пока сумма не станет больше X)

Для определения а не пора ли сделать розыгрыш можно использовать now

интересные вопросы над которыми я думал:
1. Откуда now берет время?
С виртуальной машины майнера который взялся исполнять контракт?
Может ли быть на этой VM неправильное время, может не стоит к времени привязываться а ориентироваться по номерам блоков..

2. Могут ли возникнуть коллизия когда одновременно 2 человека послали деньги на контракт (ведь очередность прихода денег у нас фактически определяет "номер билета в лотерее") ?
Исходя из моего понимания логики работы блокчейна, от этого мы застрахованы.
Даже если в физическом мире они отправили деньги одновременно, транзакции в блоке все равно будут записаны последовательно.
full member
Activity: 216
Merit: 117
AtomX.online
December 17, 2017, 04:47:38 AM
#4
Хорошие туториалы, написано простым языком, всё понятно. Но Solidity - это привязка к конкретной монете Ethereum.
Насколько я знаю, универсального языка смарт контрактов и не существует, у каждой монеты свой.
У меня есть задача - занять какую то узкую нишу в программировании, где платят хорошие деньги, и чтоб пониже порог входа по объему технологий которые надо изучить.
Можете предложить вариант лучше?
legendary
Activity: 2660
Merit: 2332
December 16, 2017, 10:22:06 PM
#3
Хорошие туториалы, написано простым языком, всё понятно. Но Solidity - это привязка к конкретной монете Ethereum.
full member
Activity: 216
Merit: 117
AtomX.online
December 16, 2017, 03:23:06 PM
#2
Сам  с програмированием знаком, но довольно поверхностно.
Мне нравится изучать язык реализовывая конкретную небольшую задачу.

На solidity я хочу написать контракт честной лотереи, на результат розыгрыша которой владелец контракта не сможет повлиять.
Сама идея такая:

Все кто хочет участвовать в лотерее отсылают на адресс смарт контракта эфириум, кто сколько хочет.
Каждый 1 wei (минимальный обьем эфира) получает "билет в лотерею".
В момент розыгрыша, ну например каждый 100й блок главной ветки смарт контракт случайным образом определяет победителя и отсылает ему все деньги за вычитом 10% которые он скидывает мне.

Идея вроде простая Smiley
Теперь читать документацию и начинать писать и тестировать.
full member
Activity: 216
Merit: 117
AtomX.online
December 16, 2017, 03:11:53 PM
#1
Поглядев на хайп вокруг блокчейна, подумал я а не переквалифицироваться ли в блокчейн программисты?
Выбор пал на Solidity - язык смарт контрактов эфириума.

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

Также в этой идее мне понравилось то, что тут короткий стек технологий и отсутствие тяжелого наследия старых версий. Например если изучать веб програмирование, то там в стек технологий надо сразу JS+SQL+язык.

А тут достаточно просто одного solidity плюс понимание работы блокчейна и криптографии.
Минус в том что с документацией, книгами курсами дела пока обстаят не очень, особенно на русском.

В этом топике буду описывать свои успехи и выкладывать ссылки на хорошие обучающие материалы.

1. Язык Solidity: Неllo World (Урок 1)
очень понравилось изложение материала, поэтому поставлю пока первым в списке.
2. [Russian] Руководство по Solidity
Это перевод официальной документации.
Много инфы, но встречаются не переведенные с английского куски
3. Официальная документация на английском

Вот еще пачка статей на русском:
https://habrahabr.ru/post/327236/
https://habrahabr.ru/post/312008/
https://habrahabr.ru/company/neobit/blog/324456/
https://habrahabr.ru/company/neobit/blog/324456/
https://habrahabr.ru/post/335710/
Pages:
Jump to: