仮想通貨のやり取りを体感してみよう!

はじめに

みなさんこんにちは。弥生のe-Sportsプレイヤー(自称)の上島です。 この記事は、Misoca+弥生 Advent Calendar 2019の24日目の記事です。

ブロックチェーンのことについて書きたいと思います。

目的

仮想通貨のやり取りを体感することにより、

  • ブロックチェーンとは何だ!!
  • この先はどんなことが起こるのか!!

ということに興味を持つきっかけにしてもらえることです。 まず、触ってみて、その後にいろんな記事を見ると、より理解が進むんじゃないかと!(^-^) (実際の仮想通貨取引所で、取引するわけではなく、自身のパソコン上で実験するだけなのでご安心を(笑))

僕は、ブロックチェーンに詳しいわけでもなく、具体的なアイデアは、なーんにも持ってないですが、なんとなくブロックチェーンが世の中をより良くしてくれるんじゃないか!!と信じてるんです。(今のところ)

ブロックチェーンとは

Wikipediaをご確認ください(笑) ja.wikipedia.org

ただ、ブロックチェーンの詳細は読まなくても、ちんぷんかんぷんでも気にせず進めましょう!

僕が大好きなゲームのキャラである、ガイル少佐が戦う前にいつもカッコいいことを言います。

「御託はいい、はじめよう。」

では、はじめよう!(^-^)/

シナリオ

  1. ヤヨイさんとミソカさんの二人が登場します。 f:id:ym_AdventC:20191216181446p:plain

  2. ヤヨイさんが仮想通貨を稼ぎます。 f:id:ym_AdventC:20191216181508p:plain

  3. ヤヨイさんが稼いだ仮想通貨をミソカさんにプレゼントします。 f:id:ym_AdventC:20191216181405p:plain

用意するもの

  1. Ubuntuの環境
  2. 好奇心(←一番大事!)

ブロックチェーンの体感

環境構築

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
}

// 無事に取引がブロックのチェーンに追加されました!

f:id:ym_AdventC:20191218165936p:plain

以上のように、

発生した取引が、あるルールに則り合意され、合意された取引はブロックとしてチェーンのようにつながっていく。

そしてその取引の内容は確認できて、改ざんできない!と言われている。

まとめ

いかがでしたか? 動かすだけならすごく簡単でしたね!!(といいつつ、動作確認するのにちょっとハマってたのは内緒です(笑)) ただ、裏側で使われている技術やアイデアは、非常にすごそうです。

テクノロジーって本当に興味深いですね!

僕もこれを機にブロックチェーンの理解を深めたいと思います!

では、いよいよ、明日はラスト! @kokuyouwindさんの「勉強会をtsudaる技術」です!チームワークのチェーンを繋ぎます!

あとがき

今回は、ブロックチェーンのプラットフォームとして、イーサリアムを利用しました。 本当は、NEMで表現したいなーと思って調べてみたんですが、サンプルが見つけられず、断念しました(笑)

ブロックチェーンと一言でいっても、色々な思想をもつプラットフォームがあって興味深いです。 それぞれのプラットフォームの思想を最も反映していることの一つが「コンセンサスアルゴリズム」ではないでしょうか。 コンセンサスアルゴリズムとは、「この取引ってOKだよね!?」って合意形成方法のようです。 それぞれメリットデメリットがあるようですし、どれが一番優れている!とかはないのかもしれないですね。

我々が解決したい問題がブロックチェーンで解決できそうなのであれば、

  • 本当にブロックチェーンで解決できるのか
  • 解決できるならどのプラットフォームを使えば良いのか
  • プラットフォーム利用しながら、どのようなシステム構成にすればいいのか

みたいなことを議論していきたいなーなんて妄想しています(笑)(もちろん、議論だけじゃなく実装もね!

さてさて、長くなりましたが、ブロックチェーンに興味を持ってくれる人が増えたらうれしいです!

最後に、

量子コンピューターが来たらブロックチェーンどうなるんだろーーーー!!

おわり