Для данной операции нам потребуются Bitcoin Core и Litecoin Core у каждого из участников обмена, а также вот эта чудесная вещь https://github.com/decred/atomicswap
Я использую линукс, но всё возможно провернуть и на винде и на маке (будут пляски с golang).
Устанавливаем golang:
Клонируем репозиторий с гитхаба:
Устанавливаем зависимости:
git clone https://github.com/decred/dcrd.git
go get github.com/btcsuite/btcwallet
go get github.com/ltcsuite/ltcwallet
Собираем нужные нам утилиты для BTC и LTC:
go build
cd ../ltcatomicswap/
go build
В директориях btcatomicswap и ltcatomicswap появятся исполняемые файлы программ.
Далее нужно запустить bitcoind и litecoind (можно и qt). Я использовал версии 0.17 в обоих случаях. С версией Bitcoin Core 0.18 работать не получится, нужно лезть в исходники btcatomicswap, не стал заморачиваться.
Теперь пора разделиться на Алису и Боба.
Алиса хочет за 0.01 BTC купить у Боба 1 LTC.
Боб создает новый адрес BTC и передает его Алисе:
Алиса создает новый адрес LTC и передает его Бобу:
Алиса отправляет 0.01 BTC на адрес контракта, в котором будет прописан адрес Боба (обратите внимание на самую первую строчку Secret, она будет использоваться в конце):
btcatomicswap --testnet --rpcuser=x --rpcpass=y initiate mvTWA342sHDv2Gw18Y3uCZvUyhCkWdidzx 0.01
Secret: e57f544db3cabb663402ef0d13e75d51aee260d60cc83113bd8d53890d6030e2
Secret hash: 88625f20adf4ee3c6cf4d4e94b4212c3b5166c29972c7f8f20ff482188999b19
Contract fee: 0.00000146 BTC (0.00000646 BTC/kB)
Refund fee: 0.00000299 BTC (0.00001024 BTC/kB)
Contract (2N1zmStAMaKQBrv12L6d1gScqd7PdYA9bUx):
6382012088a82088625f20adf4ee3c6cf4d4e94b4212c3b5166c29972c7f8f20ff482188999b198876a914a3e2d1dc5def46f4baeed4f5671267ff2aa78af367041b67015db17576a914d34d1863ebc34df2a5bcd69c5a6042e8b46d2d8b6888ac
Contract transaction (779e559e379c2bfd2584949a2566fb1c3c2da5dfe3898dd7f00c7f624f741c08):
020000000001015b83fbe2d5ac6897bbe0318480029a9b43fa5278028268badf68e2f970dcc0220100000000feffffff025e956300000000001976a914ee4fccdf22ae7550a51009fac1e63fbc4fd4c91688ac40420f000000000017a9145ffd27277bbb9bf093f105e2e712afdb11ab0bbb870247304402205aa7a1cb690d56e142d4a0699ba07607079cbbb47911e15fe0fcb79128e449bb02205b2adfdaac3b145dc3a5f12138cb2ed3542be735bca1880d1aa2a99b3d316d72012103df970267136ef360e3d01b82ee4b3c53df86935ae7d1da260d7cb810e31ef00e00000000
Refund transaction (c0ba4fc619948640d5ae1a0a9f72eacfb5c1ef3548ce49e5a5b731c24d4d3a13):
0200000001081c744f627f0cf0d78d89e3dfa52d3c1cfb66259a948425fd2b9c379e559e7701000000cf4830450221009f320652c305e04248fa83ad0ae681f44b34738a2847ecdc081e8f9d0f193b4502207f2a93c1c99bc47bbf28d37e3bfe755addd51463ba1e73f616e27a583568309101210245117a4b18fe8c5134551789d9b3861273d319728b767cf00392ed9327e72824004c616382012088a82088625f20adf4ee3c6cf4d4e94b4212c3b5166c29972c7f8f20ff482188999b198876a914a3e2d1dc5def46f4baeed4f5671267ff2aa78af367041b67015db17576a914d34d1863ebc34df2a5bcd69c5a6042e8b46d2d8b6888ac000000000115410f00000000001976a914aaab0a283d5f317cee0c0b85e176a1a37917e37988ac1b67015d
Publish contract transaction? [y/N] y
Published contract transaction (779e559e379c2bfd2584949a2566fb1c3c2da5dfe3898dd7f00c7f624f741c08)
https://chain.so/add...1gScqd7PdYA9bUx (смотрим первую транзакцию)
Алиса передает бобу детали транзакции, выделенные жёлтым и зелёным цветами.
По предоставленным данным Боб проверяет транзакцию BTC:
btcatomicswap --testnet auditcontract 6382012088a82088625f20adf4ee3c6cf4d4e94b4212c3b5166c29972c7f8f20ff482188999b198876a914a3e2d1dc5def46f4baeed4f5671267ff2aa78af367041b67015db17576a914d34d1863ebc34df2a5bcd69c5a6042e8b46d2d8b6888ac 020000000001015b83fbe2d5ac6897bbe0318480029a9b43fa5278028268badf68e2f970dcc0220100000000feffffff025e956300000000001976a914ee4fccdf22ae7550a51009fac1e63fbc4fd4c91688ac40420f000000000017a9145ffd27277bbb9bf093f105e2e712afdb11ab0bbb870247304402205aa7a1cb690d56e142d4a0699ba07607079cbbb47911e15fe0fcb79128e449bb02205b2adfdaac3b145dc3a5f12138cb2ed3542be735bca1880d1aa2a99b3d316d72012103df970267136ef360e3d01b82ee4b3c53df86935ae7d1da260d7cb810e31ef00e00000000
Contract address: 2N1zmStAMaKQBrv12L6d1gScqd7PdYA9bUx
Contract value: 0.01 BTC
Recipient address: mvTWA342sHDv2Gw18Y3uCZvUyhCkWdidzx
Author's refund address: mznDECmwrNHTfpniUyKCALEj1KESruZGkX
Secret hash: 88625f20adf4ee3c6cf4d4e94b4212c3b5166c29972c7f8f20ff482188999b19
Locktime: 2019-06-12 20:56:59 +0000 UTC
Locktime reached in 47h50m9s
Итак, Боб видит, что в контракте прописан его адрес кошелька, предоставленный Алисе, правильная сумма, и то, что средства на контракте заблокированы на 48 часов. Secret hash понадобится далее.
Теперь Бобу нужно отправить 1 LTC на контрактный адрес, в котором будет прописан кошелек Алисы, используя тот же Secret hash.
ltcatomicswap --testnet --rpcuser=x --rpcpass=y participate mxk3okLqWGd8Y9DDjbxdm8ri1ZaJmkkuR4 1.0 88625f20adf4ee3c6cf4d4e94b4212c3b5166c29972c7f8f20ff482188999b19
Contract fee: 0.00003378 BTC (0.00013566 LTC/kB)
Refund fee: 0.00005972 BTC (0.00020522 LTC/kB)
Contract (Qb8ybmFm11ugzwWPeh7jyoCim9V7sZRjQQ):
6382012088a82088625f20adf4ee3c6cf4d4e94b4212c3b5166c29972c7f8f20ff482188999b198876a914bcf425a0d959c42374ebeb1a7a8b4d2386d60f166704841a005db17576a9145a51abf58bb5d2d553ac0f89b1fbcc34280428a66888ac
Contract transaction (c1fef84ef4d8cb4dc225bd04c3495fbb8fab83321703ef033a7d6919798a8e12):
02000000000101393314fc8c21938ca5488d1b542485085c3f0599eacbc79fd3a975542435d7fa010000001716001425a5b4f2cde04580eaeaa2933d72f752fb0a0607feffffff0200e1f5050000000017a9149f6e3b0fb71c85982bf33e65d187d6604d9d028e87cedba435000000001976a914fa9df5c9e8b6b637099a94950f667d76d84a6e3788ac024730440220613f097ffa86db044c40695420edb15deb5dc1a338402a32836ec299f80aa2d9022037ce68f3194dd793883b7451c0d3941b43d205895ebcfc6e8c6ba4314b834c720121031eabfa379db7e5e4bfc961b386dad39d8fb5bf38104da05d177039520b2e0a7c00000000
Refund transaction (27a6913dd8c5b46e9bb1df6d3060bf678e8799f1850e00505ff59aa0d0cc30ff):
0200000001128e8a7919697d3a03ef03173283ab8fbb5f49c304bd25c24dcbd8f44ef8fec100000000ce47304402203200f04ee3b12cb9e29e2b11f6fe6cf6ed6ead34558b06f31beb3f741ec992cc0220074fe0c938c0e92ec71b6c359599dab263c40405269123ddd3a0d008f2d5ecd40121022f9f3ed22f1313c6b618430c0034ddc91274b40d97f8ed2abd279687dfe556b2004c616382012088a82088625f20adf4ee3c6cf4d4e94b4212c3b5166c29972c7f8f20ff482188999b198876a914bcf425a0d959c42374ebeb1a7a8b4d2386d60f166704841a005db17576a9145a51abf58bb5d2d553ac0f89b1fbcc34280428a66888ac0000000001acc9f505000000001976a914328c21b8a5dd541430cc15b7a8a5992b8496db4788ac841a005d
Publish contract transaction? [y/N] y
Published contract transaction (c1fef84ef4d8cb4dc225bd04c3495fbb8fab83321703ef033a7d6919798a8e12)
https://chain.so/add...jyoCim9V7sZRjQQ (смотрим первую транзакцию)
Теперь Алиса проводит аудит контракта LTC:
ltcatomicswap --testnet auditcontract 6382012088a82088625f20adf4ee3c6cf4d4e94b4212c3b5166c29972c7f8f20ff482188999b198876a914bcf425a0d959c42374ebeb1a7a8b4d2386d60f166704841a005db17576a9145a51abf58bb5d2d553ac0f89b1fbcc34280428a66888ac 02000000000101393314fc8c21938ca5488d1b542485085c3f0599eacbc79fd3a975542435d7fa010000001716001425a5b4f2cde04580eaeaa2933d72f752fb0a0607feffffff0200e1f5050000000017a9149f6e3b0fb71c85982bf33e65d187d6604d9d028e87cedba435000000001976a914fa9df5c9e8b6b637099a94950f667d76d84a6e3788ac024730440220613f097ffa86db044c40695420edb15deb5dc1a338402a32836ec299f80aa2d9022037ce68f3194dd793883b7451c0d3941b43d205895ebcfc6e8c6ba4314b834c720121031eabfa379db7e5e4bfc961b386dad39d8fb5bf38104da05d177039520b2e0a7c00000000
Contract address: Qb8ybmFm11ugzwWPeh7jyoCim9V7sZRjQQ
Contract value: 1 BTC
Recipient address: mxk3okLqWGd8Y9DDjbxdm8ri1ZaJmkkuR4
Author's refund address: mokWwyA5mE3fLFoZQCed2qfdvBWxw96jVE
Secret hash: 88625f20adf4ee3c6cf4d4e94b4212c3b5166c29972c7f8f20ff482188999b19
Locktime: 2019-06-11 21:17:56 +0000 UTC
Locktime reached in 23h57m31s
Алиса видит тот же Secret hash, нужную сумму (то, что в логе написано BTC вместо LTC, это косяк разработчиков, простим им это) и то, что средства заблокированы на 24 часа.
Теперь Алиса может получить LTC Боба используя Secret (до этого момента этот ключ находился только у нее)
ltcatomicswap --testnet --rpcuser=x --rpcpass=y redeem 6382012088a82088625f20adf4ee3c6cf4d4e94b4212c3b5166c29972c7f8f20ff482188999b198876a914bcf425a0d959c42374ebeb1a7a8b4d2386d60f166704841a005db17576a9145a51abf58bb5d2d553ac0f89b1fbcc34280428a66888ac 02000000000101393314fc8c21938ca5488d1b542485085c3f0599eacbc79fd3a975542435d7fa010000001716001425a5b4f2cde04580eaeaa2933d72f752fb0a0607feffffff0200e1f5050000000017a9149f6e3b0fb71c85982bf33e65d187d6604d9d028e87cedba435000000001976a914fa9df5c9e8b6b637099a94950f667d76d84a6e3788ac024730440220613f097ffa86db044c40695420edb15deb5dc1a338402a32836ec299f80aa2d9022037ce68f3194dd793883b7451c0d3941b43d205895ebcfc6e8c6ba4314b834c720121031eabfa379db7e5e4bfc961b386dad39d8fb5bf38104da05d177039520b2e0a7c00000000 e57f544db3cabb663402ef0d13e75d51aee260d60cc83113bd8d53890d6030e2
Redeem fee: 0.00006633 BTC (0.00020472 LTC/kB)
Redeem transaction (0fe4da015fe6f4febe88630fe714819b8a1f7594586bf0f9ec38e0ed4d76b3f1):
0200000001128e8a7919697d3a03ef03173283ab8fbb5f49c304bd25c24dcbd8f44ef8fec100000000ef47304402202479c8e74a170f3b4f66c87fed9362e68cc1001b7a251a761fd6e7630ebdb7a9022069cbb14155eab556ac770ab6a623dbf834df677fcaec0c61915c33623481e23201210297eba1a42a4646c5ba79b509f7d66f3d26f71132bf45352084d4ef453297156d20e57f544db3cabb663402ef0d13e75d51aee260d60cc83113bd8d53890d6030e2514c616382012088a82088625f20adf4ee3c6cf4d4e94b4212c3b5166c29972c7f8f20ff482188999b198876a914bcf425a0d959c42374ebeb1a7a8b4d2386d60f166704841a005db17576a9145a51abf58bb5d2d553ac0f89b1fbcc34280428a66888acffffffff0117c7f505000000001976a91472792fc5053c26b2ce564a610fe9cc1c6329898288ac841a005d
Publish redeem transaction? [y/N] y
Published redeem transaction (0fe4da015fe6f4febe88630fe714819b8a1f7594586bf0f9ec38e0ed4d76b3f1)
Боб наблюдает за адресом контракта LTC в эксплорере, и когда с него уйдет транзакция Алисе, он должен найти в деталях транзакции tx_hex, из которого он теперь может получить Secret при помощи Secret hash.
btcatomicswap --testnet extractsecret 0200000001128e8a7919697d3a03ef03173283ab8fbb5f49c304bd25c24dcbd8f44ef8fec100000000ef47304402202479c8e74a170f3b4f66c87fed9362e68cc1001b7a251a761fd6e7630ebdb7a9022069cbb14155eab556ac770ab6a623dbf834df677fcaec0c61915c33623481e23201210297eba1a42a4646c5ba79b509f7d66f3d26f71132bf45352084d4ef453297156d20e57f544db3cabb663402ef0d13e75d51aee260d60cc83113bd8d53890d6030e2514c616382012088a82088625f20adf4ee3c6cf4d4e94b4212c3b5166c29972c7f8f20ff482188999b198876a914bcf425a0d959c42374ebeb1a7a8b4d2386d60f166704841a005db17576a9145a51abf58bb5d2d553ac0f89b1fbcc34280428a66888acffffffff0117c7f505000000001976a91472792fc5053c26b2ce564a610fe9cc1c6329898288ac841a005d 88625f20adf4ee3c6cf4d4e94b4212c3b5166c29972c7f8f20ff482188999b19
Secret: e57f544db3cabb663402ef0d13e75d51aee260d60cc83113bd8d53890d6030e2
Боб с помощью Secret теперь может получить BTC.
btcatomicswap --testnet --rpcuser=x --rpcpass=y redeem 6382012088a82088625f20adf4ee3c6cf4d4e94b4212c3b5166c29972c7f8f20ff482188999b198876a914a3e2d1dc5def46f4baeed4f5671267ff2aa78af367041b67015db17576a914d34d1863ebc34df2a5bcd69c5a6042e8b46d2d8b6888ac 020000000001015b83fbe2d5ac6897bbe0318480029a9b43fa5278028268badf68e2f970dcc0220100000000feffffff025e956300000000001976a914ee4fccdf22ae7550a51009fac1e63fbc4fd4c91688ac40420f000000000017a9145ffd27277bbb9bf093f105e2e712afdb11ab0bbb870247304402205aa7a1cb690d56e142d4a0699ba07607079cbbb47911e15fe0fcb79128e449bb02205b2adfdaac3b145dc3a5f12138cb2ed3542be735bca1880d1aa2a99b3d316d72012103df970267136ef360e3d01b82ee4b3c53df86935ae7d1da260d7cb810e31ef00e00000000 e57f544db3cabb663402ef0d13e75d51aee260d60cc83113bd8d53890d6030e2
Redeem fee: 0.00000332 BTC (0.00001022 BTC/kB)
Redeem transaction (bd712bce73744782cab652c7071dd7e8d86eb2496f57a3ad559b7bca286c8ab1):
0200000001081c744f627f0cf0d78d89e3dfa52d3c1cfb66259a948425fd2b9c379e559e7701000000f04830450221008d820dd20b0a848bc3dcbeda8d1ed8dc9ed691f57436f74e2b4042945c13c9f002200c304f62d8e9fcd765ae655cfbc906e4769f5842bfa990bb51392d2e0c0aa7ad012103f5bb4906b98d358131bf6d0f8b826416f51a786490ca180dc02499c52a8ad4fb20e57f544db3cabb663402ef0d13e75d51aee260d60cc83113bd8d53890d6030e2514c616382012088a82088625f20adf4ee3c6cf4d4e94b4212c3b5166c29972c7f8f20ff482188999b198876a914a3e2d1dc5def46f4baeed4f5671267ff2aa78af367041b67015db17576a914d34d1863ebc34df2a5bcd69c5a6042e8b46d2d8b6888acffffffff01f4400f00000000001976a914a165f4d0b3774c1f43abfd1cfb408708bc34579588ac1b67015d
Publish redeem transaction? [y/N] y
Published redeem transaction (bd712bce73744782cab652c7071dd7e8d86eb2496f57a3ad559b7bca286c8ab1)
Обратите внимание, что адреса, передаваемые друг другу в самом начале, так и оказались незадействованными. Монеты пришли на другие адреса, но, разумеется, их приватные ключи находятся в bitcoin/litecoin core.
А еще Алиса и Боб могут использовать Refund transaction, если одна из сторон начнет филонить, как оно работает пока не проверял. Скам со стороны Алисы невозможен, так как средства на ее контракте BTC залочены на сутки дольше, чем у Боба.
Фух, всем спасибо за внимание, спать пошел