・やってみたこと
プールマイニング、ソロマイニングでのマイニング時のハッシュレートが取得できるので
Raspberry pi からapiによりハッシュレートを取得させる。
ハッシュレートはi2c接続のArduino経由で7セグledを点灯して表示させる。
単純にマイニング時のハッシュレートをハード的に表示させることが今回の目的。
(たぶんこれができたら、Ethウォレットの残額も自ノード経由で7セグLEDまたはキャラクタ液晶に表示ができるのでその事前確認をしてみる。)
接続のざっくりとしたイメージ
■プールマイニングのハッシュレートの表示
マイニングPCと同じネットワークにいるraspberry piがnano poolに対してrequest要求を行い
ハッシュレートを取得する。
■ソロマイニングのハッシュレートの表示
ライブネットに接続しているマイニング用PCと同じネットワーク上にいる
raspberry piがEthereumノードに対してjson-rpcでハッシュレートを取得する。
(プールマイニングの場合、画面左下がハッシュレート43Mh/sとして表示した)
共通
準備するもの
・マイニング用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
ざっくりとした流れ:
手順1.マスタでハッシュレートをライブネットに接続するノードから取得。
手順2.マスタからスレーブへ値(1バイト)を送信(I2C)
手順3.スレーブで値を取得し7セグLEDを点灯
手順1〜3を繰り返す。(ラズパイのcrontabで定期的に実行)
(手順3のスケッチは長くなるので、割愛。また、1バイトの値を扱うのはI2C通信で一番楽だから。)
以降、手順1〜2のpythonスクリプトを作成する。
ハッシュレートの取得先が変わるのでプールマイニング・ソロマイニングそれぞれでかき分ける。
ただし、手順2はarduinoに値を送るだけなので、かき分ける必要なし。
プールマイニングの場合
raspberry piからマイニングサイトへのAPIリクエスト
プールマイニングを実行するサイトを選択。大体どこもAPIを提供してくれてる。
ここではnanopoolのAPIでraspberry piからリクエストする。
https://eth.nanopool.org/api
マスタ側のコード
class_nanopool.py:nano poolへAPIリクエストするクラス
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
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']) #ハッシュレートが小数点以下は切り捨て(1バイト送信用)
# 手順2に相当
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ベースで利用する。
マスタ側のコード
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
# 手順1に相当
url="http://192.168.100.100:8545"
data=eth_hashrate(url)
var=int(math.floor(data / 1000000 ))
# 手順2に相当
writeNumber(var)
print(var)
time.sleep(1)
number=readNumber()
print(number)
これで自ノードとハードウェアの親和性が確認できるようになったのかと思う。
今後は、コントラクトベースでハードウェア制御ができるか確認したい。