仮想通貨のやり取りを体感してみよう!
はじめに
みなさんこんにちは。弥生のe-Sportsプレイヤー(自称)の上島です。 この記事は、Misoca+弥生 Advent Calendar 2019の24日目の記事です。
ブロックチェーンのことについて書きたいと思います。
目的
仮想通貨のやり取りを体感することにより、
- ブロックチェーンとは何だ!!
- この先はどんなことが起こるのか!!
ということに興味を持つきっかけにしてもらえることです。 まず、触ってみて、その後にいろんな記事を見ると、より理解が進むんじゃないかと!(^-^) (実際の仮想通貨取引所で、取引するわけではなく、自身のパソコン上で実験するだけなのでご安心を(笑))
僕は、ブロックチェーンに詳しいわけでもなく、具体的なアイデアは、なーんにも持ってないですが、なんとなくブロックチェーンが世の中をより良くしてくれるんじゃないか!!と信じてるんです。(今のところ)
ブロックチェーンとは
Wikipediaをご確認ください(笑) ja.wikipedia.org
ただ、ブロックチェーンの詳細は読まなくても、ちんぷんかんぷんでも気にせず進めましょう!
僕が大好きなゲームのキャラである、ガイル少佐が戦う前にいつもカッコいいことを言います。
「御託はいい、はじめよう。」
では、はじめよう!(^-^)/
シナリオ
ヤヨイさんとミソカさんの二人が登場します。
ヤヨイさんが仮想通貨を稼ぎます。
ヤヨイさんが稼いだ仮想通貨をミソカさんにプレゼントします。
用意するもの
- Ubuntuの環境
- 好奇心(←一番大事!)
ブロックチェーンの体感
環境構築
- Gethをインストール【公式ページ】
sudo add-apt-repository -y ppa:ethereum/ethereum sudo apt-get update sudo apt-get install ethereum // ヘルプが表示できるか確認 geth -h NAME: geth - the go-ethereum command line interface Copyright 2013-2019 The go-ethereum Authors USAGE: geth [options] command [command options] [arguments...] VERSION: 1.9.9-stable-01744997
- ちょっとしたファイルを作成(ex. /tmp/geth/genesis.json)
{ "config": { "chainId": 15, "homesteadBlock": 0, "eip150Block": 0, "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 0, "constantinopleBlock": 0, "petersburgBlock": 0, "ethash": {} }, "difficulty": "1", "gasLimit": "8000000", "alloc": { } }
- 初期化
geth --datadir /tmp/geth init /tmp/geth/genesis.json
- 起動
geth --networkid "15" --nodiscover --maxpeers 0 --datadir "/tmp/geth" console 2>> /tmp/geth/geth_err.log
お!なんか、JavaScript consoleってのが出たぞ!
Welcome to the Geth JavaScript console! instance: Geth/v1.9.9-stable-01744997/linux-amd64/go1.13.4 at block: 0 (Thu, 01 Jan 1970 09:00:00 DST) datadir: /tmp/geth modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0 >
ここから先は、JavaScript consoleにて実施!
ヤヨイさんとミソカさんの登録
// アカウント確認(何も登録されていません。) > eth.accounts [] // ヤヨイさん登録 > personal.newAccount("yayoi") "0xa4fc61a4bab3043b232519719c612e43d872c8c7" // ミソカさん登録 > personal.newAccount("misoca") "0xc4bf2220126765f71c66d41d0279df8b24155d50" // アカウント確認(二人分登録された!) > eth.accounts ["0xa4fc61a4bab3043b232519719c612e43d872c8c7", "0xc4bf2220126765f71c66d41d0279df8b24155d50"]
(ほんとは、引数はパスワードらしい。)
仮想通貨を稼ぐ
// ヤヨイさんの残高確認(ゼロ! > eth.getBalance(eth.accounts[0]) 0 // ミソカさんの残高確認(ゼロ! > eth.getBalance(eth.accounts[1]) 0 // お金を稼ぐ人の確認(ヤヨイさん) > eth.coinbase "0xa4fc61a4bab3043b232519719c612e43d872c8c7" // お金稼ぎ開始!(マイニング/採掘) > miner.start(8) null // マイニングしてるかな? > eth.mining true // マイニング進んでいるかな?(ゼロは進んでない > eth.blockNumber 0 > eth.blockNumber 0 > eth.blockNumber 0 // お!マイニング進んだ! > eth.blockNumber 54 // マイニングを止める > miner.stop() null // 稼ぎの確認(えええ!!!とんでもない報酬が!! > eth.getBalance(eth.coinbase) 54000000000000000000 // と思いきや単位がおかしいので整えると54etherでした。 // さっきの単位は、wei(1wei = 0.000000000000000001ether) > web3.fromWei(eth.getBalance(eth.coinbase), "ether") 54 // ヤヨイさんの残高 > web3.fromWei(eth.getBalance(eth.accounts[0]), "ether") 54 // ミソカさんの残高 > web3.fromWei(eth.getBalance(eth.accounts[1]), "ether") 0
仮想通貨をプレゼント
// ヤヨイさんからミソカさんへ30ether送るよ。 // ヤヨイさんのアカウントのロック解除 > personal.unlockAccount(eth.accounts[0], "yayoi") true // 送金! // トランザクションのIDが出た! > eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(30, "ether")}) "0x1b3f9f42680298472615c06df0069040d4fce7f5a699e1384a4125c8beca8c5b" // トランザクションどうなってるかな? // blockNumber:null -> ペンディング状態(合意されていない) > eth.getTransaction("0x1b3f9f42680298472615c06df0069040d4fce7f5a699e1384a4125c8beca8c5b") { blockHash: null, blockNumber: null, from: "0xa4fc61a4bab3043b232519719c612e43d872c8c7", gas: 21000, gasPrice: 1000000000, hash: "0x1b3f9f42680298472615c06df0069040d4fce7f5a699e1384a4125c8beca8c5b", input: "0x", nonce: 0, r: "0x39849ddf941ca7a8692fbe12a9713c0c482644a783c9890d04bf92fae42962a9", s: "0x66cf377744bea5cec28b93af715f725d1f4ac9c0400c0ef0055072c633688736", to: "0xc4bf2220126765f71c66d41d0279df8b24155d50", transactionIndex: null, v: "0x41", value: 30000000000000000000 } // ペンディングになっているトランザクション確認 > eth.pendingTransactions [{ blockHash: null, blockNumber: null, from: "0xa4fc61a4bab3043b232519719c612e43d872c8c7", gas: 21000, gasPrice: 1000000000, hash: "0x1b3f9f42680298472615c06df0069040d4fce7f5a699e1384a4125c8beca8c5b", input: "0x", nonce: 0, r: "0x39849ddf941ca7a8692fbe12a9713c0c482644a783c9890d04bf92fae42962a9", s: "0x66cf377744bea5cec28b93af715f725d1f4ac9c0400c0ef0055072c633688736", to: "0xc4bf2220126765f71c66d41d0279df8b24155d50", transactionIndex: null, v: "0x41", value: 30000000000000000000 }] // 取引の正当性を合意するために、マイニングだー! > miner.start(8) // 合意された!(空っぽになったから) > eth.pendingTransactions [] // ミソカさんの残高が増えた~! > web3.fromWei(eth.getBalance(eth.accounts[1]), "ether") 30 // トランザクションを確認してみましょう。 // ブロックがつながった!(blockNumber:に値が!) > eth.getTransaction("0x1b3f9f42680298472615c06df0069040d4fce7f5a699e1384a4125c8beca8c5b") { blockHash: "0x485681549c3bfe644b8e89062f733f362884232a7299d3cb92be4056e735b091", blockNumber: 28, from: "0xa4fc61a4bab3043b232519719c612e43d872c8c7", gas: 21000, gasPrice: 1000000000, hash: "0x1b3f9f42680298472615c06df0069040d4fce7f5a699e1384a4125c8beca8c5b", input: "0x", nonce: 0, r: "0x39849ddf941ca7a8692fbe12a9713c0c482644a783c9890d04bf92fae42962a9", s: "0x66cf377744bea5cec28b93af715f725d1f4ac9c0400c0ef0055072c633688736", to: "0xc4bf2220126765f71c66d41d0279df8b24155d50", transactionIndex: 0, v: "0x41", value: 30000000000000000000 } // 無事に取引がブロックのチェーンに追加されました!
以上のように、
発生した取引が、あるルールに則り合意され、合意された取引はブロックとしてチェーンのようにつながっていく。
そしてその取引の内容は確認できて、改ざんできない!と言われている。
まとめ
いかがでしたか? 動かすだけならすごく簡単でしたね!!(といいつつ、動作確認するのにちょっとハマってたのは内緒です(笑)) ただ、裏側で使われている技術やアイデアは、非常にすごそうです。
テクノロジーって本当に興味深いですね!
僕もこれを機にブロックチェーンの理解を深めたいと思います!
では、いよいよ、明日はラスト! @kokuyouwindさんの「勉強会をtsudaる技術」です!チームワークのチェーンを繋ぎます!
あとがき
今回は、ブロックチェーンのプラットフォームとして、イーサリアムを利用しました。 本当は、NEMで表現したいなーと思って調べてみたんですが、サンプルが見つけられず、断念しました(笑)
ブロックチェーンと一言でいっても、色々な思想をもつプラットフォームがあって興味深いです。 それぞれのプラットフォームの思想を最も反映していることの一つが「コンセンサスアルゴリズム」ではないでしょうか。 コンセンサスアルゴリズムとは、「この取引ってOKだよね!?」って合意形成方法のようです。 それぞれメリットデメリットがあるようですし、どれが一番優れている!とかはないのかもしれないですね。
我々が解決したい問題がブロックチェーンで解決できそうなのであれば、
- 本当にブロックチェーンで解決できるのか
- 解決できるならどのプラットフォームを使えば良いのか
- プラットフォーム利用しながら、どのようなシステム構成にすればいいのか
みたいなことを議論していきたいなーなんて妄想しています(笑)(もちろん、議論だけじゃなく実装もね!
さてさて、長くなりましたが、ブロックチェーンに興味を持ってくれる人が増えたらうれしいです!
最後に、
量子コンピューターが来たらブロックチェーンどうなるんだろーーーー!!
おわり