Почти год прошел с тех пор, как мы добавили новую криптовалюту в LocalCryptos, и многие из вас запрашивали Bitcoin Cash в качестве следующего варианта нашей некастодиальной формулы. Ожидание наконец-то закончилось.
Начиная с сегодня, P2P торговля Bitcoin Cash доступна на LocalCryptos.
Bitcoin Cash-это форк BTC, что означает, что он обладает аналогичными возможностями смарт-контракта “Биткоин-скрипт”. В отличие от наших скриптов для смарт-контрактов, Bitcoin, Litecoin, и Dash, LocalCryptos использует “OP_CHECKDATASIG” op-code который доступен только в транзакциях Bitcoin Cash.
Обычный пользователь не заметит разницы между этим новым типом смарт-контракта, так как результат практически идентичен LocalCryptos’ скрипту для некастодиального BTC смарт-контракта. Однако, с точки зрения программирования, скрипт Bitcoin Cash P2SH, является более простым и интуитивно понятным, и он имеет некоторые преимущества.
Как и в случае со всеми смарт-контрактами на LocalCryptos, мы технически не можем возвращать средства обратно на смарт-контракт escrow. Мы участвуем только в том случае, если возникает спор об оплате, и после этого у нас есть возможность направить BCH покупателю или продавцу. Нажмите здесь, чтобы узнать больше о криптографической магии, которая делает это возможным.
Разумеется, ваш кошелек Bitcoin Cash на LocalCryptos также защищен. Ваши ключи—ваши монеты. Разработчики могут просмотреть наши аннотированные шаблоны скриптов для Bitcoin Cash в нижней части этого объявления.
Как и в случае со скриптами, которые мы разработали для других криптосистем, наш код смарт-контракта Bitcoin Cash, является открытым исходным кодом.
Этот скрипт работает аналогично транзакции Bitcoin с несколькими подписями, за исключением того, что участвующим сторонам не нужно договариваться о том, как и когда расходуются Bitcoin Cash. Оракул, который может быть продавцом, покупателем или арбитром, в зависимости от обстоятельств сделки, не имеет возможности устанавливать условия для транзакции, в отличие от традиционных кошельков с несколькими подписями.
Это связано с тем, что в традиционном кошельке с несколькими подписями все стороны должны подписать полную транзакцию, включая все выходы и входы, в то время как в транзакции смарт-контракта, которые использует OP_CHECKDATASIG
, оракулу просто нужно предоставить победителю подпись, которую они могут использовать в любое время, чтобы разблокировать BCH любым способом по своему выбору.
Этот тип механизма условного депонирования по цепочке дает покупателю и продавцу возможность осуществлять обмен без разрешения, а арбитру-возможность вмешиваться в качестве посредника, в случае спора об оплате.
Чтобы перевести Bitcoin Cash на смарт-контракт, продавец генерирует транзакцию с двумя выходами. Один выход - это депонирование покупателю, а другой-возвращаемая плата. Если сделка не будет успешной, продавец может потребовать возврата комиссии.
В обычных сделках продавец позволит покупателю потратить выход смарт-контракта. Это не требует нашего вмешательства. Аналогично, если покупатель решит отменить сделку по собственному желанию, продавец может потратить выход без нашей помощи. Первый сценарий-это “высвобождение”, а второй - “возвращение”.
В случае возникновения спора об оплате арбитр может вмешаться и выступить в качестве посредника. Арбитр может направить средства только продавцу или покупателю, по своему усмотрению. Скрипт комиссии позволяет арбитру взимать ее после высвобождения смарт-контракта или вернуть комиссию продавцу, если сделка не удалась.
OP_DUP # После этого нам нужно снова использовать байт
# Получить хэшированные открытые ключи, с которыми нам нужно сравнить (наши и oracle)
OP_1
OP_EQUAL
OP_IF
<hash160(SellerPubKey)> # Oracle pub ключ
<hash160(BuyerPubKey)> # Spender pub ключ
OP_ELSE
OP_DUP
OP_2 # = выпуск из арбитра
OP_EQUAL
OP_IF
<hash160(ArbPubKey)> # Oracle pub ключ
<hash160(BuyerPubKey)> # Spender pub ключ
OP_ELSE
OP_DUP
OP_3 # = возврат от покупателя
OP_EQUAL
OP_IF
<hash160(BuyerPubKey)> # Oracle pub ключ
<hash160(SellerPubKey)> # Spender pub ключ
OP_ELSE
OP_DUP
OP_4 # = возврат от арбитра
OP_EQUALVERIFY # должно быть правдой, иначе сообщение неизвестно
<hash160(ArbPubKey)> # Oracle pub ключ
<hash160(SellerPubKey)> # Spender pub ключ
OP_ENDIF
OP_ENDIF
OP_ENDIF
# Поместите хэшированные открытые ключи в alt stack
OP_TOALTSTACK
OP_TOALTSTACK # Stack эффективно сбрасывается на вход
# В Stack alt у нас есть: [ hash160(SpenderPubKey), hash160(OraclePubKey) ]
<EscrowKey> # Добавьте nonce к ключу смарт-контракта, чтобы создать сообщение
OP_CAT # Stack is [ ..., <OraclePubKey>, <0x01 || EscrowKey> ]
OP_SWAP # Используйте это позже; сначала проверьте хэш открытого ключа oracle
OP_DUP
OP_HASH160
OP_FROMALTSTACK # Возьмите hashed pub ключ из alt stack
OP_EQUALVERIFY # Public key проверен; теперь проверьте подпись oracle
OP_CHECKDATASIGVERIFY # Теперь проверьте отправителя
OP_DUP
OP_HASH160
OP_FROMALTSTACK
OP_EQUALVERIFY
OP_CHECKSIG
Это комиссионная часть сделки. Если сделка не удалась, плата может быть возвращена продавцом; если сделка будет успешной, выход комиссии будет вычтен LocalCryptos.
OP_DEPTH # Размер stack подсчета
OP_2
OP_EQUAL # Содержит ли входной stack только два элемента?
OP_IF # Если да, то это плата за сбор владельцем; простой PKG
OP_DUP
OP_HASH160
<hash160(ArbPubKey)>
OP_EQUALVERIFY
OP_CHECKSIG
OP_ELSE # Продавец тратит "возвращенный" (т. е. отмененный) депозит
OP_DUP
OP_3 # = возврат от покупателя
OP_EQUAL
OP_IF
<hash160(BuyerPubKey)> # Oracle pub ключ
OP_ELSE
OP_DUP
OP_4 # = возврат от арбитра
OP_EQUALVERIFY #должно быть правдой, иначе сообщение неизвестно
<hash160(ArbPubKey)> # Oracle pub ключ
OP_ENDIF
<hash160(SellerPubKey)> # Spender pub ключ
# Поместите хэшированные открытые ключи в Stack alt
OP_TOALTSTACK
OP_TOALTSTACK # Stack эффективно сбрасывается на вход
# В alt stack у нас есть: [ hash160(SpenderPubKey), hash160(OraclePubKey) ]
<EscrowKey> # Добавьте nonce к ключу смарт-контракта, чтобы создать сообщение
OP_CAT # Stack is [ ..., <OraclePubKey>, <0x01 || EscrowKey> ]
OP_SWAP # Используйте это позже; сначала проверьте хэш открытого ключа oracle
OP_DUP
OP_HASH160
OP_FROMALTSTACK # Возьмите hashed pub key из alt stack
OP_EQUALVERIFY # Public keyпроверен; теперь проверьте подпись oracle
OP_CHECKDATASIGVERIFY # Проверьте отправителя
OP_DUP
OP_HASH160
OP_FROMALTSTACK
OP_EQUALVERIFY
OP_CHECKSIG
OP_ENDIF
Чтобы потратить выход смарт-контракта, тратящий должен указать в своей транзакции Bitcoin Cash scriptSig
:
<Sig> <SpenderPubKey> <OracleSignature> <OraclePubKey> <ActionByte>
# Пример: <Sig> <OwnPubkey> <SignatureFromSeller> <SellerPubKey> OP_1
<ActionByte>
является байтом, соответствующим выполняемой ситуации. 1
: Смарт-контракт высвобождается продавцом2
: Смарт-контракт высвобождается арбитром3
: Смарт-контракт возвращается покупателем4
: Смарт-контракт возвращается арбитром<OraclePubKey>
является открытым ключом лица, подписывающего сообщение о выпуске/возврате. 1
: <OraclePubKey>
= <SellerPubKey>
2
: <OraclePubKey>
= <ArbPubKey>
(контролируется LocalCryptos)3
: <OraclePubKey>
= <BuyerPubKey>
4
: <OraclePubKey>
= <ArbPubKey>
(контролируется LocalCryptos)<OracleSignature>
является ли подпись от оракула ECDSA(<ActionByte> || <EscrowKey>)
. <EscrowKey>
уникален, поэтому подписи нельзя повторно использовать во всех смарт-контрактах.<SpenderPubKey>
является key ключом покупателя, если выпуск, в противном случае public ключом продавца.<Sig>
является подписью транзакции от тратящего.