独自のビットコイン支払いゲートウェイを作成する

更新 開かれた支払いゲートウェイ: github.com/Overtorment/Cashier-BTC



さまざまな理由により、既存の支払いゲートウェイ(Bitpayなど)が適さない場合があります。 この記事では、独自のビットコインゲートウェイをゼロから作成することを検討します。



読者はビットコインネットワークデバイスに精通していることを前提としています。 そうでない場合は、次の記事をお勧めします。 「ビットコインプロトコルの実際の仕組み」および「ビットコイン:開発者向け入門」



従来は、提案されたシステムを4つの部分に分割していました。





これらの操作を実行するには、私たちの生活を簡素化するソフトウェアソリューションのセットを選択する必要があります。

最も一般的で使用されているソリューションは、上記の操作のすべてまたはほぼすべてを実行できますが、ソリューションを組み合わせたり、特定の段階でバイクを作成したりすることを妨げるものはありません。



住所を操作する



一般に、楕円暗号をサポートする暗号ライブラリはこれを処理できます。



ビットコインを操作するための通常のビットコインライブラリも適しています。





ビットコインネットワークから情報を取得する



最も「重い」アイテム。

古典的な解決策は、独自の参照完全なビットコインノードを作成することです。これは標準的なビットコインでもあります。 これにより、JSON-RPCを介して彼と通信できるようになります。 これにより、ネットワークから情報を受信し、トランザクションをプッシュできます。

次のことに注意してください。



別の方法は、Ruby + PostgreSQLのフルノードの実装です。 非正規ですが、完全な互換性の実装に努めています。 追加のインデックスのため、データベースは220ギガバイト以上のスペースを占有することに注意してください。 繰り返しますが、ネットワークとの同期が必要です。

フルノードの他の実装があるかもしれません(私には不明です)。

別の方法は、パブリックプロバイダーAPIを使用することです。 ネットワークから情報を受信し、トランザクションをブロードキャストするのは彼の肩にかかっています。



今あります:







個人的には、いくつかのソリューションをフェールオーバーで接続することをお勧めします。



トランザクションの作成と署名



選択したメインライブラリに応じて、このライブラリはトランザクションを作成および署名できます。

自分で書くことができます。

「アドレスの操作」を参照してください。



トランザクション翻訳



トランザクションを作成して署名すると、バイナリデータ(16進数)が生成され、ネットワークにプッシュできる状態になります。 ネットワークがトランザクションを認識するまで、トランザクションがないことを考慮してください。 ネットワークがトランザクションを検出すると、未確認と見なされます。 1つのBitcoinノードにトランザクションを転送するだけで十分です。その後、ほとんどのBitcoinネットワークは数秒でトランザクションを確認します。

「アドレスの操作」セクション(一部のハードコーディングされたエンドポイントを使用)またはフルノードの一部のクライアントクライアントは、トランザクションを送信できます。 BitcoinプロバイダーのAPIの特別なページに移動して、トランザクションを特別な形式に移行することにより、手動でもトランザクションをブロードキャストできます。 通常、確認済みのトランザクションは、6つ以上の連続したブロック(または1〜3。非標準ですが高速)に含まれるトランザクションです。 手数料がゼロ(または不十分)の取引は、長期間(私の場合は1か月まで)承認されないままになる場合があります。 そのようなトランザクションは、定期的に中継されることが好ましい。



支払いゲートウェイの一般原則



オプション1



クライアントへの支払いのために送信された一意の請求書(請求書、注文)があり、クライアントがビットコインで支払うと仮定します。

最初に、元のアカウント通貨(たとえばUSD)をBTCに変換する必要があります。 タスクは簡単であり、我々はそれを考慮しません。

次。 事実上の標準は、注文ごとに新しい一意のビットコインアドレスを生成することです(アカウントであり、請求書でもあり、注文です)。 クライアントのみがこの口座に資金を送金し、1回のみ、厳密に指定された金額のみが送金されることが予想されます(これ以上、誰も気分を害することはありませんが、それ以下です)。 T.O. 指定されたビットコインアドレスに必要な量の資金を受け取ると、注文は支払われたと見なされます。



要するに、チェーンはこれです:







ビットコインがアドレスに到着すると、未確認または確認済みの残高をカウントするオプションがあります。

トランザクションがロールバックされる可能性はわずかですが、これは支払人(実際には攻撃者)の過失、または彼の制御できない状況が原因である可能性があります。



取引がキャンセルされた場合に、クライアントから提供された商品やサービスを「奪う」機会がある場合は、未確認の残高を計上することをお勧めします。 これは、クライアントに対するほぼ即時の支払いプロセスを意味します(たとえば、何時間も待つのではなく)。 また、結果として一部のトランザクションがロールバックされたように見える場合は、クライアントに返済を依頼し、サービス/製品を選択すると脅迫します。



そのような詐欺がすぐにあなたを追い越すと期待しないでください、トランザクションのロールバックは非常にまれであり、(手動で)そのようなロールバックを刺激することは(ところで、攻撃者は成功の保証がありません)技術的に精通した顧客にとっては非現実的です(クレジットカードチャージバックとは対照的に)



未確認の残高をカウントできるもう1つの例は、顧客の注文の準備に1時間以上かかる場合です(たとえば、ショッピングカートが処理され、宅配便による配達の準備が行われるなど)。 商品を発送する前に残高を再確認するのに多くの時間があります。



その他の場合は、特定のしきい値を入力できます。しきい値を超えると、確認済みの残高(0.25 BTCなど)を期待する必要があります。 信頼性を最大にするには、ゼロにします。



注文を閉じた後、オンデマンドでこのアドレスにビットコインを残すことができます。また、便宜上、商人の単一の「集合」ウォレットに転送することもできます。 後者の場合、「売上高」などの商業指標を損なう可能性があることに注意してください。 各支払い顧客は、支払いトランザクションを追跡できます。

転送の場合、アドレスからの秘密鍵を使用してトランザクションを作成、署名、ブロードキャストする必要があります。



注文の存続期間について一言。

あなたの製品またはサービスが、法定通貨(USDなど)の同等物に厳密に結び付けられている場合、為替レートの変動のため、注文の通常の有効期間は7〜15分です。



オプション2



支払いの請求書を発行しておらず、ユーザーのアカウントに単一の残高が含まれている場合に適しています。

ここでは、ユーザーのビットコインアドレスを生成し、表示する必要があります。

この場合、着信トランザクションのアドレスを監視し、ユーザーの内部残高がある場合はそれを補充する必要があります。

この場合、確認済みのトランザクション(3ブロック以上)のみをカウントすることをお勧めします。







セキュリティについて一言



ハッキングの場合、攻撃者は1つだけに関心があります。これらのアドレスからどこにでも資金を転送できるため、あなたが生成したアドレスからの秘密鍵です。

何らかの安全なストレージにメインシステムから隔離して保存することをお勧めします。 最終的には、ビットコインの収益を使用する(支出、現金への変換など)場合にのみ必要になります。



次は?



必要に応じて、取得したビットコインを取引所に自動的に入力し、取引所APIを使用して販売できます。 これを行うには、アドレスの秘密鍵を使用してトランザクションを作成、署名、ブロードキャストする必要があります。



それだけです。同様の問題を抱えている人たちに役立つことを願っています。

不正確な点や誤りの修正は、PMで歓迎されます。



All Articles