header image
header image

Macにイーサリアムをインスールして、送金してみる(テストネットワーク)

Macにイーサリアムをインスールして、送金してみる(テストネットワーク)

 

 

イーサリアムでのアプリケーション開発を 入りの部分だけ勉強したのでまとめます。

また、 タイトルに送金とあるので、 「え、お金使うの??」と不安になってしまう部分がある かと思いますが、 安心してください、この記事では、 テストネットワークと言う自分しか存在しないチェーン上 での作業になるので、 実際にお金を動かしたりすることはありません。

それでは、 まずはイーサリアムって何という人へ

 

 

Ethereum - イーサリアム - とは

 

ビットコインと同じような中央の管理組織を持たない仮想通貨で、 時価総額は3兆3913億円(2017年11月13日時点)にものぼり ビットコインの次に時価総額の大きな通貨となっています。

ビットコインとは違いイーサリアムブロックチェーン上にコントラクトを 保存できると言うことです。 コントラクトはSolidityと言うjavascriptライクな言語で記述することができ、 アプリケーションをブロックチェーン上に登録することが可能です。

そのコントラクトの実行には、 手数料が発生し、それらがイーサリアムのマイナーの 収入になります。

イーサリアムブロックチェーン上には、 すでに複数の分散型のアプリケーションが構築されており、 それらはこちらのサイトに公開されてあります。 State of the ÐApps — 821 Projects Built on Ethereum

ちなみに、 中央の管理組織を持たないことを生かしたソーシャルメディアである Akasha音楽業界の著作権管理と印税の支払いを自動化するプラットフォームである Ujomusic などのプロジェクトが紹介されています。

 

ブロックチェーンの仕組みがいまいちと言う方は、 こちらの記事が参考になると思います。 https://ver-1-0.net/2017/10/18/how-does-blockchain-really-work-i-built-an-app-to-show-you-translate-ja/

 

 

Etheriumクライアントをインストール

 

それでは早速Ethereumに接続する クライアントツールが必要なので インストールをしていきます。

クライアントツールもいくつか種類はあるのですが、 今回は一番よく使われているであろう、 go-ethereumを利用します。

通称gethです。 読み方はそのままゲスで大丈夫です。 躊躇せず読んじゃってください。

Macにインストールする場合のコマンドは こちらになります。

 

brew tap ethereum/ethereum
brew install ethereum

 

エラーがなくインストールできていれば完了です。 インストールできるているかは下記のように 確認しましょう。

 

$geth version
Geth
Version: 1.7.2-stable
Git Commit: 1db4ecdc0b9e828ff65777fb466fc7c1d04e0de9
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.9.2
Operating System: darwin
GOPATH=
GOROOT=/usr/local/Cellar/go/1.9.2/libexec

 

 

Gethを起動してテストネットワークに接続する

 

今回接続するのはローカルプライベートテストネットなので、 冒頭で説明したように、 お金の心配だったり他の方に迷惑をかける恐れは ないので、そのまま安心してお進みください。

 

データディレクトリを作成

送受信したブロックのデータやアカウント情報を格納するための、 ディレクトリを作成します。 ```bash mkdir my-first-eth ```  

Genesisファイルを作成

 

Genesisファイルは、 ブロックチェーンの一番最初のブロックチェーンの 情報をかいた設定ファイルのようなものです。 ローカルプライベートテストネットを利用する場合は、 ゼロからブロックチェーンを構築するため、 このファイルが必要となります。

 

myGenesis.json

{
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"difficulty": "0x400",
"alloc": {},
"coinbase": "0x3333333333333333333333333333333333333333",
"timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x",
"gasLimit": "0x8000000",
"config": {}
}

 

Gethの初期化

作成したGenesisファイルで初期化をします。 ```bash geth --datadir /your/env/path/my-first-eth init /your/env/path/myGenesis.json ```  

Gethの起動

起動のコマンドはこちらになります。 ```bash geth --networkid 10 --nodiscover --maxpeers 0 --datadir /your/env/path/my-first-eth console 2>> geth.log ```  

それぞれのオプションを説明すると

--networkid ネットワーク識別子。0 ~ 3 は予約済みですので、 指定する際は他の値を指定します。

--nodiscover 起動したノードを他のノードから検出できないようにします。

--maxpeers 起動したノードに接続できるノードの数です。0を指定すると、 他のノードとは接続しなくなります。

console 対話型のJavaScriptコンソールを呼び出します。

問題なければ対話型のコンソールが表示され、 プロンプトが現れます。

ここまででgethの起動は完了です。

アカウントの作成

イーサリアムを送金する必要があるので、 アカウントを作成する必要があり、 作成するユーザーのことはEOA ( Externally Owned Account)と 呼ばれます。

コマンドは以下になります。 引数の文字列はパスワードになるので、 忘れないようにしましょう。

personal.newAccount("password")

 

送金を行うには、 送り手と受け手が必要ですので、 もう一つアカウントを作成します。

personal.newAccount("drowssap")

アカウントを作成した際に表示された文字列は、 作成したアカウントのアドレスになります。 送金を行う際はこのアドレスを利用して、送金を行うことになります。

作成したアカウントを確認します。

> personal.newAccount("password")
"0x73c935b7ade47b3a3efa29769e4db1cc91aa2e88"
>
>
>
> personal.newAccount("drowssap")
"0x0c792c39d206ae2d2a0df7b7db7d365c3067a137"
>
>
> eth.accounts
["0x73c935b7ade47b3a3efa29769e4db1cc91aa2e88", "0x0c792c39d206ae2d2a0df7b7db7d365c3067a137"]

 

残高の確認・マイニング

下記のコマンドで残高を確認できますが、 まだマイニングを行なっていないため残高は0となっています。 ```go < eth.getBalance(eth.accounts[0]) 0 ```  

ブロックチェーンのブロック数も0になっています。

< eth.blockNumber
0

 

この状態では、 まだローカルのブロックチェーン上に一つのブロックも生成されて いない状態なので、 マイニングでブロックを生成していきます。

< miner.start(1)
null

しばらくするとブロックが生成されてきます。

<  miner.stop()
true

そして残高を確認してみると

< eth.getBalance(eth.accounts[0])
195000000000000000000
> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
195

195ETHが最初に作成したアカウントに 入金されています。 これでマイニング成功です。 ※もちろん、これはテスト環境でのみ使える通貨で金銭的な価値はありません。

ここまで準備ができたので最後は送金を行います。

 

送金

はじめにアカウントの残高を確認します。

> eth.getBalance(eth.accounts[0])
195000000000000000000
>
>
> eth.getBalance(eth.accounts[1])
0
>

残高を確認すると、 account1には195ETH、 account2には0ETHであることがわかります。

また、送金を行うには アカウントのロック解除が必要ですので、 コマンドでロックを解除します。

personal.unlockAccount(eth.accoutns[0],'password',0)

それでは、 account1からaccount2に100ETHを送ってみます。

> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(100,"ether") })
"0xd404f7d67c0df7c8388db84efe9f1523f6134b18b5b615121ee236281e5db9d8"
>
>
>
> eth,getTransaction("0xd404f7d67c0df7c8388db84efe9f1523f6134b18b5b615121ee236281e5db9d8")
ReferenceError: 'getTransaction' is not defined
    at <anonymous>:1:5

> eth.getTransaction("0xd404f7d67c0df7c8388db84efe9f1523f6134b18b5b615121ee236281e5db9d8")
{
  blockHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  blockNumber: null,
  from: "0x73c935b7ade47b3a3efa29769e4db1cc91aa2e88",
  gas: 90000,
  gasPrice: 18000000000,
  hash: "0xd404f7d67c0df7c8388db84efe9f1523f6134b18b5b615121ee236281e5db9d8",
  input: "0x",
  nonce: 0,
  r: "0xc69cac899af8c2e914f3dda00379bd9c6df4478e465d96e5521042b0f6ce1120",
  s: "0x677930addcbeb8299e0ff52a1e7fe79cd4db2b10714b3706faf08b8aa2e84b9e",
  to: "0x0c792c39d206ae2d2a0df7b7db7d365c3067a137",
  transactionIndex: 0,
  v: "0x1b",
  value: 100000000000000000000
}
>

 

これで送金は完了しました。

が、 残高を確認してみると 残高が移動していないように見えます。

> eth.getBalance(eth.accounts[0])
195000000000000000000
>
>
>
> eth.accounts[1]
"0x0c792c39d206ae2d2a0df7b7db7d365c3067a137"
> eth.getBalance(eth.accounts[1])
0
>

 

これは、 送金をしたあとにマイニングで取引が承認されていないためです。 再度マイニングを行い、 残高を確認してみると100ETHがaccount2の残高に 反映されていることが確認できます。

> miner.start(1)
null
>
> miner.stop()
true
>
>
> eth.getBalance(eth.accounts[1])
100000000000000000000
> web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')
100
>

 

これでイーサリアムの送金はできました!

以上です!!

はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)