Покрокова інструкція: застава для угод в bitcoin

Bitcoin дуже зручний і надійний для зберігання грошей, але як проводити в ньому угоди? Традиційні способи включають залучення довіреної третьої сторони. Виявляється, bitcoin так могутній, що це зовсім не обов'язково. Нижче я розповім, як двом людям, не довіряють один одному, провернути операцію в bitcoin без залучення третіх сторін.

esrowbitcoin


Спочатку розглянемо існуючі способи.

Переклад bitcoin в звичайні гроші для покупки
Користуючись цим способом, ми покладаємося на наявні юридичні механізми захисту продавця і покупця від шахрайства з боку один одного. Порушується принцип виключення третіх сторін, втрачається можливість анонімності, додаються комісії з перекладу. Крім того, для економіки битконов краще, щоб угоди оплачувалися безпосередньо в bitcoin.

Залучення гаранта
Гарант — третя сторона, якій довіряють обидві сторони угоди. Покупець віддає гроші гаранту, продавець віддає товар гаранта, після чого гарант віддає гроші продавцю, а товар — покупцеві. Ця схема теж не особливо гарна. Репутація гаранта залежить від числа успішних угод, а кількість угод зростає по мірі збільшення репутації. Виходить система з позитивним зворотним зв'язком, що призводить до скорочення числа гарантів та централізації системи, від якої хотілося позбутися.

Як провести операцію без участі третьої сторони
Я веду до того, що третім сторонам в угоді взагалі не місце. Є покупець і продавець, є система bitcoin. На цій самодостатньою системою то і справа паразитують банки, обмінники, юристи, гаранти і т. д. А адже в протоколі bitcoin все необхідне для страхування угод вже є.

Алгоритм дуже простий: обидві сторони переводять гроші в заставу. Якщо операція проходить успішно, застава повертається, інакше пропадає.

Для початку нам знадобиться познайомитися з поняттям multisig-адреси. Для списання грошей з multisig-адреси потрібно кілька підписів. Популярні multisig-адреси 2/2 та 2/3. У разі адреси 2/2 потрібні два підписи з двох, у разі 2/3 — два підписи з трьох.

Покупець і продавець створюють multisig-адреса 2/2 і переводять туди заставу. Жоден з них не зможе повернути заставу без згоди іншого. Після цього відбувається власне угода (будемо вважати що це купівля товару або надання послуги за bitcoin). Якщо угода завершується успішно (покупець отримав товар, продавець отримав оплату), то учасники угоди забирають заставу. Якщо під час операції відбувається конфлікт або хтось з учасників пропадає, то обидва втрачають заставу.

Учасники угоди залежать один від одного. Ризик втратити заставу — не менш сильний аргумент, ніж закон, на якому тримаються звичайні операції. Не кожен зупиниться перед порушенням закону, але ніхто не захоче втратити заставу. По-моєму, в економіці гроші — це самий вагомий аргумент. Немає сенсу шахраювати, якщо це завідомо призводить до збитків.

Щоб ця схема працювала, сума застави повинна перевищувати ціну товару. Інакше та із сторін, яка першою отримає товар або оплату, може махнути рукою на заставу і прірва. Мені здається, що сума застави з кожної сторони повинна бути в 2 рази більше ціни товару.

Ще один підводний камінь: коли один учасник перевів заставу на multisig-адреса 2/2, другий учасник може пропасти. Виходить негарна ситуація: з одного боку збитки, з іншого нічого. На щастя, bitcoin дозволяє застрахуватися від подібних недобросовісних клієнтів або жартівників — переказ грошей на multisig-адреса 2/2 повинен проходити єдиної транзакцією, підписаній обома учасниками. Або обидва внесуть заставу, або ніхто не внесе.

Підсумкова схема виглядає так:
esrow

Нехай товар коштує 1 BTC. Застава: по 2 BTC з кожної сторони.

  1. Аліса і Боб створюють спільний multisig-адреса 2/2, який буде використовуватися для зберігання застави.
  2. Аліса і Боб разом підписують транзакцію, яка переводить 2 BTC з гаманця Аліси на multisig-адресу і 2 BTC з гаманця Боба на multisig-адресу.
  3. Власне угода:
    • Аліса надає Бобу послуги вартістю 1 BTC.
    • Боб переводить Алісі 1 BTC.

  4. Аліса і Боб забирають заставу з multisig-адреси на свої гаманці.
Ця схема з заставою — «обгортка» для будь-якої угоди. Зауважимо, що всі накладні витрати зводяться до двох транзакцій bitcoin (поповнення застави та повернення застави). Якщо врахувати ще дві транзакції, поповнюють гаманці, які беруть участь в угоді (див. нижче розділ «Підготовка»), то всі втрати, пов'язані із заставою, дорівнюють 4-му комісіям bitcoin, тобто 0.0004 BTC (приблизно 8 рублів за нинішнім курсом). Якщо угода вимагає особистої присутності учасників, то дії, пов'язані із заставою, можуть бути виконані до і після особистої зустрічі. Крім того, учасникам угоди буде комфортніше на особистій зустрічі, якщо вони вже пов'язані заставою, а не просто сторонні люди. Описаний метод працює і тоді, коли угода не вимагає особистої зустрічі (приклад: мешканець однієї країни передає інтелектуальний продукт жителю іншої країни). Кілька послідовних операцій можна захистити одним заставою.

Практична реалізація
Графічні програми, які я перевірив, не надають зручного інтерфейсу для проведення двох транзакцій, описаних вище (програми bitcoin-qt і Electrum). Вирішив пошукати веб-рішення і практично відразу знайшов веб-клієнт coinbin, заснований на бібліотеці BitcoinJS. Клієнт не залежить від сервера розробника і не зберігає ключі віддалено. Крім того, coinbin можна завантажити і використовувати локально або завантажити на свій сервер. E-mail і пароль використовуються як seed для генерації адреси і не запам'ятовуються. Щоб завести кілька адрес, треба використовувати кілька пар (E-mail, пароль). Щоб не втратити доступ до гаманця, треба робити резервну копію E-mail і пароля, наприклад KeePassX.

Мені вдалося здійснити трансакції, необхідні для страхування угоди. Нижче я наведу покрокову інструкцію.

Підготовка

  1. Аліса і Боб заводять гаманці на coinbinregister
  2. Дивляться ключі, записують свої приватні ключі, говорять один одному публічні ключі і адресиkeys
  3. Вносять суму застави на свої адреси coinbin (0.01 BTC з кожного)add money
  4. Аліса створює multisig 2/2 адресу
    • Вибирає меню MultiSig Addressmenu-multisig-address
      Відкривається така форма:
      new-multisig-address
    • Заносить у форму публічні ключі себе і Бобаnew-multisig-address-2
    • Записує одержаний адресу і Redeem Script і передає їх Бобуmultisig address and redeem script
  5. Боб перевіряє Redeem Script
    • Вибирає розділ Verifyverify
    • Вводить Redeem Script і перевіряє публічні ключі, адреса і Required Signatures = 2verify Redeem Script
      Примітка: Боб знає свій публічний адресу, а публічний адреса Аліси отримав на кроці 2. Адреса гаманця multisig Боб отримує від Аліси одночасно з Redeem Script. Required Signatures — це кількість підписів, необхідна для здійснення вихідної транзакції з адреси multisig. В даному випадку це число дорівнює 2 (учасників угоди 2, потрібні підписи обох з них).

Приміщення грошей в заставу

  1. Аліса готує транзакцію на адресу multisig 2/2 (поповнення застави)
    • Вибирає меню Transactionmenu-transaction
    • Заходить в додаткові опції, знімає галочку Clear existing inputs...transaction-clear-безконтрольно
    • Заносить в Inputs перший платить адреса (Аліси)transaction-address-loaded
    • Заносить в Inputs другий сплачує адреса (Боба)transaction-second-address-loaded
    • Заносить в Outputs адреса multisig 2/2 та загальну суму застави за вирахуванням комісії bitcointransaction-output-multisig-entered
    • Отримує Transaction Script і передає його Бобу для перевіркиtransaction-script
  2. Боб перевіряє Transaction Script
    • Вибирає розділ Verifyverify
    • Вводить Transaction Script і знаходить в Outputs адреса multisig і сумуverify Redeem Script
  3. Аліса і Боб по черзі підписують Transaction Script
    • Аліса вибирає розділ Signsign
    • Аліса вводить Transaction Script і свій приватний ключsign Alice by
    • Аліса отримує частково підписану транзакцію і пересилає її Бобуsign by Alice script
    • Боб знову перевіряє транзакцію і переконується, що адресу призначення і сума не змінилися
    • Боб доподписывает транзакцію(дії аналогічні діям Аліси, але вводить частково підписану транзакцію)

      sign by Bob script
    • Боб знову перевіряє транзакцію і переконується, що колонка Signed скрізь відзначенаverify tx 1 signed
    • Боб вибирає розділ BroadcastBroadcast
    • Боб вводить Transaction Script і натискає SubmitBroadcast
Тепер гроші поміщені в заставу і можна перейти до операції як такої.

Повернення грошей із застави

Якщо угода зірвалася, то обидві сторони втрачають заставу. (Це і є основна ідея — змусити іншу сторону сумлінно виконувати умови угоди під страхом втратити заставу.) Якщо операція завершилася успішно, то треба повернути заставу — це можливо тільки за згодою обох сторін.

  1. Аліса готує транзакцію з адреси multisig 2/2 (повернення застави)
    • Вибирає меню Transactionmenu-transaction
    • Видаляє всі входи і виходи, що залишилися від минулого транзакціїtransaction-2-empty
    • Заносить в перше поле Redeem Script (див. розділ Підготовка)transaction 2 Redeem Script
    • Заносить в Outputs отримують адреси Аліси і Боба і сумиtransaction outputs 2
    • Отримує Transaction Script і передає його Бобу для перевіркиtransaction-script
  2. Боб перевіряє Transaction Script (знаходить свій отримує адресу і суму)
  3. Аліса підписує Transaction Script і передає Бобу
  4. Боб знову перевіряє Transaction Script (знаходить свій отримує адресу і суму)
  5. Боб підписує Transaction Script і результат транслює (broadcast)
Гроші переміщені з застави на отримують адреси Аліси і Боба. Угода завершена.

Висновки
Даний алгоритм допомагає захиститися від шахрайства, оскільки в разі його заставу втрачають обидва. Даний захист не вносить третіх сторін на відміну від традиційних способів. Накладних витрат майже немає, якщо не вважати необхідність зрозуміти довгий алгоритм і навчити йому іншу сторону угоди. Насправді нічого складного там немає: мені знадобилося провести пару «угод» з самим собою, щоб повністю освоїтися.

Вітаються пропозиції щодо поліпшення алгоритму і, автоматизує алгоритм більшою мірою.

GitHub розробника: github.com/OutCast3k/coinbin
Адреса Bitcoin розробника: 1CWHWkTWaq1K5hevimJia3cyinQsrgXUvg
Моя адреса Bitcoin: 1CsfihQGy5kg3nnTJLzfmNDiPGqiQgdemz

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.