20201227のLinuxに関する記事は8件です。

ubuntu 20.04 + Geth環境のアカウント設定とether採掘

ubuntuにGethを導入後、アカウントを作成し採掘を行うまでの手順を開設する。

環境構築をまとめた前回の記事はこちら。

https://qiita.com/kanazwk/items/76ffda7b4d6b7dc1ba27

EOAアカウント作成

このノード内で作成されたEOAのリストを表示する。初期は空の状態なので、空白が表示される。

> eth.accounts
[]
>

作成はpersonal.newAccount(パスワード文字列)で実行する。ここではアカウントを2つ作成する。

> personal.newAccount("p@ssw0rd01")
"0x911e18204582a6de08dd2b1f7540b9167ce93b67"
>
> eth.accounts
["0x911e18204582a6de08dd2b1f7540b9167ce93b67"]
> personal.newAccount("p@ssw0rd02")
"0x911e18204582a6de08dd2b1f7540b9167ce93b67"
>
> eth.accounts
["0x911e18204582a6de08dd2b1f7540b9167ce93b67", "0x634c921bfbad7756c7988ea74e4bdf5e5387620d"]

EOAアカウントとは、Externally Owned Account。トランザクションを発生さえるユーザーアカウントで、他のアカウントへのetherの送金やコントラクトコードの実行を行う。etherのマイニングもこのアカウントで行う。

Ethereumのアカウントは2種類あり、もう一方のアカウントはContractと呼ばれる自動エージェントである。EOAから発行されたトランザクションがをトリガーにして、このContractアカウントが持つコントラクトコードが実行される。実行後、Contractアカウントのデータフィールドも更新される。

etherbase(coinbase)のアドレス確認

eth.coinbaseコマンドを実行すると、作成したEOAアカウントの一つが表示される。これをetherbase(coinbase)という。etherbase(coinbase)とは、各ノードでマイニングを行う際に、その報酬を紐づけるEOAのアドレスである。

> eth.coinbase
"0x911e18204582a6de08dd2b1f7540b9167ce93b67"

etherbase(coinbase)は、eth.accounts[0]コマンドの実行結果(プライマリアカウントのアドレス)に紐づいている。

> eth.accounts
["0x911e18204582a6de08dd2b1f7540b9167ce93b67", "0x634c921bfbad7756c7988ea74e4bdf5e5387620d"]
>
> eth.accounts[0]
"0x911e18204582a6de08dd2b1f7540b9167ce93b67"
> eth.accounts[1]
"0x634c921bfbad7756c7988ea74e4bdf5e5387620d"
>

このアドレスは変更することが出来る。変更はminer.setEtherbase(new_adress)コマンドを以下のように実行する。

> miner.setEtherbase(eth.accounts[1])
true
> eth.coinbase
"0x634c921bfbad7756c7988ea74e4bdf5e5387620d"
>

etherの採掘

etherコインの採掘は、miner.start(thread_num)で行う。thread_numには実行するCPUスレッド数を指定する。指定しない場合は、動作環境のCPUコア/スレッド数で自動実行する。

> miner.start()
null

採掘を開始すると、CPU使用率(%usr)は一気に高騰する。

$ dstat -tc
----system---- --total-cpu-usage--
     time     |usr sys idl wai stl
27-12 22:14:34|  0   0 100   0   0
27-12 22:14:35|  0   1  99   0   0
27-12 22:14:36|  0   0 100   0   0
27-12 22:14:37|  0   0 100   0   0
27-12 22:14:38|  0   0 100   0   0
27-12 22:14:39|  0   0 100   0   0
27-12 22:14:40|  0   0 100   0   0
27-12 22:14:41|  1   0  99   0   0
27-12 22:14:42|  0   0 100   0   0
27-12 22:14:43|  0   0 100   0   0
27-12 22:14:44|  0   0 100   0   0
27-12 22:14:45|  0   0 100   0   0
27-12 22:14:46|  0   0 100   0   0
27-12 22:14:47|  0   0 100   0   0
27-12 22:14:48|  0   0 100   0   0
27-12 22:14:49| 58   1  41   0   0
27-12 22:14:50|100   0   0   0   0
27-12 22:14:51| 99   1   0   0   0
27-12 22:14:52|100   0   0   0   0
27-12 22:14:53| 98   2   0   0   0
27-12 22:14:54| 99   1   0   0   0
27-12 22:14:55| 98   2   0   0   0
27-12 22:14:56| 99   1   0   0   0
27-12 22:14:57| 98   2   0   0   0

dstatコマンドが導入されていない場合は、以下のコマンドでインストールしよう。

$ sudo apt install dstat

採掘が開始されていることの確認は、eth.miningコマンド。trueが表示されていれば採掘が実行中で、falseが表示されれれば停止中の状況だ。

> eth.mining
true
>

採掘したetherはブロックを形成する。ブロックチェーンに何番目までブロックが連なっているかをeth.blockNumberコマンドで確認することが出来る。

> eth.blockNumber
20
>

ハッシュレートを確認すると、下記の通り数値が表示される。ハッシュレートとは、1秒あたりの計算力、採掘速度のことで、単位はhash/s。この数値が表示されている限り演算が続いている。

> eth.hashrate
2455
>

etherの採掘停止

採掘の停止は以下のコマンドで行う。

> miner.stop()
null

コマンド実行後、即時に採掘が停止しないことがある。採掘開始時も同様で、即座に処理は開始されないが、これらの動きはDAGファイル生成に伴った初回だけの動作のようだ。

DAGという1GBの巨大なファイルを作成しているためであり、DAGファイルは、ブロックチェーンのハッシュ計算のために使用されるデータファイルである。このDAGファイル生成の間、採掘処理の開始・終了処理が実行される。AMD Ryzen 7 で10分程度要した。

DAGファイルは実行ユーザのホームディレクトリ直下.ethashフォルダ内に作成されていた。

$ ls -lh /home/kana/.ethash
合計 2.1G
-rw-rw-r-- 1 kana kana 1.0G 12月 27 22:24 full-R23-0000000000000000
-rw-rw-r-- 1 kana kana 1.1G 12月 27 22:35 full-R23-290decd9548b62a8

採掘したブロックの確認

採掘したブロックの内容を表示する。eth.blockNumberコマンドの表示結果をもとに、任意のブロックをeth.getBlock(number)コマンドで確認する。

> eth.getBlock(19)
{
  difficulty: 132160,
  extraData: "0xd883010919846765746888676f312e31352e36856c696e7578",
  gasLimit: 131749155,
  gasUsed: 0,
  hash: "0xf38872f5d72d585f6c8ba761b14d2e1c2445686c0fa04a0e13904bf772a7e918",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x634c921bfbad7756c7988ea74e4bdf5e5387620d",
  mixHash: "0x29b6d7cd55847d90b0d91853093ece9ded53babc5308dbedfc60f4af52c77168",
  nonce: "0x3de0229868f19a05",
  number: 19,
  parentHash: "0x02af21c8c989e4d2ac63846c3acb8ef708c16d86006a0367994ca585b0c35c3e",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 537,
  stateRoot: "0x9cdf5e057662eafa56503ed8d8fedb7580605d22961a5591665d1f5beea20618",
  timestamp: 1609075546,
  totalDifficulty: 2516544,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}
>
> eth.getBlock(20)
{
  difficulty: 132224,
  extraData: "0xd883010919846765746888676f312e31352e36856c696e7578",
  gasLimit: 131620495,
  gasUsed: 0,
  hash: "0xb53bf57600f78f9f4d0015b9e15f0901b99049d23e65ebc9dfa6460eba8e83ae",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x634c921bfbad7756c7988ea74e4bdf5e5387620d",
  mixHash: "0xd62344a2afbd419ce1e7c38c8664fcdeb35340a4de57fba2c2e5e7e94bdf42fc",
  nonce: "0x45064ec15863ac8d",
  number: 20,
  parentHash: "0xf38872f5d72d585f6c8ba761b14d2e1c2445686c0fa04a0e13904bf772a7e918",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 537,
  stateRoot: "0xd59b4f9158a04312b607464ac5c331142fa2c18f1d324b512f310791b7010a18",
  timestamp: 1609075547,
  totalDifficulty: 2648768,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}
> 
> eth.getBlock(21)
null
>

20ブロック目のparentHashには、19ブロック目のハッシュ値が記されている。parentHashには、親ブロックのブロック・ヘッダ・ハッシュを指す。19ブロックの子が20ブロック目であるという意味である。

このようにブロックが連なるように台帳に記録される。ブロックチェーンと呼ばれる分かりやすい部分だ。

採掘報酬の確認

採掘した報酬の確認はeth.getBalance(eth.accounts[Number])コマンドで、EOAアカウントを指定する。eth.accountsコマンドでEOAアカウント情報を確認し、それぞれ実行してみると、coinbaseである[1]番目のアカウントにetherの持ち高が表示される。採掘に成功していると判断できる。「wei」の単位 で持ち高が表示されるコマンドだ。

> eth.coinbase
"0x634c921bfbad7756c7988ea74e4bdf5e5387620d"
>
> eth.accounts
["0x911e18204582a6de08dd2b1f7540b9167ce93b67", "0x634c921bfbad7756c7988ea74e4bdf5e5387620d"]
>
> eth.getBalance(eth.accounts[0])
0
> eth.getBalance(eth.accounts[1])
100000000000000000000

単位を「ether」で表示するにはweb3.fromWei(eth.getBalance(eth.accounts[Number]),"ether")コマンドを用いる。

> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
0
> web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
100

丁度100ether。

まとめ

CPU負荷を見ながら操作すると、採掘(マイニング)の処理負荷を実感できるので、ぜひやってみてほしい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

USB のブロックデバイス (USB メモリや HDD)を列挙する方法 (Part2)

USB のブロックデバイス (USB メモリや HDD)を列挙する方法 (Part2)

USB のブロックデバイス (USB メモリや HDD)を列挙する方法 で書いたのとは別の方法で、USB のブロックデバイスを列挙する。

方法

ls /dev/disk/by-id/usb* -1 | xargs readlink -f | grep -E '[a-z]+$'

解説

/dev/disk/by-id/usb* を実行すると、USB のブロックデバイス一覧とその実デバイスへのシンボリックリンクを取得できる。

$ ls /dev/disk/by-id/usb* -l
lrwxrwxrwx 1 root root  9 12月 27 21:28 /dev/disk/by-id/usb-BUFFALO_USB_Flash_Disk_xxxxxxxxx-0:0 -> ../../sdb
lrwxrwxrwx 1 root root 10 12月 27 21:28 /dev/disk/by-id/usb-BUFFALO_USB_Flash_Disk_xxxxxxxxx-0:0-part1 -> ../../sdb1

readlink -f により、シンボリックリンクの実体を取得できるので、以下で USB のブロックデバイスの実体のリストを取得できるが、

$ ls /dev/disk/by-id/usb* -1 | xargs readlink -f
/dev/sdb
/dev/sdb1

/dev/sdb1 などパーティションに対するデバイスファイルも表示されるので、grep で正規表現を使ってフィルタリングする。

$ ls /dev/disk/by-id/usb* -1 | xargs readlink -f | grep -E '[a-z]+$'
/dev/sdb
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

USB のブロックデバイス (USB メモリや HDD)を列挙する方法

USB のブロックデバイス (USB メモリや HDD)を列挙する方法

USB のブロックデバイス (USB メモリや HDD)を列挙する方法 (Part2) の方法もあります。

方法

ls /sys/block/ -1 | \
  xargs -I{} echo /sys/block/{} | \
  xargs readlink | \
  grep usb | sed -e 's!.*/\([a-z]\+\)!\1!'

解説

ブロックデバイスの列挙

  • /sys/block/ 以下を列挙すると、linux 上のブロックデバイスを列挙できる。
  • 各項目はシンボリックリンクになっている。
  • usb のデバイスの場合はシンボリックリンクのパスに usb という文字列が含まれる。
ls /sys/block/ -l
合計 0
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop0 -> ../devices/virtual/block/loop0
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop1 -> ../devices/virtual/block/loop1
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop10 -> ../devices/virtual/block/loop10
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop2 -> ../devices/virtual/block/loop2
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop3 -> ../devices/virtual/block/loop3
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop4 -> ../devices/virtual/block/loop4
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop5 -> ../devices/virtual/block/loop5
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop6 -> ../devices/virtual/block/loop6
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop7 -> ../devices/virtual/block/loop7
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop8 -> ../devices/virtual/block/loop8
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop9 -> ../devices/virtual/block/loop9
lrwxrwxrwx 1 root root 0 12月 27 19:08 sda -> ../devices/pci0000:00/0000:00:17.0/ata1/host0/target0:0:0/0:0:0:0/block/sda
lrwxrwxrwx 1 root root 0 12月 27 19:19 sdb -> ../devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/host3/target3:0:0/3:0:0:0/block/sdb
lrwxrwxrwx 1 root root 0 12月 27 19:08 sr0 -> ../devices/pci0000:00/0000:00:17.0/ata2/host1/target1:0:0/1:0:0:0/block/sr0
t

USB のブロックデバイスを列挙する

  • ls /sys/block/ -1 の出力を xargs に渡して、更に readlink でシンボリックリンクの実体を列挙する
$ ls /sys/block/ -1 | xargs -I{} echo /sys/block/{} | xargs readlink | grep usb
../devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/host3/target3:0:0/3:0:0:0/block/sdb

USB のブロックデバイスの部分を抽出する

sed -e 's!.*/\([a-z]\+\)!\1!' のような正規表現を使うことで ...block/sdb の最後の sdb の部分を抽出する。

最終的に以下のコマンドでデバイスファイルの部分 (sdb など) を抽出できる。

ls /sys/block/ -1 | \
  xargs -I{} echo /sys/block/{} | \
  xargs readlink | \
  grep usb | sed -e 's!.*/\([a-z]\+\)!\1!'

以下のようなコマンドにすると /dev/sdb という形式で出力できる。

ls /sys/block/ -1 | \
  xargs -I{} echo /sys/block/{} | \
  xargs readlink | \
  grep usb | sed -e 's!.*/\([a-z]\+\)!\1!' | \
  xargs -I{} echo /dev/{}

参考情報

ブロックデバイスのサイズ

以下のコマンドで /dev/sdb のブロックデバイスのセクタサイズを取得できる。

$ cat /sys/block/sdb/size 
15646720

/sys/block/sdb/size の値に 512 を掛けることでブロックデバイス全体のサイズをバイト単位で取得できる。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ubuntu20.04 + Gethの導入手順

ubuntu 20.04にEtherum実行環境をインストールする。Virtual Boxへの導入手順はこちらを参照されたし。
https://qiita.com/kanazwk/items/5af85437ec556e23ef40

今回の参考サイトはこちら。
https://book.ethereum-jp.net/

以下にユーザ名"kana"で実行したログをもとにまとめた。

Gethのインストール

以下のコマンドを実行し、Gethをインストールする。

Geth:Go-Ethereum。Ethereumのクライアントソフトウェア。

PPA:Personal Package Archive。デフォルトの公式リポジトリに含まれない個人アーカイブのこと。add-apt-repository -yでEthereum配布元のリポジトリを指定し、ローカルのパッケージリストに追加する。

$ sudo add-apt-repository -y ppa:ethereum/ethereum
[sudo] kana のパスワード:
ヒット:1 http://jp.archive.ubuntu.com/ubuntu focal InRelease
取得:2 http://jp.archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
取得:3 http://jp.archive.ubuntu.com/ubuntu focal-backports InRelease [101 kB]
取得:4 http://jp.archive.ubuntu.com/ubuntu focal-updates/main amd64 DEP-11 Metadata [263 kB]
カ荳シ倖5 http://security.ubuntu.com/ubuntu focal-security InRelease [109 kB]
カ荳シ倖6 http://ppa.launchpad.net/ethereum/ethereum/ubuntu focal InRelease [17.5 kB]
取得:7 http://jp.archive.ubuntu.com/ubuntu focal-updates/universe amd64 DEP-11 Metadata [205 kB]
取得:8 http://jp.archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 DEP-11 Metadata [2,468 B]
取得:9 http://jp.archive.ubuntu.com/ubuntu focal-backports/universe amd64 DEP-11 Metadata [1,768 B]
取得:10 http://security.ubuntu.com/ubuntu focal-security/main amd64 DEP-11 Metadata [24.2 kB]
取得:11 http://security.ubuntu.com/ubuntu focal-security/universe amd64 DEP-11 Metadata [56.5 kB]
取得:12 http://ppa.launchpad.net/ethereum/ethereum/ubuntu focal/main i386 Packages [500 B]
取得:13 http://ppa.launchpad.net/ethereum/ethereum/ubuntu focal/main amd64 Packages [3,072 B]
取得:14 http://ppa.launchpad.net/ethereum/ethereum/ubuntu focal/main Translation-en [880 B]
898 kB を 3秒 で取得しました (348 kB/s)
パッケージリストを読み込んでいます... 完了
$

ローカルのパッケージリストを更新することで、インストール可能なものとしてGethが認識される。

$ sudo apt-get update
ヒット:1 http://jp.archive.ubuntu.com/ubuntu focal InRelease
ー・牴蜑・ http://jp.archive.ubuntu.com/ubuntu focal-updates InRelease
ー・牴蜑・ http://jp.archive.ubuntu.com/ubuntu focal-backports InRelease
ヒット:4 http://security.ubuntu.com/ubuntu focal-security InRelease
ヒット:5 http://ppa.launchpad.net/ethereum/ethereum/ubuntu focal InRelease
パッケージリストを読み込んでいます... 完了
$

Gethのインストール。結構長いこと時間がかかる。数分程度。

$ sudo apt-get install ethereum
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libfprint-2-tod1
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
  abigen bootnode clef evm geth puppeth rlpdump
以下のパッケージが新たにインストールされます:
  abigen bootnode clef ethereum evm geth puppeth rlpdump
アップグレード: 0 個、新規インストール: 8 個、削除: 0 個、保留: 0 個。
36.0 MB のアーカイブを取得する必要があります。
この操作後に追加で 127 MB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://ppa.launchpad.net/ethereum/ethereum/ubuntu focal/main amd64 abigen amd64 1.9.25+build24398+focal [5,451 kB]
取得:2 http://ppa.launchpad.net/ethereum/ethereum/ubuntu focal/main amd64 bootnode amd64 1.9.25+build24398+focal [5,285 kB]
取得:3 http://ppa.launchpad.net/ethereum/ethereum/ubuntu focal/main amd64 clef amd64 1.9.25+build24398+focal [8,024 kB]
46% [3 clef 7,598 kB/8,024 kB 95%]                                             225 kB/s 1分 18秒
:
thereum (1.9.25+build24398+focal) を展開しています...
rlpdump (1.9.25+build24398+focal) を設定しています ...
puppeth (1.9.25+build24398+focal) を設定しています ...
clef (1.9.25+build24398+focal) を設定しています ...
bootnode (1.9.25+build24398+focal) を設定しています ...
geth (1.9.25+build24398+focal) を設定しています ...
evm (1.9.25+build24398+focal) を設定しています ...
abigen (1.9.25+build24398+focal) を設定しています ...
ethereum (1.9.25+build24398+focal) を設定しています ...
$

gethコマンドを実行してみて、インストールされたことを確認する。

$ geth --help

パッケージの最新化

インストールしたGethパッケージを最新化する。apt-get updateでローカルのパッケージリストを最新化し、apt-get upgradeでパッケージを更新する。特に更新はなかった。

$ sudo apt-get update
ヒット:1 http://jp.archive.ubuntu.com/ubuntu focal InRelease
ヒット:2 http://jp.archive.ubuntu.com/ubuntu focal-updates InRelease
ヒット:3 http://jp.archive.ubuntu.com/ubuntu focal-backports InRelease
ヒット:4 http://ppa.launchpad.net/ethereum/ethereum/ubuntu focal InRelease
取得:5 http://security.ubuntu.com/ubuntu focal-security InRelease [109 kB]
取得:6 http://security.ubuntu.com/ubuntu focal-security/main amd64 DEP-11 Metadata [24.3 kB]
取得:7 http://security.ubuntu.com/ubuntu focal-security/universe amd64 DEP-11 Metadata [56.6 kB]
190 kB を 2秒 で取得しました (81.1 kB/s)
パッケージリストを読み込んでいます... 完了
$
$ sudo apt-get upgrade
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
アップグレードパッケージを検出しています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libfprint-2-tod1
これを削除するには 'sudo apt autoremove' を利用してください。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
$

Genesisファイルを作成する

ブロックチェーンネットワーク上の最初のBlockであるGenesisブロックの情報を記述したGenesisファイルを作成する。

$ pwd
/home/kana
$ mkdir ./eth_private_net
$ ls -ld ./eth_private_net/
drwxrwxr-x 2 kana kana 4096 12月 27 18:39 ./eth_private_net/
$ cd eth_private_net/
$ touch myGenesis.json

myGenesis.jsonファイルには下記を記述する。

myGenesis.json
{
  "config": {
    "chainId": 15
  },
  "nonce": "0x0000000000000042",
  "timestamp": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "",
  "gasLimit": "0x8000000",
  "difficulty": "0x4000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x3333333333333333333333333333333333333333",
  "alloc": {}
}

Genesisブロックの初期化

作成したGenesisファイルの内容で、ブロックチェーン情報を初期化する。

$ geth --datadir /home/kana/eth_private_net init /home/kana/eth_private_net/myGenesis.json
INFO [12-27|18:46:13.842] Maximum peer count                       ETH=50 LES=0 total=50
INFO [12-27|18:46:13.842] Smartcard socket not found, disabling    err="stat /run/pcscd/pcscd.comm: no such file or directory"
INFO [12-27|18:46:13.844] Set global gas cap                       cap=25000000
INFO [12-27|18:46:13.844] Allocated cache and file handles         database=/home/kana/eth_private_net/geth/chaindata cache=16.00MiB handles=16
INFO [12-27|18:46:13.855] Writing custom genesis block
INFO [12-27|18:46:13.855] Persisted trie from memory database      nodes=0 size=0.00B time="13.035 μs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [12-27|18:46:13.856] Successfully wrote genesis state         database=chaindata hash="7b2e8b …7e0432"
INFO [12-27|18:46:13.856] Allocated cache and file handles         database=/home/kana/eth_private_net/geth/lightchaindata cache=16.00MiB handles=16
INFO [12-27|18:46:13.864] Writing custom genesis block
INFO [12-27|18:46:13.865] Persisted trie from memory database      nodes=0 size=0.00B time="6.663μs"  gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [12-27|18:46:13.866] Successfully wrote genesis state         database=lightchaindata hash="7b2e8b…7e0432"

--datadirで指定したディレクトリ配下にデータが格納される。下記のようなディレクトリ構成が自動生成された。

$ ls -lR eth_private_net/
eth_private_net/:
合計 12
drwx------ 4 kana kana 4096 12月 27 18:46 geth
drwx------ 2 kana kana 4096 12月 27 18:46 keystore
-rw-rw-r-- 1 kana kana  411 12月 27 18:41 myGenesis.json

eth_private_net/geth:
合計 12
-rw-r--r-- 1 kana kana    0 12月 27 18:46 LOCK
drwxr-xr-x 2 kana kana 4096 12月 27 18:46 chaindata
drwxr-xr-x 2 kana kana 4096 12月 27 18:46 lightchaindata
-rw------- 1 kana kana   64 12月 27 18:46 nodekey

eth_private_net/geth/chaindata:
合計 16
-rw-r--r-- 1 kana kana 1245 12月 27 18:46 000001.log
-rw-r--r-- 1 kana kana   16 12月 27 18:46 CURRENT
-rw-r--r-- 1 kana kana    0 12月 27 18:46 LOCK
-rw-r--r-- 1 kana kana  435 12月 27 18:46 LOG
-rw-r--r-- 1 kana kana   54 12月 27 18:46 MANIFEST-000000

eth_private_net/geth/lightchaindata:
合計 16
-rw-r--r-- 1 kana kana 1245 12月 27 18:46 000001.log
-rw-r--r-- 1 kana kana   16 12月 27 18:46 CURRENT
-rw-r--r-- 1 kana kana    0 12月 27 18:46 LOCK
-rw-r--r-- 1 kana kana  435 12月 27 18:46 LOG
-rw-r--r-- 1 kana kana   54 12月 27 18:46 MANIFEST-000000

eth_private_net/keystore:
合計 0
$

Gethの起動

gethを起動する。
--networkid "15"は、同じnetworkidで起動しているノード(peer)が探しに来るという代物。デフォルトで走査に行くが、今回--nodiscoverを指定しているのでその処理は行われない。consoleでトランザクション処理を操作できるコンソールを起動することが出来る。バックグラウンドで起動しておいて、後でコンソールを起動することもできる。

$ geth --networkid "15" --nodiscover --datadir "/home/kana/eth_private_net" console 2>> /home/kana/eth_private_net/geth_err.log
Welcome to the Geth JavaScript console!

instance: Geth/v1.9.25-stable-e7872729/linux-amd64/go1.15.6
at block: 0 (Thu Jan 01 1970 09:00:00 GMT+0900 (JST))
 datadir: /home/kana/eth_private_net
 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

To exit, press ctrl-d
>

Genesisブロックの表示

Genesisブロックの内容を表示する。作成したmyGenesis.jsonの内容を読み込んでいることを確認する。

> eth.getBlock(0)
{
  difficulty: 16384,
  extraData: "0x",
  gasLimit: 134217728,
  gasUsed: 0,
  hash: "0x7b2e8be699df0d329cc74a99271ff7720e2875cd2c4dd0b419ec60d1fe7e0432",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x3333333333333333333333333333333333333333",
  mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  nonce: "0x0000000000000042",
  number: 0,
  parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 507,
  stateRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  timestamp: 0,
  totalDifficulty: 16384,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}
>

まとめ

導入はここまで。次回はアカウント作成とマイニングをしてみる。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

amazon-dashで、スキャンするNICを指定する方法

amazon-dashでNICを明示的に指定

AmazonDashボタンをIoTボタン化するOSS, amazon-dashのTIPSである。

amazon-dashにて、discoveryもしくはrunする際、複数のNICが存在すると、意図しないNICのパケットを監視してしまう場合がある。
たとえば、eth0, eth1が存在する場合、AmazonDashボタンが接続されているNICがeth1である場合でも、eth0をスキャンしてしまう場合がある。
その場合、以下のTIPSにてスキャンするNICを明示的に指定する必要がある。

実行環境

以下の環境で実行した際の結果を使用した。

# cat /etc/debian_version 
10.7

# python --version
Python 2.7.16

# pip --version
pip 18.1 from /usr/lib/python2.7/dist-packages/pip (python 2.7)

# amazon-dash 
Welcome to Amazon-dash v1.4.0 using Python 2.7.16

discoveryでのNICの指定

discoveryを実行する場合、オプションでNICを指定可能である。

example

# amazon-dash discovery --interface eth1

Document

ヘルプに書いてあった

# amazon-dash discovery --help
Welcome to Amazon-dash v1.4.0 using Python 2.7.16
December 31 is the last day to block requests from your Amazon-dash buttons to Amazon servers. In 2020 your buttons can be bricked in an update from Amazon servers.
Usage: amazon-dash discovery [OPTIONS]

  Discover Amazon Dash device on network.

Options:
  --interface TEXT  Network interface.
  --help            Show this message and exit.

runでのNICの指定

run、もしくはサービス化(systemctlから起動)の場合、/etc/amazon-dash.ymlにて指定を行う。

example

settings:
  interface: eth1

Document

/etc/amazon-dash.ymlそのものに記載は無いが、ソースコード内で確認が出来る。
該当のファイルは、config.pyで、JSONのスキーマで存在を確認出来る。

18:#: Json-schema validation
19:SCHEMA = {
20:    "title": "Config",
21:    "type": "object",
22:    "properties": {
23:        "settings": {
24:            "type": "object",
25:            "properties": {
26:                "delay": {
27:                    "type": "integer"
28:                },
29:                "interface": {
30:                    "type": "string"
31:                },

NICの名前について

NICの名前そのものはamazon-dash内では特にバリデーションをしておらず、そのままscan.pyscan_devicesに渡しているだけのようである。
要には、OSが認識できていれば、なんでも良いらしい。
物理NICの他、VLAN Interface(例:eth1.100)でも正常に動作をしている。

試しに、無効なインターフェース名を渡したところ、こんな感じのエラーを吐いて止まった。
NIC周りを変更した後にトラブルになった際は、参考にして欲しい。

# amazon-dash discovery --interface foo                             
Welcome to Amazon-dash v1.4.0 using Python 2.7.16

(snip)

OSError: foo: No such device exists (SIOCGIFHWADDR: No such device)
Exception IOError: IOError(19, 'No such device') in <bound method L2ListenSocket.__del__ of <scapy.arch.linux.L2ListenSocket object at 0xb6744f0c>> ignored

# echo $?
1
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「nlコマンドAdvent Calendar 2020」まとめ

nlコマンドAdvent Calendar 2020
スクリーンショット 2020-12-26 17.03.31.png


各記事のサマリー


初心者向け記事

このあたりはnlに限らず、各コマンド共通だと思います。


オプション解説記事

オプションは11個あり、9本の記事書きました。


挙動解説記事

基本的な動作仕様と注意点などについて書きました。


代替方法に関する記事

seqの代わりにnlを使ってみる。

他のコマンドでnlする。


その他の記事

性能比較をしてみました。grepcat速すぎ。

nlに限らずコマンドをよりよくしていくための記事です。


他のAdvent Calendarへの寄稿

NetBSD AC

POSIX非互換と不具合報告のお話。

AIIT(産業技術大学院大学) AC

過去の話をまとめたポエム。


ふりかえり


横浜線の停車駅を表示する

特に思い入れのあるシェル芸。coreutilsのnl-i 0ができるようになったのでやってみたかった。

BSD
$ nl -w 1 -v 0 -i 0 -b p'[川山菊新鴨田相橋八片]' yokohamaline | nl -w 1 -i 0 | tr '01' '快各' | expand
各      快      東神奈川
各              大口
各      快      菊名
各      快      新横浜
各              小机
各      快      鴨居
各      快      中山
各              十日市場
各      快      長津田
各              成瀬
各      快      町田
各              古淵
各              淵野辺
各              矢部
各      快      相模原
各      快      橋本
各      快      相原
各      快      八王子みなみ野
各      快      片倉
各      快      八王子

不具合報告

  • coreutils nlでの-d不具合
  • coreutils seqsleepでのinfトークンのドキュメント不足
  • NetBSD(macOS) nlでの-sオプションのPOSIX非互換

記事執筆中の検証で見つけた不具合をリアルタイムに報告していました。連載中に修正方針が固まったものについては、過去記事も修正加筆しています。


今回書けなかった記事

  • coreutilsのcat -nはなぜ速いのか
  • FreeBSDのnl
  • BusyBoxのビルドオプション
  • prと組み合わせる
  • POSIXの策定経緯

今回は調査不足でまとまらず記事にできませんでした。そのうち書くかもしれません。


感想

  • 疲れた
  • 思いつきで始めた(頭おかしい)ので構成なども考えながら
  • 記事も文章になってないところたくさん…
  • 説明順がかなり重要で依存関係がヤバい

  • 結果的にソフトウェア品質が高まったのでやって良かった

  • 調べれば調べるほどわからないことがたくさん

  • nlコマンドぜんぜんわからん


おしまい


  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

XPS13(7390)にArchを入れた(備忘録)

はじめに

XPS13(7390)にArchを入れた時の手順とハマったことの備忘録.

参考にしたサイト

Arch wiki インストールガイド
My Arch Linux Install and Configuration on a Dell XPS 13 7390 (2019)
メモ:Dell XPS 13 (7390)にArch Linuxをインストールしたときのメモ
Arch Linux - wifi-menuがないのでiwctlコマンドで無線接続する

基本的にはこの辺を参考にしました.

ハマったことと解決策

Critical Error Message No bootable devices found.

->ArchLinuxのインストール(3つのブート方式ごとの設定)

Rebootしたら,Error:device '/dev/mapper/vg0-root' not found.

->[SOLVED] Installed LTS kernel- device '/dev/mapper/vg0-root' not found
ここが一番ハマった...

/etc/mkinitcpio.conf
HOOKS=(base udev autodetect keyboard keymap consolefont modconf block lvm2 encrypt filesystems fsck)
/etc/default/grub
GRUB_CMDLINE_LINUX=”cryptdevice=UUID=[UUIDofdevice]:vg0 root=/dev/mapper/vg0-root”

UUIDは下のコマンドで確認.

# cryptsetup luksUUID /dev/nvme0n1p2

インストール後にReboot->wifi接続できない

->iw,dhcpcd,wpa_supplicantをあらかじめインストールしておく.

My Arch Linux Install and Configuration on a Dell XPS 13 7390 (2019)

wifi接続する

-> wpa_supplicant
-> netctl
-> Arch Linux - 無線 LAN 接続
-> ワイヤレス設定

この辺が役に立ちました.wifiはnetctlではなくNetworkManagerにしたらうまくいきました.またうまくドライバが動作しない時は,他のドライバと競合していないか確かめるのが良いです.

# systemctl list-unit-files --state=enabled
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

タブレットPCをManjaro i3環境にした、タッチスクリーンの良さが消えた

TECLAST X4にManjaro i3を入れた作業メモ。

タッチスクリーンで2-in-1が推しのはずのX4に、マウスレスでいけちゃうウィンドウマネージャーをいれてしまい、迷走してます。

目的

  • Manjaroで物書きできる環境を用意すること、ただやってみたかっただけ

用意環境

  • TECLAST X4 11.6インチ
  • USBフラッシュメモリ 8GB

持ち歩くには微妙な重量のタブレットPCです。

結果

達成

  • Manjaro i3、動いた
  • タイル型いいね!
  • GitHubにアクセスして、Twitter見て、Qiita投稿できる程度にはなった

未達

  • Picomで透過!を試したかった
  • tmuxもVimもrcファイルすらあたってない
  • VSCodeいれたけど、入れただけでsettings.json/keybindings.jsonはそのまま 2020-12-27-000509_1920x1080_scrot.png

OSインストールの簡単な流れ

  1. Manjaro i3isoファイルを取得
  2. Rufusでisoファイルから起動用のUSBフラッシュドライブ作成
  3. USBブートしてインストール開始
    1. PCを起動し、起動ロゴが表示されいているときにESCキーを入力することでBIOS画面に入る
    2. Save&Exitタブの下の方に起動元を選択できる一覧があるので、差し込んだUSBフラッシュドライブを選択
    3. 起動確認画面が表示され、tz, keytable, langを変更せずそのままBoot
    4. LIVE Manjaro i3環境が起動し、画面中央に「Manjaro Hello」が表示される
    5. 右下にネットワークっぽいアイコンがあるので、Wifi等に接続する
    6. Manjaro Hallorの下部にある「Launch installer」を選択
    7. インストーラーが文字化けしてまったく文字という文字が表示されない場合は、インストーラー最初の画面の真ん中下にプルダウンがあり、そこから言語を選択できるのでEnglishを選択
    8. 以降はインストールウィザードに従う、tzやkeytableはここでも変更可能
    9. 全行程が完了したら再起動

OSインストール終わった以降

  • Modは、Winキーが初期値だった
  • Terminalは、Mod + Returnが初期ショートカットキーだった

まずはアップデート

# 近場リポジトリ探し(fasttrackだと総スキャンで時間かかるので
$ sudo pacman-mirrors --geoip
$ sudo pacman -Syu

最低限必要なパッケージ

# すでに入っていれば再インストール扱いになる
$ sudo pacman -S gvim git zsh

# こちらも念の為
$ sudo pacman -S ntp
$ timedatectrl status
$ sudo timedatectrl set-ntp true

続いてAUR

$ yay -S google-chrome
$ yay -S visual-studio-code-bin

# バックアップツール
$ yay -S timeshift
  ※dmenuからtimeshift-launcherで初期設定

ターミナル環境(Zsh + Prezto)

$ zsh
$ git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
$ setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
$ chsh -s /usr/bin/zsh

参照:https://dev.classmethod.jp/articles/zsh-prezto/

日本語入力

$ sudo pacman -S fcitx-im fcitx-configtool fcitx-mozc fcitx-gtk2 fcitx-gtk3 fcitx-qt5
~/.xprofile
# Key repeat
xset r rate 200 30(キーリピート

# ctrl/caps入れ替え
setxkbmap -option "ctrl:nocaps"

# Japanese input method
export LANG="ja_JP.UTF-8"
export XMODIFIERS="@im=fcitx"
export XMODIFIER="@im=fcitx"
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export DefaultIMModule=fcitx
~/.i3/config
# Autostart applications
exec --no-startup-id fcitx

日本語フォント

$ sudo pacman -S adobe-source-han-sans-jp-fonts
$ sudo pacman -S noto-fonts-emoji

フォント設定の手順

  1. Ctrl + Mod + b
  2. 7 System & Settings
  3. 1 Appeearance
  4. 3 Set font
  5. Source Han Sans JP Normalを選択

Conkyガジェットの文字化け回避で英語表記に

/usr/bin/start_conky_maia
#!/bin/bash

LC_ALL=C conky -c /usr/share/conky/conky1.10_shortcuts_maia &&
LC_ALL=C conky -c /usr/share/conky/conky_maia &&

exit 0

省電力

$ yay -S tlp powertop
$ sudo tlp start

壁紙変更

$ nitrogen

その他、個人設定

~/.i3/config
#############################
## user settings           ##
#############################
# 日本語入力
exec --no-startup-id fcitx

# Alt + F4でウィンドウ閉じるバインドに
bindsym Mod1+F4 kill

# ブラウザ起動のショートカットキー
bindsym $mod+Shift+Return exec google-chrome-stable

# focus対象の移動をvimに合わせて変更
bindsym $mod+h focus left
bindsym $mod+j focus down
bindsym $mod+k focus up
bindsym $mod+l focus right

# focusされたwindow自体の移動
bindsym $mod+Shift+h move left
bindsym $mod+Shift+j move down
bindsym $mod+Shift+k move up
bindsym $mod+Shift+l move right

# 分割する方向の指定
bindsym $mod+backslash split h;exec notify-send 'tile horizontally'
bindsym $mod+minus split v;exec notify-send 'tile vertically'

bindsym $mod+Ctrl+Shift+h exec xdg-open /usr/share/doc/manjaro/i3_help.pdf

さいごに

見事にマウスレスが達成されてタッチスクリーンが活用されていません!どうにかタッチする機会を検討します!
いずれにしてもやってみた系の作業もQiitaもとても久しぶりでしたが、年末ということもあり気分転換としてもよかったです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む