ブロックチェーン技術への没入:高速で安全なトランザクション

ブロックチェーン技術に基づいて開発されたロシアでの最初のプロジェクトに関する一連の記事を紹介します。 InspiRussiaハッカソンの参加チームにソリューションの技術的要素について尋ねました。



この記事では、ハッカソンの受賞者について説明します。ハッカソンはModulbankの開発チームによるプロジェクトで、銀行セクターの既存の問題を解決し、法人間で迅速かつ安全なトランザクションを実行するのに役立ちます。







一連の記事「ブロックチェーン技術への没入」



1. Emerテクノロジーに関する一連の資料:

1.1。 EmerCoinの秘密

1.2。 分散型の無修正ドメインネームシステム

1.3。 世界規模の公開鍵インフラストラクチャ

1.4。 分散パスワードレスセキュリティシステム

2. 高速で安全なトランザクション

3. デジタル歯科のエコシステム

4. 偽造品との戦い

5. 相互動物保険

6. ICOとは何か、そしてそれを行う方法

7.読み込み中...



ブロックチェーン技術を使用して解決できる銀行セクターの問題



プロジェクトの代表者は銀行セクターで働いているため、法人間の決済の問題に精通しています。このプロセスには最大3日間かかります。これは、中小企業や起業家にとっては非常に長い時間です。 さらに、今日の銀行には別の問題があります。企業間の現金以外の支払いの一部は、ブラックマネーの「トランジット」です。 通常、トランザクションチェーンとそれらの間の接続がないため、判断するのは非常に困難です。 他の銀行のお金の動きの歴史はありません。 銀行は、このようなトランザクションを識別するためのさまざまな分析アルゴリズムを考え出します。 しかし、完全な分析のための十分なデータがないため、それらはしばしば誤っています。 同様に、ブロックチェーンネットワークは、単一の分散トランザクションストアを意味します。 これは、各支払いが資金移動の単一のベースに永遠に残ることを意味するため、キャッシュフロー全体が常に分析に利用できます。







支払率



支払いの速度の問題は、ブロックチェーン内のトランザクションが即座に発生するという事実によって解決されます。 唯一の遅延要因は、受信側が他のネットワーク参加者(PoW)から来るため、このトランザクションの確認を待機する時間です。



トランザクションのセキュリティ



トランザクションセキュリティは、前のブロックの計算されたチェックサムがブロックチェーン内のデータの各ブロックに埋め込まれているため、各ブロックには前のブロックへのリンクがあります。 この機能のおかげで、ブロックチェーンテクノロジーは、トランザクションの透明性を大幅に、そしてさらに根本的に高め、検証手順(マネーロンダリングとテロ資金調達との戦いの観点から)をシンプルかつ効果的にすると考えています。



ハッカソンでは、アカウント間のキャッシュフローの分析を簡素化するソリューションがテストされました。トランザクションが各アカウントを通過すると、「お金」はこのアカウントの特別な一意のラベルでマークされました。 したがって、ネットワークを通過するすべてのルーブルは、すべてのラベルの末尾だけでなく、通過するすべてのアカウントのシーケンスもプルできます。 このソリューションは、ブロックチェーンネットワークの他の利点(速度、セキュリティ、単一のトランザクションデータベース)とともに、不透明な資金の流れを排除し、金融コンソーシアムの枠組みの中でいつでも明確に彼らの動きのルートを復元することを可能にします。



アイデアの実装



チームの主な目標は、彼らのアイデアがエンドユーザーのために機能していることを示すことでした。そのため、明確にするために、モバイルデバイス用のクライアントアプリケーション、銀行および規制当局用のWebアプリケーションを作成しました。 バックエンドでは、Azure Blockchain as a Serviceに基づくイーサリアムネットワーク(ブロックチェーンに基づいた分散型オンラインサービスを作成するためのプラットフォーム)を展開することが決定されました。



iOS用の翻訳用モバイルアプリケーションがObjective-Cで作成されました。 Web監視アプリケーション-Angular上。 バックエンド統合では、C#言語とVisual Studioツールを使用しました。



実装されたシステムのアーキテクチャは非常に単純です。 以下に彼女を見ることができます。







Microsoft Azureを選ぶ理由



Ethereum-DevTest Labs for Blockchain as a Serviceに必要なすべてのインフラストラクチャを展開するための既製のテンプレートがあるため、Microsoft Azureが選択されました。 このテンプレートは、AzureにUbuntuの仮想マシンをデプロイします。この仮想マシンの内部では、イーサリアムネットワークが標準リポジトリからデプロイされ、その後、アーティファクトを使用して操作のパラメーターが構成されます。



なぜイーサリアムなのか?



.NET WebApiはクライアントアプリケーションをイーサリアムネットワークに接続するために使用されていたため、イーサリアムネットワークにアクセスするための既成のソリューションであるNethereumを使用すると非常に便利です。 現在のソリューションに対するイーサリアムの主な利点は、プログラム可能なスマートコントラクトです。 それらを作成するために、Visual Studio用の便利なツールSolidity拡張機能があります。 追加の利点は、バックエンドアプリケーションもAzureのWebサービスに簡単にデプロイできることです。



ブロックチェーンネットワーク展開



最も難しく、同時に興味深いのは、ブロックチェーンネットワークを展開するタスクでした。 このため、DevTest Labsテンプレートが使用されました。これにより、Ethereumを最小限の労力でAzureにデプロイできます。多くのことが自動的に行われるためです。







実際、これを使用すると、Ethereumネットワークを展開する準備が完全に整ったリソースグループが作成されます。 しかし! 彼女は仮想マシンを作成しません。 ソリューションは簡単です-[追加]をクリックして、新しいリソースを選択して追加します-Ubuntu Server 14.04上の仮想マシン:







約5分後、ブロックチェーンネットワークを展開するための既製の環境が表示されます。







注:ここでは、仮想マシンを作成する前にアーティファクトを接続することにより、Ethereumネットワークの展開を完全自動モードで実行できることに言及する価値があります。 この記事では、この方法について説明します。 ただし、ハッカソンに提供されたAzureテストアカウント内では、このオプションは使用できませんでした。 したがって、ネットワークは手動で展開されました。



次に、準備されたスクリプトを使用して、SSHクライアントを介して仮想マシンにアクセスし、いくつかのコマンドを実行します(Ethereumリポジトリの追加、パッケージのリストの更新、Ethereumのインストール)。



sudo add-apt-repository -y ppa:ethereum/ethereum sudo apt-get update sudo apt-get install ethereum
      
      





次に、すべてを実行する必要があります。 これを行うには、次のコマンドを使用してスクリプトを仮想マシンに送信します。



 pscp "C:\path to your scripts folder\*" <username>@<server_ip>:./
      
      





次に、以下を実行してイーサリアムネットワークを開始します。



 sh seed-blockchain.sh
      
      





ここでは、ネットワークを作成するときに、次を含むlab-seed.json



ジェネシスファイルがlab-seed.json



れます。



 { "config": { "homesteadBlock": 10 }, "alloc": {}, "nonce": "0x0000000000000042", "difficulty": "0x0400", "mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578", "coinbase": "0x0000000000000000000000000000000000000000", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82ee", "gasLimit": "0x4c4b40" }
      
      





その後、最初のアカウントを作成します。



 geth --datadir "chains/devtest" account new
      
      





そして、マイニングを開始します。



 geth --mine --identity "Node1" --datadir "/home/deathys/chains/devtest/" --nodiscover --rpc --rpccorsdomain "*" --networkid 552 console
      
      





その結果、マイニングプロセスの開始が確認されました。ネットワーク上に新しいブロックが作成されます。 現在、トランザクションはありません。







注:マイニングがネットワークで発生しない場合、ネットワークはそのネットワークで作成されたトランザクションが確認されることを考慮しないことに注意してください。



仮想マシンの準備ができたので、「ネットワーク」自体に没頭できます。 マイニングを停止しないために、並列セッションでマイニングに接続します。 接続するコマンドは、 attachOne.sh



スクリプトでattachOne.sh



ます。 マイニングは本格的なものであるため、標準的なネットワーク通貨であるオンエアで報酬を受け取ります。 現在、ソリューションをテストするためのエーテルの数は次のとおりです。







注:実際、これはホームステッドの「プロダクション」にとってかなり印象的な量です。 ハッカソンの時点で、1つのエーテルのコストはC $ 17に近づいていました。



ブロックチェーン分散ネットワーク



分散ブロックチェーンネットワークを展開するには、少なくとも1つ以上の仮想マシン(ノード)が必要です。 ネットワークの2番目のノードを上げるには、メインノードの作成と同様のすべての手順を実行する必要があります。



さらに、Azureの[ネットワークセキュリティグループ]セクションで、イーサリアムネットワークが機能する発信ポートと着信ポートを開く必要があります。 [受信セキュリティ規則]セクションで、ポート30303および34964を開きます。







次に、ノードを接続して、ネットワーク上でお互いが見えるようにします。 これを行うには、ノードの1つを接続する一環として、コマンドを入力して、あるノードを別のノードに導入する必要があります。



 admin.addPeer("enode://<nodeid>@<ip address>:30303")
      
      





表示されたノードのIDを確認するには、接続の一部としてコマンドを実行する必要があります。



 admin.nodeInfo.enode
      
      









これで、分散ブロックチェーンネットワークが作成され、アカウント間で暗号通貨の転送を開始できます。



さらに面白くするために、さらにアカウントを作成します。



 personal.newAccount()
      
      









その結果、以下が得られます。







今、それらの間でエーテルを転送することができますが、1つの警告があります-あるアカウントから別のアカウントにお金を転送するには、転送元のアカウントからロックを解除する必要があります。 アカウントのロックは自動的に設定されます。 これは、アカウントの使用の安全性を確保するために行われます。



 personal.unlockAccount('0xa2081622fcc99aec3c1efb575b548c90bdadf8cf','12345678', 0)
      
      





ここで、最初の引数はアカウントのアドレス、2番目はパスワード、最後の引数はアカウントがロック解除される時間です(0を指定すると、イーサリアムネットワークへのこの接続の存続期間中、アカウントはロック解除されます)。 接続が中断されると、アカウントはすぐにブロックされます。







トランザクションの作成に進みます。



 eth.sendTransaction({from: “0xa2081622fcc99aec3c1efb575b548c90bdadf8cf", to: "0x847a20cdec0b3ba98aced771bd1df7e8a2e004f5", value: web3.toWei(1, "ether")})
      
      





この場合、アカウント間で1つのエーテルを転送します。 呼び出しに応答して、すべてがうまくいった場合、トランザクションアドレスが返されます。







このアドレスでは、トランザクションに含まれるデータをリクエストできます。



 eth.getTransaction('0x88839260b77b250458731ba07d351753aba5042dd22c8420a1f6f104f3deede9')
      
      









次に、宛先アカウントの残高を見てみましょう。







ネットワークが正常に機能していることがわかります。 クライアントアプリケーションを固定します。 これにはSSHクライアントを使用できます。 使用例:



 using (var client = new SshClient(hostUrl, 22, userName, pass)) { client.Connect(); string commStr = @"curl http://localhost:8545 -X POST --data '{""method"": ""eth_sendTransaction"", ""params"": [{ ""from"": ""0xa2081622fcc99aec3c1efb575b548c90bdadf8cf"", ""to"": ""0x847a20cdec0b3ba98aced771bd1df7e8a2e004f5"", ""gas"": ""0x76c0"", ""gasPrice"": ""0x9184e72a000"", ""value"": ""0x9184e72a"", ""data"": ""bla bla"" }], ""id"":1}'"; var comm = client.RunCommand(commStr); client.Disconnect(); }
      
      





これは、 curl



コマンド(実際にはネットワークへのRPCリクエスト)を使用して、あるアカウントから別のアカウントに資金を転送するコードの一部です。 応答として、作成されたトランザクションのデータを使用してJSON形式でコマンドを実行した結果を取得します。



おわりに



産業用アプリケーションでは、口座から口座への資金移動の完全なパスを確立できるインテリジェントな分析アルゴリズムを導入および開発する必要があるため、すべてがはるかに複雑になります。 また、ブロックチェーンプラットフォーム上のこのソリューションと銀行内の既存のサービスとの相互作用を考慮する必要があります。



この記事では、アカウント間のエーテル転送のみを示しました。 あるアカウントから別のアカウントにエーテルが転送される方法は、すでに将来の記事のトピックです。



下の写真では、素材の著者であるレビン・デニス、アナスタシエフ・スヴィアトスラフ、アンドレイ・バリコフがModulbankの開発チームです。










All Articles