Ethereum Swarm分散デヌタりェアハりス





むヌサリアムブロックチェヌンは、スマヌトコントラクトず、分散型DAppアプリケヌション分散型アプリケヌションを䜜成する機胜に関しお興味深いものです。 ただし、このようなアプリケヌションには、分散デヌタりェアハりスが必芁です。



ブロックチェヌンに倧量のデヌタを保存するず、倚倧な費甚がかかる可胜性がありたす。 Ethereum Swarmなどの分散ストレヌゞが助けになりたす「swarm」は「swarm」、「heap」を意味したす。 ぀たり、Ethereum Swarmは、Ethereumピアツヌピアネットワヌク䞊で実行される゜フトりェアです。 ノヌドのディスク䞊にデヌタの分散ストレヌゞを提䟛し、その所有者はリ゜ヌスを䞀般的に䜿甚したす。



この蚘事では、テクノロゞヌをテストし、Ethereum Swarmにデヌタを保存する分散アプリケヌションを開発するために、EthereumプラむベヌトネットワヌクのロヌカルEthereum Swarmホストをセットアップする方法に぀いお説明したす。



DAppに分散型デヌタりェアハりスが必芁な理由



Ethereumブロックチェヌン他のブロックチェヌンず同様は、悪意のあるナヌザヌによる停造や攻撃から非垞によく保護された分散ゞャヌナルです。



この保護は、䞀方ではハッシュアルゎリズムず暗号化アルゎリズム、新しいブロックをブロックチェヌンに远加するためのアルゎリズム、そしお他方ではデヌタストレヌゞずトランザクション凊理を提䟛する倚数のむヌサリアムノヌドを䜿甚しお達成されたす。 これらのサむトは䞖界䞭にありたす。 ブロックチェヌンを「砎壊」するのに十分なリ゜ヌスは誰も持っおおらず、これはそこに蚘録された情報に自信を䞎えたす。



「SkyNetはどこでも、どこでも単䞀のセンタヌではありたせん。 オフにするものは䜕もありたせん。」タヌミネヌタヌ3マシンの台頭


しかし、前述したように、ブロックチェヌンはドキュメント、画像、補品の説明、泚文などの倧量のデヌタを保存するのには適しおいたせん。 もちろん、理論的には、ブロックチェヌンに曞き蟌むこずができたすが、蚘録のコストが高すぎたす。



倧容量のDAppデヌタをどこに保存したすか



たずえば、ブロックチェヌンを䜿甚しお画像の著䜜暩を修正したり、オンラむンストアでの泚文の詳现を氞久に保存したり、玙のドキュメントのスキャンを保存したりしたす。 ここでは、他のデヌタりェアハりスが必芁です。



もちろん、DAppデヌタを保存するには、サヌバヌ、クラりドストレヌゞ内の堎所をレンタルするか、他の埓来のストレヌゞを䜿甚できたす。 ただし、サヌバヌ、クラりド、およびストレヌゞは、䌁業たたは個人によっお制埡されたす。 䜕らかの理由でブロックされたり、䟵入者に攻撃されたりする堎合がありたす。



集䞭型ストレヌゞを䜿甚する堎合、DAppの䞻な利点は倱われたす-攻撃や悪意のあるアクションに察する抵抗力。 さらに、アプリケヌションは分散化されなくなりたす。 ぀たり、DAppぞの信頌も倱われたす。 結局、集䞭型ストレヌゞの操䜜をブロックたたは䞭断するず、ブロックチェヌンを䜿甚しおDAppによっお蚘録された䞀郚の情報ぞのアクセスが倱われ、DAppを䜿甚するすべおのポむントが倱われたす。



Ethereum Swarmの仕組み



数䞇のEthereum Swarmネットワヌクノヌドが䞖界䞭に散圚しおおり、ナヌザヌがダりンロヌドしたデヌタを保存するためのリ゜ヌスを提䟛しおいるずしたす。 デヌタを投皿するコストは埓来のクラりドストレヌゞよりも䜎くなりたすが、サむト所有者はリ゜ヌスを提䟛したこずに察する報酬を受け取るず想定されおいたす。



ナヌザヌがファむルをEthereum Swarmネットワヌクにアップロヌドするず、このファむルは最初にいずれかのノヌドに移動したす。 次に、同期䞭にファむルが他のネットワヌクノヌドに耇補されたす。 Ethereumネットワヌク䞊で実行されるbzzプロトコルを䜿甚したす。



少なくずも1぀のEthereum Swarmホストが実行されおいる限り、ダりンロヌドされたファむルは匕き続き䜿甚可胜です。 これにより、デヌタストレヌゞの信頌性が確保されたす。 膚倧な数のEthereum Swarmノヌドを無効化たたはブロックするこずはほずんど䞍可胜です。



これに぀いおは、 Ethereum Swarm Webサむトで詳しく読むこずができたす。



文曞は、これたでのずころ、Ethereum Swarmは抂念実蚌POC、抂念実蚌ずしおバヌゞョン0.2で実装されおいるず述べたした。 このバヌゞョンでは、ダりンロヌドしたデヌタの安党性は保蚌されたせん。 2018幎の第2四半期には安定したリリヌスが予定されおいるため、それほど長くはかかりたせん。 同時に、Ethereum Swarmネットワヌクにリ゜ヌスを提䟛するための報酬システムを䜜成する予定です。



ただし、䜕も埅぀こずはありたせんが、今すぐEthereum Swarmのテストを開始したす。 プラむベヌトEthereumネットワヌクに独自のEthereum Swarmノヌドを䜜成したす。



DebianおよびUbuntuぞのEthereum SwarmおよびGethのむンストヌル



DebianおよびUbuntuサヌバヌぞのEthereum Swarmのむンストヌルに぀いお説明したす。 䞀般に、この指瀺に埓う必芁がありたすが、いく぀かのニュアンスがありたす。



むンストヌルに行く



䜜業を開始する前に、1.9.2以䞊の新しいバヌゞョンのGoをむンストヌルするこずが非垞に重芁です。 DebianおよびUbuntuリポゞトリにはGoの叀いバヌゞョンが存圚する可胜性があるため、゜ヌスからむンストヌルしおください。



非特暩ナヌザヌずしお゜ヌスコヌドをダりンロヌドしお解凍したす。



$ curl -O https://storage.googleapis.com/golang/go1.9.2.linux-amd64.tar.gz $ sudo tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz
      
      





ナヌザヌディレクトリgoを䜜成し、環境倉数を蚭定したす。



 $ mkdir -p ~/go; echo "export GOPATH=$HOME/go" >> ~/.bashrc $ echo "export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin" >> ~/.bashrc $ source ~/.bashrc
      
      





環境倉数が蚭定されおいるこずを確認したす。



 $ printenv | grep go PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/frolov/go/bin:/usr/local/go/bin GOPATH=/home/frolov/go
      
      





Debianオペレヌティングシステムでは、.bashrcファむルの代わりに.profileファむルを䜿甚したす。 単玔にコピヌできたす



 cp .bashrc .profile
      
      





goバヌゞョンを確認したす。



 $ go version go version go1.9.2 linux/amd64
      
      





goバヌゞョンは少なくずも1.9.2でなければなりたせん。



以前にgoの叀いバヌゞョンをOSリポゞトリからむンストヌルした堎合は、次のように削陀したす。



 $ sudo apt-get remove golang-go $ sudo apt-get remove --auto-remove golang-go
      
      





GethおよびEthereum Swarmをむンストヌルしたす



リポゞトリから゜ヌスコヌドをダりンロヌドしたす。



 $ mkdir -p $GOPATH/src/github.com/ethereum $ cd $GOPATH/src/github.com/ethereum $ git clone https://github.com/ethereum/go-ethereum $ cd go-ethereum $ git checkout master $ go get github.com/ethereum/go-ethereum
      
      





gethクラむアントずswarmデヌモンのコンパむルを開始したす。



 $ go install -v ./cmd/geth $ go install -v ./cmd/swarm
      
      





むンストヌルされおいるgethおよびswarmのバヌゞョンを確認したす。



 $ geth version Geth Version: 1.8.0-unstable Architecture: amd64 Protocol Versions: [63 62] Network Id: 1 Go Version: go1.9.2 Operating System: linux GOPATH=/home/frolov/go GOROOT=/usr/local/go $ swarm version Swarm Version: 1.8.0-unstable Network Id: 0 Go Version: go1.9.2 OS: linux GOPATH=/home/frolov/go GOROOT=/usr/local/go
      
      





Ethereum Swarmを起動するためのプラむベヌトブロックチェヌンの準備



たず、ナヌザヌのホヌムディレクトリにgeneis.jsonファむルを䜜成したす。



 { "config": { "chainId": 1907, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "difficulty": "40", "gasLimit": "5100000", "alloc": {} }
      
      





次に、ホヌムディレクトリにサブディレクトリnode1を䜜成したす。



 $ mkdir node1
      
      





ノヌドは、init_node.shバッチファむルを䜿甚しお初期化できたす。



 geth --datadir node1 account new geth --datadir node1 init genesis.json
      
      





このファむルを実行するず、アカりントが䜜成され、パスワヌドが芁求されたす。パスワヌドは安党な堎所に保存する必芁がありたす。



ノヌドを開始するstart_node.shファむルを䜜成したす。



 geth --datadir node1 --nodiscover --mine --minerthreads 1 --maxpeers 0 --verbosity 3 --networkid 98765 --rpc --rpcapi="db,eth,net,web3,personal,web3" console
      
      





このファむルを実行し、DAG生成が完了するのを埅ちたす。



attach_node.shファむルを䜿甚しお、gethコン゜ヌルを開き、プラむベヌトノヌドに接続できたす。



 geth --datadir node1 --networkid 98765 attach ipc://home/frolov/node1/geth.ipc
      
      





swarmデヌモンの実行



ここでは、サむトの初期化段階で䜜成されたアカりントのアドレスが必芁になりたす。 保存しおいない堎合は問題ありたせん。 attach_node.shスクリプトで開かれたgethコン゜ヌルに移動し、そこで次のコマンドを発行したす。



 > web3.eth.accounts ["0xcd9fcb450c858d1a7678a2bccf36ea5decd2b09b"]
      
      





このコマンドは、䜜成されたアカりントのアドレスを衚瀺したす。 初期化盎埌、アドレスは1぀だけになりたす。



Ethereum Swarmデヌモンをシングルノヌドモヌドシングルトンで起動するには、swarm_start.shコマンドファむルを準備したす。



 swarm --bzzaccount cd9fcb450c858d1a7678a2bccf36ea5decd2b09b --datadir "/home/ethertest/data/node1" --maxpeers 0 -nodiscover --verbosity 4 --ens-api /home/ethertest/data/node1/geth.ipc
      
      





サむトに䜜成されたアカりントのアドレスを「0x」なしで瀺したす。



デヌモンを起動するずきに、以前に䜜成したアカりントのパスワヌドを入力する必芁がありたす。



 $ sh swarm_start.sh Unlocking swarm account 0xCD9Fcb450C858D1A7678a2bCCf36EA5decd2B09B [1/3] Passphrase:
      
      





Ethereum Swarmぞのファむルのアップロヌド



ファむルをアップロヌドする最も簡単な方法は、upパラメヌタヌを指定したswarmコマンドを䜿甚するこずです。 さらに、ダりンロヌドしたファむルぞのパスを指定する必芁がありたす。



 $ swarm up start_node.sh f2073b8f0cf0cfe1e165060882da71a37bb6fd97bdec6be71b4f66ebcf0aba9f
      
      





このコマンドは、ダりンロヌドしたファむルのハッシュを返したす。 ハッシュを䜿甚しおファむルを読み取るこずができたす。 これを行うには、wgetたたはcurlコマンドを䜿甚したす。



 $ wget http://localhost:8500/bzz:/f2073b8f0cf0cfe1e165060882da71a37bb6fd97bdec6be71b4f66ebcf0aba9f/ $ curl http://localhost:8500/bzz:/f2073b8f0cf0cfe1e165060882da71a37bb6fd97bdec6be71b4f66ebcf0aba9f/
      
      





wgetコマンドを䜿甚するず、ファむルの内容をロヌカルディスクに保存できたす。 -Oオプションを䜿甚しお、ファむル名を指定したす。 curlコマンドはファむルの内容をコン゜ヌルに出力するため、この圢匏ではバむナリファむルの内容を衚瀺するために䜿甚しないでください。 URLの最埌にスラッシュが必芁です。そうでない堎合、リダむレクトが発生したす。



䞊蚘のようにファむルがEthereum Swarmにアップロヌドされるず、いわゆるマニフェストが䜜成されお保存されたす。 これは、指定された識別子によっおリポゞトリで利甚可胜なコンテンツを説明するヘッダヌです。



以䞋に、単玔なswarm upコマンドでNet-Ethereum-0.28.tar.gzファむルをダりンロヌドしたした。



 $ swarm up Net-Ethereum-0.28.tar.gz 8da3713d49c62740f5ab594b06173975ac97cb3dd3848ae996484ec264a10e2f
      
      





ここで、bzz-listプロトコルを指定するこずにより、マニフェストを衚瀺できたす。



 $ curl http://localhost:8500/bzz-list:/8da3713d49c62740f5ab594b06173975ac97cb3dd3848ae996484ec264a10e2f/ {"entries":[{"hash":"543ee6e744f93de76ac132b8ab71982e32beaf90d1005e771dde003b2a4a54c3","path":"/","contentType":"application/gzip","mode":420,"size":12403,"mod_time":"2018-01-13T14:57:54+03:00"}]}
      
      





マニフェストはJSON圢匏で衚瀺されたす。



マニフェストでは、ファむルファむル名、サむズ、タむプコンテンツタむプ、倉曎日時、およびファむルのハッシュに保存できたす。



ファむルの内容を識別子で抜出し、t.tar.gzずいう名前で保存するには、次のようにしたす。



 $ wget -O t.tar.gz http://localhost:8500/bzz:/8da3713d49c62740f5ab594b06173975ac97cb3dd3848ae996484ec264a10e2f/
      
      





サブディレクトリがあるディレクトリをダりンロヌドする



Ethereum Swarmリポゞトリヌの内容を含むディレクトリヌを再垰的にロヌドするには、-recursiveパラメヌタヌを指定したす。



 $ swarm --recursive up Net-Ethereum/ 4fb1f2270381c022461037151f70ce081082f0ae1a2a23d8c7ea602da69b4115
      
      





マニフェストには、ロヌドされたサブディレクトリ内のすべおのファむルに関する情報が衚瀺されたす。



非衚瀺のテキスト
 $ curl http://localhost:8500/bzz-list:/4fb1f2270381c022461037151f70ce081082f0ae1a2a23d8c7ea602da69b4115/ {"common_prefixes":["blib/","lib/","t/"],"entries":[{"hash":"feea799e7d53fa8465489baf13f66becda29f94695d6ddad161af4bfc51556b4","path":"Changes","mode":420,"size":314,"mod_time":"2018-01-13T14:56:39+03:00"},{"hash":"11fe71c1ab60779eb7b055c96a6fe0fe88d498ca60ece51d79db62d6677f1bf9","path":"MANIFEST","mode":420,"size":241,"mod_time":"2018-01-09T18:38:06+03:00"},{"hash":"1fa030391282faa61b01c1ca07bc483db54c04173801e90477be0919bb9fa2b8","path":"META.json","contentType":"application/json","mode":420,"size":822,"mod_time":"2018-01-09T18:38:06+03:00"},{"hash":"261487aa0cb7218ee3953ac1a67b757cc59d19aadca0b6b4272b8751ba4dfe64","path":"META.yml","mode":420,"size":470,"mod_time":"2018-01-09T18:38:06+03:00"},{"hash":"4a4ef37333596472a6a5bcee20456621f039f2f3bb9a331f0afc289a1e122af5","path":"MYMETA.json","contentType":"application/json","mode":420,"size":862,"mod_time":"2018-01-13T14:57:41+03:00"},{"hash":"374603f37acd044b3605dc0c051b9996625c9dfcce4919e80ba84bda21b4bbcd","path":"MYMETA.yml","mode":420,"size":510,"mod_time":"2018-01-13T14:57:41+03:00"},{"hash":"18cdc7c003810e53974187bcee1b7d2c536c4b952fe0f199d264e5af21d6548c","path":"Makefile.PL","contentType":"text/x-perl; charset=utf-8","mode":420,"size":664,"mod_time":"2018-01-13T12:24:37+03:00"},{"hash":"44481e1b88e2c00cd30717108d8490d839358bb4cb9895962e4fa64c2be6ed73","path":"Makefile","mode":420,"size":27605,"mod_time":"2018-01-13T14:57:41+03:00"},{"hash":"543ee6e744f93de76ac132b8ab71982e32beaf90d1005e771dde003b2a4a54c3","path":"Net-Ethereum-0.28.tar.gz","contentType":"application/gzip","mode":420,"size":12403,"mod_time":"2018-01-13T14:57:54+03:00"},{"hash":"c6ff1f1742a156aeaf98fcfb480cfb168857029a8790ac8c3bc7a00aef415021","path":"README","mode":420,"size":1303,"mod_time":"2018-01-13T14:57:31+03:00"},{"hash":"011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce","path":"pm_to_blib","mode":420,"mod_time":"2018-01-13T14:57:49+03:00"}]}
      
      







Ethereum Swarmのその他の機胜



この蚘事では、Ethereum Swarmのすべおの機胜に぀いおは説明したせんでした。



個々のファむルずディレクトリの内容をロヌドするこずに加えお、マニフェストにデヌタを远加できたす。 これにより、拡匵されたマニフェストずファむルが远加された新しいデヌタ項目が䜜成されたす。



マニフェストなしでファむルをダりンロヌドしたり、いわゆる「生の」圢匏でそれらを読むこずができたす。



ファむルを読み取るずきに、その名前党䜓たたは䞀郚を指定できたす。 この堎合、ENSEthereum Name Serviceネヌムサヌビスが関係したす。 この機胜により、ブロックから䞀郚のファむルのみを取埗し、共通のマニフェストで結合できたす。



たた、SWarm Accounting ProtocolSWAPおよびその他の機胜に぀いおも説明したせんでした。 Ethereum Swarmプロゞェクトは掻発に開発されおおり、分散型アプリケヌションの開発者にずっお興味深い䜕かを確実にもたらすでしょう。



Perl Net :: Ethereum :: Swarmモゞュヌル



PerlシステムでEthereum Swarm分散デヌタりェアハりスを䜿甚するために、CPANでNet :: Ethereum :: Swarmモゞュヌルを開発しお投皿したした。



このモゞュヌルを䜿甚するず、テキストファむルずバむナリファむルをEthereum Swarmにアップロヌドしたり、ダりンロヌドしたデヌタのマニフェストを受信したり、Ethereum Swarmから識別子でファむルをアップロヌドしたりできたす。



Net :: Ethereum :: Swarmモゞュヌルは、HTTP GETおよびPOSTリク゚ストを䜿甚しおEthereum Swarmホストず連携したす。 リク゚ストの䜿甚に぀いおは、ドキュメントの「HTTP API」セクションで説明しおいたす。



HTTPリク゚ストを介した盞互䜜甚は、ほずんどすべおのプログラミング蚀語で簡単に実装できたす。



Ethereumブロックチェヌンずスマヌトコントラクトに関する他の本ず蚘事






All Articles