Ethereum(4) - マイニングと送金

前回に引き続きgethコンソール上での作業を行います。

マイニング

下記のコマンドを実行するとマイニングが開始されます。

引数の2は、マイニングに利用するスレッド数となります。

[コマンド]

1
miner.start(2)

[結果]

1
null

「null」か「true」と表示されれば、マイニングが開始されています。

マイニングの確認

マイニング中であるかどうかを確認します。

[コマンド]

1
eth.mining

[結果]

1
true

「true」であればマイニング中です。

coinbaseの残高確認

マイニングを行うとetherを獲得でき、coinbaseの残高が増加します。

残高を確認するために次の2関数を使っています。

  • eth.getBalanc関数
    対象アドレスの残高確認する。結果はwei表記。
  • web3.fromWei関数
    wei表記をether表記に変換する。

[コマンド]

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

[結果]

1
84

アカウント作成直後の残高は0ですので、0より大きい値になっていれば正常にマイニングできています。

送金する

送金処理を行います。

まだアカウントが1つしかないので、送金先用のアカウントを1つ作成します。

[コマンド]

1
personal.newAccount("passwd")

[結果]

1
"0xcdf900d55700e14e1f1f92d20da5aa70611010d7"

次に、送金処理を行う前準備として送信元のアカウント(eth.accounts[0])のロックを解除します。

[コマンド]

1
personal.unlockAccount(eth.accounts[0])

[結果]

1
2
3
4
5
Unlock account 0xf4572ec53ab834afa1bd93a2cb32f070fda1c06c
Passphrase:
GoError: Error: account unlock with HTTP access is forbidden at web3.js:6357:37(47)
at native
at <eval>:1:24(6)

???エラーとなってしまいました。

「HTTPアクセスでのアンロックは禁止されている」とのことです。

次回は、このエラーを解決したいと思います。

Ethereum(3) - アカウント作成とgenesisブロックの確認

前回のgethを起動したところからの続きです。

gethの対話型コンソールが起動しており、以降はgethコンソール上での作業となります。

アカウント作成

まずはアカウントを作成します。(引数のパスワードは自由に設定してください。)

[アカウント作成コマンド]

1
personal.newAccount("passwd")

[結果]

1
"0xf4572ec53ab834afa1bd93a2cb32f070fda1c06c"

正常にアカウントが作成されると、アドレスが出力されます。

このアドレスは銀行でいうと口座番号になります。

パスワードは暗証番号にあたるので、他の人に絶対に知られてはいけません。

(パスワードを忘れてしまうと、そのアカウントの資産にアクセスできなくなってしまい、救済措置もありませんので、パスワード管理は慎重に行ってください。)


次に、作成したアカウントの一覧を表示します。

[アカウント確認コマンド]

1
eth.accounts

[結果]

1
["0xf4572ec53ab834afa1bd93a2cb32f070fda1c06c"]

まだ1つしかアカウントを 作成していませんが、複数アカウントを作成した場合はその全てのアドレスが表示されます。


次に、マイニングを行うcoinbaseアカウントを確認します。

[coinbaseアカウント確認コマンド]

1
eth.coinbase

[結果]

1
"0xf4572ec53ab834afa1bd93a2cb32f070fda1c06c"

coinbaseアカウントを変更するときは下記のコマンドを使います

(現状1アカウントしかないので、同じアカウントに切り替えています)

[coinbaseアカウント変更コマンド]

1
miner.setEtherbase(eth.accounts[0])

[結果]

1
true

genesisブロックの確認

ブロックの内容を確認するにはeth.getBlockを使います。

0を指定すると、genesisブロックの内容が確認できます。

[genesisブロックの確認]

1
eth.getBlock(0)

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
difficulty: 0,
extraData: "0x00",
gasLimit: 20000000,
gasUsed: 0,
hash: "0x76d747ec34337ec5677b1aba554769485e160663eee3c63486400bddc21a5e65",
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
miner: "0x0000000000000000000000000000000000000000",
mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
nonce: "0x0000000000000042",
number: 0,
parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
size: 505,
stateRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
timestamp: 0,
totalDifficulty: 0,
transactions: [],
transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
uncles: []
}

次回は、マイニングと送金の操作を試します。

Ethereum(2) - genesisブロックの作成とgethの起動

前回は、Ethereumに参加するためのクライアントgethをインストールしました。

今回は、genesisブロックの作成gethの起動を行います。

genesisブロックの作成

まずはプライベートネット用のデータディレクトリを作成します。

[コマンド]

1
mkdir ~/eth_net/

次に、作成したディレクトリの中に1番最初のブロックであるGenesisブロック(genesis.json)を作成します。

[genesis.json]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0
},
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"difficulty": "0x00",
"alloc": {},
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x00",
"gasLimit": "0x1312d00"
}

初期化処理

ブロックチェーンの初期化処理を行います。

–datadirにデータ用のディレクトリを指定し、initにgenesisファイルを指定します。

[コマンド]

1
geth --datadir "~/eth_net" init ~/eth_net/genesis.json

[結果]

1
2
3
4
5
6
7
8
(途中略)
INFO [06-23|06:42:21.095] Writing custom genesis block
INFO [06-23|06:42:21.095] Persisted trie from memory database nodes=0 size=0.00B time="3.706µs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [06-23|06:42:21.096] Successfully wrote genesis state database=chaindata hash=76d747..1a5e65
INFO [06-23|06:42:21.096] Allocated cache and file handles database=/home/aki/eth_net/geth/lightchaindata cache=16.00MiB handles=16
INFO [06-23|06:42:21.112] Writing custom genesis block
INFO [06-23|06:42:21.112] Persisted trie from memory database nodes=0 size=0.00B time="2.441µs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [06-23|06:42:21.113] Successfully wrote genesis state database=lightchaindata hash=76d747..1a5e65

最後にSuccessfully wrote genesis stateというログが表示されていれば、初期化処理は正常終了しています。

gethの起動

下記のコマンドを実行し、gethを起動します。

[コマンド]

1
geth --networkid "10" --nodiscover --datadir "~/eth_net" --rpc --rpcaddr "localhost" --rpcport "8545" --rpccorsdomain "*" --rpcapi "eth,net,web3,personal" console 2>> ~/eth_net/geth_err.log

[結果]

1
2
3
4
5
6
7
8
9
Welcome to the Geth JavaScript console!

instance: Geth/v1.10.4-stable-aa637fd3/linux-amd64/go1.16.4
at block: 0 (Thu Jan 01 1970 09:00:00 GMT+0900 (JST))
datadir: /home/aki/eth_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
>

上記のように表示されていれば問題なくgethが起動しています。

次回はアカウントの作成を行います。

Ethereum(1) - gethのインストール

Ethereumに参加するためのクライアントはいくつかありますが、今回は一番ポピュラーなgethをインストールします。

gethの主な機能は下記のとおりです。

  • スマートコントラクトの生成と実行
  • etherの送金
  • アカウント作成
  • マイニング

ダウンロード

gethを下記サイトよりダウンロードします。

geth - https://geth.ethereum.org/downloads/

テスト環境としてUbuntu20.04を使用するため、Linux版のGeth 1.10.4 (64bit)をダウンロードします。

インストール

ダウンロードしたファイルを解凍し、gethコマンドへのシンボリックリンクを作成します。

[インストールコマンド]

1
2
tar xzvf geth-linux-amd64-1.10.4-aa637fd3.tar.gz 
sudo ln ./geth-linux-amd64-1.10.4-aa637fd3/geth /usr/local/bin/geth

動作確認

gethコマンドがインストールされていることを確認します。

[コマンド]

1
which geth

[結果]

1
/usr/local/bin/geth

次回はgethの起動を行います。

NEOブロックチェーン(4) - スマートコントラクト実行

NEOはブロックチェーンプロジェクトの1つです。

今回はスマートコントラクトを実行してみます。

スマートコントラクト実行フロー

スマートコントラクトを実行するフローは次のようになります。

  1. pythonでコードを書く。
  2. buildコマンドでpyファイルをコンパイルし、avmファイルを作成する。
  3. sc deployコマンドでコントラクト(avmファイル)をネットワークにデプロイする。
  4. sc invokeコマンドでコントラクトのメソッドをコールする。

1. コーディング

所定のディレクトリに移動し、pythonファイルを作成します。

[コマンド]

1
2
cd ./neo-local/smart-contracts
vi test1.py

[ソース]

test1.py
1
2
def Main():
print("Hello World")

“Hello World”と表示するだけの簡単な処理となります。

2. コンパイル

neo-localを起動し、neo-pythonプロンプト起動します。

[コマンド]

1
2
cd ..
sudo make start

スマートコントラクトのログを表示する設定を行います。

[コマンド]

1
config sc-events on

[結果]

1
Smart contract event logging is now enabled

pyファイルをコンパイルします。

[コマンド]

1
sc build /smart-contracts/test1.py

[結果]

1
Saved output to /smart-contracts/test1.avm 

正常にコンパイルできるとsmart-contractsディレクトリ配下にtest1.avmが作成されます。

3. デプロイ

デプロイを行うためにはウォレットが必要となりますので、ウォレットを開いておきます。

パスワードはcozです。

[コマンド]

1
wallet open neo-privnet.wallet

[結果]

1
2
[password]> ***
Opened wallet at neo-privnet.wallet

deployコマンドを使ってavmファイルをデプロイします。

いくつか入力を求められますが、[contract name]にはtest1を指定し、そのほかは何も入力しないでエンターを押します。

パスワードはcozです。

[コマンド]

1
sc deploy /smart-contracts/test1.avm True False False 07 05

引数の意味は、順番に次の通りです。

  • True コントラクトがストレージを使うかどうか(needs_storage)
  • False 他のコントラクトを参照するかどうか(needs_dynamic_invoke)
  • False コントラクト内でNEOやNEOGas、他のトークンとの換金が行われるか(is_payable)
  • 07 inputがstring型である
  • 05 outputがbyte型がである

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Please fill out the following contract details:
[Contract Name] > test1
[Contract Version] >
[Contract Author] >
[Contract Email] >
[Contract Description] >
Creating smart contract....
Name: test1
Version:
Author:
Email:
Description:
Needs Storage: True
Needs Dynamic Invoke: False
Is Payable: False
{
"hash": "0x5f21886e9c5674ef65f3ba787c45c7a4957621cd",
"script": "53c56b0b48656c6c6f20576f726c64680f4e656f2e52756e74696d652e4c6f67006c7566",
"parameters": [
"String"
],
"returntype": "ByteArray"
}
[I 210620 01:22:44 EventHub:58] [test_mode][SmartContract.Contract.Create] [5f21886e9c5674ef65f3ba787c45c7a4957621cd] {'type': 'InteropInterface', 'value': {'version': 0, 'hash': '0x5f21886e9c5674ef65f3ba787c45c7a4957621cd', 'script': '53c56b0b48656c6c6f20576f726c64680f4e656f2e52756e74696d652e4c6f67006c7566', 'parameters': ['String'], 'returntype': 'ByteArray', 'name': 'test1', 'code_version': '', 'author': '', 'email': '', 'description': '', 'properties': {'storage': True, 'dynamic_invoke': False, 'payable': False}}}
[I 210620 01:22:44 EventHub:58] [test_mode][SmartContract.Execution.Success] [d3e19bd3d6b90ea7af5c8fa0681aed5c8ac9bb71] {'type': 'Array', 'value': [{'type': 'InteropInterface', 'value': {'version': 0, 'hash': '0x5f21886e9c5674ef65f3ba787c45c7a4957621cd', 'script': '53c56b0b48656c6c6f20576f726c64680f4e656f2e52756e74696d652e4c6f67006c7566', 'parameters': ['String'], 'returntype': 'ByteArray', 'name': 'test1', 'code_version': '', 'author': '', 'email': '', 'description': '', 'properties': {'storage': True, 'dynamic_invoke': False, 'payable': False}}}]}
Used 500.0 Gas

-------------------------------------------------------------------------------------------------------------------------------------
Test deploy invoke successful
Total operations executed: 11
Results:
[<neo.Core.State.ContractState.ContractState object at 0x7f5da0a520b8>]
Deploy Invoke TX GAS cost: 490.0
Deploy Invoke TX Fee: 0.0
-------------------------------------------------------------------------------------------------------------------------------------

Enter your password to continue and deploy this contract
[password]> ***
[I 210620 01:23:56 Transaction:619] Verifying transaction: b'8d4eb06e2f3344c961b20e87fb89c879449ee4e58961f15e27042d9ff8a3d85b'
[I 210620 01:23:57 EventHub:62] [SmartContract.Verification.Success][2843] [9b0ab1768245bae9dd09ff3231acf1667a6aae3d] [tx 8d4eb06e2f3344c961b20e87fb89c879449ee4e58961f15e27042d9ff8a3d85b] {'type': 'Array', 'value': [{'type': 'Boolean', 'value': True}]}
Relayed Tx: 8d4eb06e2f3344c961b20e87fb89c879449ee4e58961f15e27042d9ff8a3d85b

ネットワークにコンストラクトが反映されるまで少し時間が必要となりますので、少々待ちます。

デプロイしたコントラクトを確認します。

引数にはデプロイ時に指定した[contract name] test1を指定します。

[コマンド]

1
search contract test1

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Found 1 results for test1
{
"version": 0,
"hash": "0x5f21886e9c5674ef65f3ba787c45c7a4957621cd",
"script": "53c56b0b48656c6c6f20576f726c64680f4e656f2e52756e74696d652e4c6f67006c7566",
"parameters": [
"String"
],
"returntype": "ByteArray",
"name": "test1",
"code_version": "",
"author": "",
"email": "",
"description": "",
"properties": {
"storage": true,
"dynamic_invoke": false,
"payable": false
}
}

4行目の”hash”は、コンストラクトを実行するときに必要となります。

4. 実行

デプロイしたコントラクトを実行します。

引数にはsearchコマンドで表示したhashを指定します。

パスワードはcozです。

[コマンド]

1
sc invoke 0x5f21886e9c5674ef65f3ba787c45c7a4957621cd

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
neo> sc invoke 0x5f21886e9c5674ef65f3ba787c45c7a4957621cd                                                               
[I 210620 01:29:21 EventHub:58] [test_mode][SmartContract.Runtime.Log] [5f21886e9c5674ef65f3ba787c45c7a4957621cd] {'type': 'String', 'value': 'Hello World'}
[I 210620 01:29:21 EventHub:58] [test_mode][SmartContract.Execution.Success] [5f21886e9c5674ef65f3ba787c45c7a4957621cd] {'type': 'Array', 'value': [{'type': 'ByteArray', 'value': bytearray(b'')}]}
Used 0.016 Gas

-------------------------------------------------------------------------------------------------------------------------------------
Test invoke successful
Total operations: 11
Results [{'type': 'ByteArray', 'value': ''}]
Invoke TX GAS cost: 0.0
Invoke TX fee: 0.0001
-------------------------------------------------------------------------------------------------------------------------------------

Enter your password to continue and deploy this contract
[password]> ***
[I 210620 01:29:25 Transaction:619] Verifying transaction: b'db800ab02631ae8fd05b1676eb14b8fe688acbae8191145459a8677ec6694750'
[I 210620 01:29:25 EventHub:62] [SmartContract.Verification.Success][3166] [b2348581314004c5ab7183174a6d021c84c881fa] [tx db800ab02631ae8fd05b1676eb14b8fe688acbae8191145459a8677ec6694750] {'type': 'Array', 'value': [{'type': 'Boolean', 'value': True}]}
Relayed Tx: db800ab02631ae8fd05b1676eb14b8fe688acbae8191145459a8677ec6694750

結果に’Hello World’(2行目)が表示されていることが確認できます。

また4行目の「Used 0.016 Gas 」よりGasが0.016消費されたことが分かります。

NEOブロックチェーン(3) - walletの操作

NEOはブロックチェーンプロジェクトの1つです。

今回はwalletの操作を試してみます。

walletの準備

まずはチュートリアル用に十分なGASが入ったwalletをローカル環境にインストールします。

[コマンド]

1
2
cd ./neo-local/wallets
curl -O https://s3.amazonaws.com/neo-experiments/neo-privnet.wallet

上記コマンドで、neo-privnet.walletというファイルがダウンロードされます。

walletの操作

neo-pythonのプロンプトを起動します。

[コマンド]

1
2
cd ..
sudo make start

neo-pythonのプロンプトが起動されると「neo>」が表示されます。

ダウンロードしたwalletを開けます。

パスワードは「coz」です。

[コマンド]

1
wallet open neo-privnet.wallet

[結果]

1
2
[password]> ***                                                                                                         
Opened wallet at neo-privnet.wallet

次に、walletの中身を確認します。

[コマンド]

1
wallet

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[I 210619 00:24:52 UserWallet:480] Script hash b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9' <class 'bytes'>
Wallet {
"path": "neo-privnet.wallet",
"addresses": [
{
"version": 0,
"address": "AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
"script_hash": "e9eed8dc39332032dc22e5d6e86332c50327ba23",
"frozen": false,
"votes": [],
"balances": [
{
"asset": "0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b",
"value": "100000000.0"
},
{
"asset": "0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",
"value": "1808.0"
}
],
"is_watch_only": false
}
],
"height": 1401,
"percent_synced": 100,
"synced_balances": [
"[NEO]: 100000000.0 ",
"[NEOGas]: 1808.0 "
],
"public_keys": [
{
"Address": "AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
"Public Key": "031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a"
}
],
"tokens": [],
"claims": {
"available": "0.0",
"unavailable": "4696.0"
}
}

NEOとGasが入ったWalletであることが確認できます。(27-28行目)

次回は、簡単なスマートコントラクトを実行してみます。

NEOブロックチェーン(2) - neo-localインストール

NEOはブロックチェーンプロジェクトの1つです。

neo-localは、自身のPCやサーバ上にすぐにNEOブロックチェーンを展開できるツールです。

neo-localのサービス

neo-localは、次のサービスで構成されます。

サービス内容
neo-local-faucet開発用フォーセット
neo-privatenetローカル実行用のプライベートネット
neo-python開発用CLI
neo-scan-apiブロック参照ツールのAPI
neo-scan-syncブロック参照ツールのブロックチェーンとの同期
postgresneoscan用のデータベース

neo-localを使うと、複数のDockerイメージが展開されます。

neo-localインストールと起動

以下のコマンドを実行し、neo-localのインストールと起動を行います。

初回起動時にDockerイメージをダウンロードしますので、時間がかかります。

[コマンド]

1
2
3
git clone https://github.com/CityOfZion/neo-local.git
cd neo-local.git
sudo make start

正常に起動できると下記のようなログが表示され、neo-pythonのプロンプトが表示されます。

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Pulling neo-cli-privatenet-1 ... done
Pulling postgres ... done
Pulling neo-scan ... done
Pulling neo-python ... done
Pulling neo-faucet ... done
Pulling autoheal ... done
[neo-local] Starting Docker containers...
Creating network "neo-local_inside" with the default driver
Creating network "neo-local_host-exposed" with driver "bridge"
Creating neo-cli-privatenet-1 ... done
Creating postgres ... done
Creating neo-scan ... done
Creating neo-faucet ... done
Creating neo-python ... done
Creating neo-local_autoheal ... done
[neo-local] Waiting for network.....................
[neo-local] Network running! 🎉
[neo-local] Attaching terminal to neo-python client

Open wallet (password: 'coz'): wallet open neo-privnet.wallet
Test smart contract: sc build_run /smart-contracts/wake_up_neo.py True False False 07 05 main

Privatenet useragent '/Neo:2.10.2/', nonce: 1923845013
[I 210618 22:55:07 Settings:331] Created 'Chains' directory at /root/.neopython/Chains
[I 210618 22:55:07 LevelDBBlockchain:112] Created Blockchain DB at /root/.neopython/Chains/privnet
[I 210618 22:55:07 NotificationDB:73] Created Notification DB At /root/.neopython/Chains/privnet_notif
NEO cli. Type 'help' to get started


neo>

neo-local停止

neo-localを終了するためには、一旦neo-pythonのプロンプトを終了してから、neo-local停止コマンドを実行します。

[コマンド]

1
2
quit
sudo make stop

正常に停止できると下記のようなログが表示されます。

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[neo-local] Stopping Docker containers...
Stopping neo-local_autoheal ... done
Stopping neo-faucet ... done
Stopping neo-python ... done
Stopping neo-scan ... done
Stopping postgres ... done
Stopping neo-cli-privatenet-1 ... done
Removing neo-local_autoheal ... done
Removing neo-faucet ... done
Removing neo-python ... done
Removing neo-scan ... done
Removing postgres ... done
Removing neo-cli-privatenet-1 ... done
Removing network neo-local_inside
Removing network neo-local_host-exposed
[neo-local] Done 🎉

以上で、NEOブロックチェーンを試せる環境が整いました。

次回は、neo-pythonのプロンプトでいろいろとコマンドを実行してみます。

NEOブロックチェーン(1) - 事前準備

NEOはブロックチェーンプロジェクトの1つです。

今回からNEO上での分散型アプリケーション(dApps)を構築するための環境構築と、簡単なスマートコントラクトをPythonで作成する記事を書いていきます。

環境としてUbuntu20.04を想定しています。

事前準備

NEOブロックチェーンを構築するために次の3つが必要となります。

  • Git
  • Docker
  • Docker Compose

Gitインストール

次のコマンドを実行しgitをインストールします。

[コマンド]

1
sudo apt-get install git

インストールが正常に終了したら、以下のコマンドでgitバージョンを確認します。

[コマンド]

1
git --version

[結果]

1
git version 2.25.1

Dockerインストール

Dockerをインストールします。

[コマンド]

1
2
3
4
5
6
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get install docker-ce docker-ce-cli containerd.io

インストールが正常に終了したら、以下のコマンドでdockerバージョンを確認します。

[コマンド]

1
sudo docker version

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Client: Docker Engine - Community
Version: 20.10.7
API version: 1.41
Go version: go1.13.15
Git commit: f0df350
Built: Wed Jun 2 11:56:38 2021
OS/Arch: linux/amd64
Context: default
Experimental: true

Server: Docker Engine - Community
Engine:
Version: 20.10.7
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: b0f5bc3
Built: Wed Jun 2 11:54:50 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.6
GitCommit: d71fcd7d8303cbf684402823e425e9dd2e99285d
runc:
Version: 1.0.0-rc95
GitCommit: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
docker-init:
Version: 0.19.0
GitCommit: de40ad0

Docker Composeインストール

Docker Composeをインストールします。

[コマンド]

1
2
3
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

インストールが正常に終了したら、以下のコマンドでDocker Composeバージョンを確認します。

[コマンド]

1
docker-compose --version

[結果]

1
docker-compose version 1.29.2, build 5becea4c

以上で事前準備は完了です。

次回は、NEOブロックチェーンを展開できるツールneo-localをインストールします。

カスタムGym環境作成(27) - 広げたマップを強化学習で攻略(学習率を深ぼり2回目)

今回も、学習率を調整して結果がどう変わるか見ていきたいと思います。

[広くしたマップイメージ]

学習率の微調整2回目

前回の結果より、学習率1.5付近の結果も比較良かったので、さらに学習率1.6から2.5の結果も確認してみます。

ソースの修正箇所は、26-35行目となります。

[ソース]

train7.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# 警告を非表示
import os
import warnings
warnings.simplefilter('ignore')
import tensorflow as tf
tf.get_logger().setLevel("ERROR")

import gym
from env7 import MyEnv

from stable_baselines.common.vec_env import DummyVecEnv
#from stable_baselines import PPO2
from stable_baselines import ACKTR
from stable_baselines.bench import Monitor

# ログフォルダの作成
log_dir = './logs/'
os.makedirs(log_dir, exist_ok=True)

# 環境の生成
env = MyEnv()
env = Monitor(env, log_dir, allow_early_resets=True)
env = DummyVecEnv([lambda: env])

# モデルの生成
model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=1.6)
#model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=1.7)
#model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=1.8)
#model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=1.9)
#model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=2.0)
#model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=2.1)
#model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=2.2)
#model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=2.3)
#model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=2.4)
#model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=2.5)

# モデルの学習
model.learn(total_timesteps=128000)

# モデルの保存
model.save('model7')

# モデルのテスト
state = env.reset()
total_reward = 0
while True:
# 環境の描画
env.render()

# モデルの推論
action, _ = model.predict(state)

# 1ステップの実行
state, reward, done, info = env.step(action)
total_reward += reward
print('reward:', reward, 'total_reward', total_reward)
print('-----------')

print('')
# エピソード完了
if done:
# 環境の描画
print('total_reward:', total_reward)
break

学習率を変更しながら実行し、それぞれの最終結果と平均報酬遷移(グラフ)を確認します。

[結果]

学習率 最終位置・最終報酬 平均報酬遷移
1.6
1.7
1.8
1.9
2.0
2.1
2.2
2.3
2.4
2.5

学習率1.9と2.0は全エピソードの半分くらいゴールしているんですが、完全攻略はできていません。

もう一歩のような気もするんですが・・・😔

カスタムGym環境作成(26) - 広げたマップを強化学習で攻略(学習率を深ぼり)

今回は、学習率を微調整して結果がどう変わるか見ていきたいと思います。

[広くしたマップイメージ]

学習率の微調整

前回の結果より、学習率0.1~1.0付近でのゴール回数が多いように感じられました。

今回は学習率を0.5から1.5まで0.1ずつ増やしてその結果を確認していきたいと思います。

ソースの修正箇所は、26-36行目となります。

[ソース]

train7.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# 警告を非表示
import os
import warnings
warnings.simplefilter('ignore')
import tensorflow as tf
tf.get_logger().setLevel("ERROR")

import gym
from env7 import MyEnv

from stable_baselines.common.vec_env import DummyVecEnv
#from stable_baselines import PPO2
from stable_baselines import ACKTR
from stable_baselines.bench import Monitor

# ログフォルダの作成
log_dir = './logs/'
os.makedirs(log_dir, exist_ok=True)

# 環境の生成
env = MyEnv()
env = Monitor(env, log_dir, allow_early_resets=True)
env = DummyVecEnv([lambda: env])

# モデルの生成
model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=0.5)
#model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=0.6)
#model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=0.7)
#model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=0.8)
#model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=0.9)
#model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=1.0)
#model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=1.1)
#model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=1.2)
#model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=1.3)
#model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=1.4)
#model = ACKTR('MlpPolicy', env, verbose=1, learning_rate=1.5)

# モデルの学習
model.learn(total_timesteps=128000)

# モデルの保存
model.save('model7')

# モデルのテスト
state = env.reset()
total_reward = 0
while True:
# 環境の描画
env.render()

# モデルの推論
action, _ = model.predict(state)

# 1ステップの実行
state, reward, done, info = env.step(action)
total_reward += reward
print('reward:', reward, 'total_reward', total_reward)
print('-----------')

print('')
# エピソード完了
if done:
# 環境の描画
print('total_reward:', total_reward)
break

学習率を変更しながら実行し、それぞれの最終結果と平均報酬遷移(グラフ)を確認します。

[結果]

学習率 最終位置・最終報酬 平均報酬遷移
0.5
0.6
0.7
0.8
0.9
1.0
1.1
1.2
1.3
1.4
1.5

ゴール回数は増えているように見えますが、今回も攻略するまでには至りませんでした。

次回ももう少し学習率を調整を行ってみたいと思います。