Ethereumマイニングのハッシュレートを7セグLEDに表示する


・やってみたこと
  プールマイニング、ソロマイニングでのマイニング時のハッシュレートが取得できるので
  Raspberry pi からapiによりハッシュレートを取得させる。
　ハッシュレートはi2c接続のArduino経由で7セグledを点灯して表示させる。

　単純にマイニング時のハッシュレートをハード的に表示させることが今回の目的。
　（たぶんこれができたら、Ethウォレットの残額も自ノード経由で7セグLEDまたはキャラクタ液晶に表示ができるのでその事前確認をしてみる。）


##接続のざっくりとしたイメージ


![ざっくりとしたイメージ (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/142016/eb5f42ca-9bdb-4bfc-8152-a1d003361315.jpeg)

■プールマイニングのハッシュレートの表示
　マイニングPCと同じネットワークにいるraspberry piがnano poolに対してrequest要求を行い
　ハッシュレートを取得する。

■ソロマイニングのハッシュレートの表示
　ライブネットに接続しているマイニング用ＰＣと同じネットワーク上にいる
　raspberry piがEthereumノードに対してjson-rpcでハッシュレートを取得する。

（プールマイニングの場合、画面左下がハッシュレート43Mh/sとして表示した）
![118328.jpg](https://qiita-image-store.s3.amazonaws.com/0/142016/85704bc2-ffa4-20a6-d16b-8ab60cef78af.jpeg)

##共通
###準備するもの
・マイニング用PC(ソロマイニングの場合はライブネット接続済みのもの）
  (参考：ライブネット接続方法：http://qiita.com/umidachi/items/44a50ce86e94ff0df8f2)

・7セグメントLED
  (参考：http://akizukidenshi.com/catalog/g/gI-04449/)
  
・Arduino uno
  (画像では、arduino bootローダ書き込み済みatmega328を使用）
   参考：http://ht-deko.com/arduino/atmega328p.html
  
・raspbherry pi model B

###raspberry piとarduinoのI2c通信
7セグメントledは使用するピン数が多く、raspberry piのGPIOはあまり
いじりたくないのでArduino uno をハード制御用に使う。
raspberry piとI2C通信を行って、arduino uno のIOピンを使って7セグメントLEDを点灯させる。

ArduinoのI2C通信と7セグLED点灯は下記のURLを参考にした。

参考1. I2C通信
https://oscarliang.com/raspberry-pi-arduino-connected-i2c/
参考2. Arduinoでの7セグLED点灯
https://garretlab.web.fc2.com/arduino/introduction/beginning_with_7segment_led/


マスタ、スレーブの関係は下記の通り

マスタ側:raspberry pi B
スレーブ側:Arduino uno

ざっくりとした流れ：
手順１．マスタでハッシュレートをライブネットに接続するノードから取得。
手順２．マスタからスレーブへ値（１バイト）を送信(I2C)
手順３．スレーブで値を取得し７セグLEDを点灯

手順１〜３を繰り返す。(ラズパイのcrontabで定期的に実行）

（手順３のスケッチは長くなるので、割愛。また、１バイトの値を扱うのはI2C通信で一番楽だから。）

以降、手順１〜２のpythonスクリプトを作成する。
ハッシュレートの取得先が変わるのでプールマイニング・ソロマイニングそれぞれでかき分ける。
ただし、手順２はarduinoに値を送るだけなので、かき分ける必要なし。

##プールマイニングの場合
###raspberry piからマイニングサイトへのAPIリクエスト
プールマイニングを実行するサイトを選択。大体どこもAPIを提供してくれてる。
ここではnanopoolのAPIでraspberry piからリクエストする。
　
　https://eth.nanopool.org/api

###マスタ側のコード
class_nanopool.py：nano poolへAPIリクエストするクラス

```py3:class_nanopool.py
import json
import requests as rs

class nanopool:
    def __get_api(self,API):
        res=rs.get(API)
        return res.text
    def __analize_result(self,json_str):
        return json.loads(json_str)
    def get_result(self,API):
        json_str=self.__get_api(API)
        return self.__analize_result(json_str)

    @staticmethod
    def getinfo(API):
        nano=nanopool()
        data=nano.get_result(API)
        return data
```

```py3:main.py
import smbus
import time
import math
from class_nanopool import *

bus=smbus.SMBus(1)
address = 0x08

def writeNumber(value):
	bus.write_byte(address,value)
	return 1

def readNumber():
	number=bus.read_byte(address)
	return number

#手順1に相当

API="https://api.nanopool.org/v1/eth/avghashratelimited/（マイニング時に指定するアドレス）/1"
#↑の1は1hのハッシュレートを取得するという意味

nano=nanopool()
result=nano.get_result(API)  #nanopoolのAPIリクエスト結果を取得する。

data=math.floor(result['data']) #ハッシュレートが小数点以下は切り捨て（１バイト送信用）

#手順２に相当
var=int(data)
writeNumber(var)
print(var)
time.sleep(1)

number=readNumber()
print(number)

```


##ソロマイニングの場合
###raspberry piからライブネットに接続する自ノードへJSON-RPC APIによるリクエストを行う。
（自ノードはrpc接続できることが前提）
JSON-RPCによるリクエストは下記を参考にする。
https://github.com/ethereum/wiki/wiki/JSON-RPC

”eth_hashrate”のメソッドがあるので、それをpythonベースで利用する。

###マスタ側のコード
```py3:main.py
import smbus
import time
import math
from class_nanopool import *
from ethquery import *

bus=smbus.SMBus(1)
address = 0x08

def writeNumber(value):
	bus.write_byte(address,value)
	return 1

def readNumber():
	number=bus.read_byte(address)
	return number

#手順１に相当
url="http://192.168.100.100:8545"
data=eth_hashrate(url)

var=int(math.floor(data / 1000000 ))

#手順２に相当
writeNumber(var)
print(var)
time.sleep(1)

number=readNumber()
print(number)

```

これで自ノードとハードウェアの親和性が確認できるようになったのかと思う。
今後は、コントラクトベースでハードウェア制御ができるか確認したい。