Репост из: Crypto Lemon
Часто слышу что смарт контракты есть там только в Эфире, Еосе и прочих навороченных блокчейнах. Это немного не так, ведь сам Сатоши предвидел возможность появления "смарт контрактов", правда из-за ограничений изобретенного им языка Script возможности биткоиновых смарт контрактов были (и по сути есть) немного ограниченными. Но самые простые смарт контракты конечно же можно делать (и намного проще чем в Эфире) и в биткоине.
К примеру, нам нужно сделать отложенный платеж, или же завещать свои средства своему сыну или если нет сына - коту. Здесь нам пригодится контракт-завещание. в чем его суть? Создается отложенная транзакция с nLocktime скриптом, которая позволяет тратить средства только после указанного блока или же после указанного времени. При создании "сырой" транзакции у нас есть специальное поле "locktime", (метод LOCKTIMEVERIFY) где мы можем указать некое число. Если число < 500 000 000, то условие будет восприниматься как количество блоков которое должно пройти, прежде чем транзакцию можно тратить. Если > , тогда оно воспринимается как время в UTX после которого можно тратить.
Минус этого метода в том, что транзакция с locktime-ом не сохраняется в мемпуле нод, и ее надо забросить в сеть собственно после истечения срока (иначе не выйдет). Плюсы же в следующем: вы можете потратить средства если передумаете (транзакции ведь нет в мемпуле, читай нет в сети) а также, у вас не могут это украсть и вам не нужно переживать из-за приваткеев и прочего. Создали транзакцию, подписали, скинули хэш коту и он закинет когда придет время.
Выглядеть в Bitcoin Core это будет примерно так:
createrawtransaction [{"txid":"id","vout":n},...] [{"address":amount},{"data":"hex"},...] ( locktime = число )
Не сложно, но вы скажете, мол "Да какой это нахрен смарт контракт???". Хорошо, давайте тогда немного усложним:
Как вам вариант CLTV или же CHECKLOCKTIMEVERIFY ? По сути тоже самое, только с интересным отличием: откладывается не вся транзакция, а только указанные UTXO (непотраченные входы) на указанное время. Тоесть, вы можете отправить 10 биткоинов на три разных адреса, первый из которых сможет потратить их например через 2 года, второй через 1000 блоков, а третий вообще никогда или сразу же. Притом, такая транзакция может быть отправлена в мемпул, и будет подтверждена, просто потратить деньги можно будет только через указанное время/количество блоков. Уже интереснее, не правда ли?
Но самое интересное это конечно же CHECKSEQUENCEVERIFY или CSV. Метод, во многом идентичный CLTV но более универсальный: таймер возможности траты выхода включается с момента смайненого инпута. Тоесть, в CLTV задается некое абсолютное время, после которого можно тратить средства, а в CSV - некое время после попадания транзакции в блок. В чем сила? Да в том, что есть возможность создавать отложенные действия.
Например, создается транзакция на два выхода, для одного нужен ключ кота, для другого ключ сына. Если же выходы не тратятся в течении 2 лет, то открывется альтернативное условие, где для траты нужен уже ваш ключ (не захотели себе биточки, ну и ладно, оставлю себе). Согласитесь, это уже полноценный смарт контракт! Простенький, да, но сам факт то! Единственное что ограничивает его размер - это 520 байт места (больше нельзя в одной транзакции P2SH впихивать)
Думаю чуть попозже я выложу готовый, разобранный пример такого микро смарт контракта.
К примеру, нам нужно сделать отложенный платеж, или же завещать свои средства своему сыну или если нет сына - коту. Здесь нам пригодится контракт-завещание. в чем его суть? Создается отложенная транзакция с nLocktime скриптом, которая позволяет тратить средства только после указанного блока или же после указанного времени. При создании "сырой" транзакции у нас есть специальное поле "locktime", (метод LOCKTIMEVERIFY) где мы можем указать некое число. Если число < 500 000 000, то условие будет восприниматься как количество блоков которое должно пройти, прежде чем транзакцию можно тратить. Если > , тогда оно воспринимается как время в UTX после которого можно тратить.
Минус этого метода в том, что транзакция с locktime-ом не сохраняется в мемпуле нод, и ее надо забросить в сеть собственно после истечения срока (иначе не выйдет). Плюсы же в следующем: вы можете потратить средства если передумаете (транзакции ведь нет в мемпуле, читай нет в сети) а также, у вас не могут это украсть и вам не нужно переживать из-за приваткеев и прочего. Создали транзакцию, подписали, скинули хэш коту и он закинет когда придет время.
Выглядеть в Bitcoin Core это будет примерно так:
createrawtransaction [{"txid":"id","vout":n},...] [{"address":amount},{"data":"hex"},...] ( locktime = число )
Не сложно, но вы скажете, мол "Да какой это нахрен смарт контракт???". Хорошо, давайте тогда немного усложним:
Как вам вариант CLTV или же CHECKLOCKTIMEVERIFY ? По сути тоже самое, только с интересным отличием: откладывается не вся транзакция, а только указанные UTXO (непотраченные входы) на указанное время. Тоесть, вы можете отправить 10 биткоинов на три разных адреса, первый из которых сможет потратить их например через 2 года, второй через 1000 блоков, а третий вообще никогда или сразу же. Притом, такая транзакция может быть отправлена в мемпул, и будет подтверждена, просто потратить деньги можно будет только через указанное время/количество блоков. Уже интереснее, не правда ли?
Но самое интересное это конечно же CHECKSEQUENCEVERIFY или CSV. Метод, во многом идентичный CLTV но более универсальный: таймер возможности траты выхода включается с момента смайненого инпута. Тоесть, в CLTV задается некое абсолютное время, после которого можно тратить средства, а в CSV - некое время после попадания транзакции в блок. В чем сила? Да в том, что есть возможность создавать отложенные действия.
Например, создается транзакция на два выхода, для одного нужен ключ кота, для другого ключ сына. Если же выходы не тратятся в течении 2 лет, то открывется альтернативное условие, где для траты нужен уже ваш ключ (не захотели себе биточки, ну и ладно, оставлю себе). Согласитесь, это уже полноценный смарт контракт! Простенький, да, но сам факт то! Единственное что ограничивает его размер - это 520 байт места (больше нельзя в одной транзакции P2SH впихивать)
Думаю чуть попозже я выложу готовый, разобранный пример такого микро смарт контракта.