Pull to refresh

Comments 11

Это событие с Parity ещё раз подтверждает, что тьюринг полный язык контрактов — зло. Все кому не лень кинулись на Solidity как в свoё время на JavaScript, независимо от кривизны рук.
Bitcoin script не полнотьюринговый, язык смарт контрактов BitShares не полнотьюринговый. Каждйы для своей области ограничены и детерминистичны. Язык smart-контрактов должен быть детерминистичным, иначе это катастрофа. В этом году из за кривых контрактов уже 6 проблем на всю сеть было. Solidity ЯП на блокчейне, с соответствующими тормозами. Имея тюринг-полный ЯП, всегда можно найти возможность создать неявную проблему в смарт-контракте.

Но полнота по Тьюрингу слишком привлекательна для проектов. Не всё же кошельки делать и краудсейлы :)

Тьюринг полный язык контрактов не зло. Зло — отсутствие инструментов и методик позволяющих проверить получилась ли система детерменизированной.

Чисто и лаконично написано.
Но в функции transferOwnership есть цикл, число итераций которого может оказаться порядка тысячи и более:
for (i = 0; i < allPendingOperations.length; i++) {
что приведет к достижению лимита газа блока и невозможности поменять владельцев контракта.
Мультиподпись ethereum wallet также этим страдает (функция clearPending).
В своей мультиподписи на базе МП ethereum wallet мы ввели принудительный сброс pending-операций в потенциально опасной ситуации, но я считаю это временным решением — планируем переработать алгоритм сброса в итерационный, который адаптивно учитывает msg.gas.

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

Что скажете про такой способ ухода от циклов по операциям? https://github.com/bitclave/Multiownable/pull/2


Вынесение всех переменных в структуру не помогло. При пересоздании структуры внутренние маппинги не очищаются! Зато помогли вложенные маппинги, первым ключом которых является фактически номер версии, которая растет при каждой передачи прав владения.

Т.е. по сути введены поколения структур. Да, хорошая идея. Вложенные маппинги работают за счет того, что локация в storage определяется условно говоря как хэш(локация мапинга, uid, ключ) — новый uid — все обнулено.

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

С другой стороны непонятно насколько плохая идея не очищать маппинг, а только засорять его.

А с какой целью очищать? Уменьшить размер блокчейна не получится, разве что размер текущего состояния.

Мне кажется ноды вычищают у себя удаленные данные, смысла то нет их хранить дальше.

Ну тут как в VCS. Нода должна (по апи в т.ч.) уметь отвечать на вопросы о прошлом.
Sign up to leave a comment.

Articles