Ethereum(6) - Mist Wallet(公式ウォレット)のインストールと起動

Mist Wallet(ミストウォレット)は、Ethereumの公式ウォレットです。

下記のような機能を持っています。

  • アカウントの生成
  • etherの残高確認や送金
  • スマートコントラクトの生成/関数呼び出し
  • イベントの確認

Mist Wallet(ミストウォレット)のダウンロード

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

Mist Wallet(ミストウォレット) - https://github.com/ethereum/mist/releases

Ubuntu20.04で動作確認をしていますので、Ethereum-Wallet-linux64-0-11-1.zipをダウンロードしました。

ダウンロードしたzipファイル解凍します。

[コマンド]

1
unzip Ethereum-Wallet-linux64-0-11-1.zip

解凍すると次のようなファイルが作成されます。

Mist Wallet(ミストウォレット)の起動

Mist Wallet(ミストウォレット)を起動するために、解凍したディレクトリに移動し次のコマンド実行します。

[コマンド]

1
./ethereumwallet

[結果]

1
./ethereumwallet: error while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory

上記のようなエラーが発生しました。

不足のライブラリlibgconf-2.so.4をインストールします。

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

1
sudo apt-get install libgconf-2-4

もう一度起動してみます。

[コマンド]

1
./ethereumwallet

またエラーが発生しました。

ダイアログに表示されているコマンドを実行し、NTPをインストールします。

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

1
sudo apt-get install ntp

再度起動してみます。

[コマンド]

1
./ethereumwallet

Ethereum Walletのウィンドウが表示され、あと一歩という感じでしたが、三度エラーが発生しました。

「ノードにつながりませんか?ログを見てください」とのことでログを確認します。

(ちなみにgethは起動した状態になっています。)

[all.log]

1
2
3
4
5
[2021-06-27T07:52:02.042] [ERROR] EthereumNode - Failed to connect to node Error: Unable to connect to socket: timeout
at Timeout.setTimeout [as _onTimeout] (/home/aki/ダウンロード/wallet/resources/app.asar/modules/sockets/base.js:93:27)
at ontimeout (timers.js:469:11)
at tryOnTimeout (timers.js:304:5)
at Timer.listOnTimeout (timers.js:264:5)

ノードにつながらずタイムアウトになったようですが、解決するヒントになるような情報はないようです。

次回は、この問題を調査し解決していきたいと思います。

Ethereum(5) - 送金(解決編)

前回は送金前にアカウントのロックを解除しようとしてエラーが発生しました。

今回はその解決編です。

geth起動オプションの追加

エラーメッセージの”account unlock with HTTP access is forbidden at web3.js”を検索したところ、gethの起動時に–allow-insecure-unlockオプションを追加すればよいとの情報を見つけました。

[コマンド]

1
2
geth --allow-insecure-unlock --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
10
Welcome to the Geth JavaScript console!

instance: Geth/v1.10.4-stable-aa637fd3/linux-amd64/go1.16.4
coinbase: 0xf4572ec53ab834afa1bd93a2cb32f070fda1c06c
at block: 485 (Sat Jun 26 2021 06:50:42 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
>

問題なく起動できました。

アカウントロックの解除

前回失敗したアカウントロックの解除コマンドを再度実行します。

[コマンド]

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

[結果]

1
2
3
Unlock account 0xf4572ec53ab834afa1bd93a2cb32f070fda1c06c
Passphrase:
true

今度は問題なくロックを解除することができました。

送金

マイニングを開始し、送金処理を実行してみます。

それぞれのパラメータの意味は次の通りです。

  • from
    送金元のアドレス。
  • to
    送信先のアドレス。
  • value
    送金額。wei表示での送金額。web3.toWei関数を使ってetherをweiに変換しています。

[コマンド]

1
2
miner.start(2)
eth.sendTransaction({from:eth.accounts[0], to:eth.accounts[1], value:web3.toWei(5, "ether")})

[結果]

1
"0x489deb0f0e2b7366733e48f29481ace37d7906fb5f3b052879e87dda29cd275c"

結果には16進のトランザクションハッシュが出力されます。

トランザクション確認

トランザクションの中身を確認します。

引数には送金した際に出力されたトランザクションハッシュを指定します。

[コマンド]

1
eth.getTransaction('0x489deb0f0e2b7366733e48f29481ace37d7906fb5f3b052879e87dda29cd275c')

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
blockHash: "0xe747b7c38b25a01a50cb5702414411fc947f1b5e2d9b8926c362ead467537120",
blockNumber: 506,
from: "0xf4572ec53ab834afa1bd93a2cb32f070fda1c06c",
gas: 21000,
gasPrice: 1000000000,
hash: "0x489deb0f0e2b7366733e48f29481ace37d7906fb5f3b052879e87dda29cd275c",
input: "0x",
nonce: 0,
r: "0xc2e868fe0ad7eb061ef298665d7b2066c162e14b5c1cf256861ab17c7bd91ef8",
s: "0x45a8876c1ff252b80ce9d3abfedbd5924bbf59b8c380b25dfeffa4ab862115a0",
to: "0xcdf900d55700e14e1f1f92d20da5aa70611010d7",
transactionIndex: 0,
type: "0x0",
v: "0x42",
value: 5000000000000000000
}

fromには送信元のアドレスが表示され、toには送信先のアドレスが表示されます。

valueにはwei表示での送金額が表示されます。etherに換算すると5etherになります。

トランザクションのレシート確認

次にトランザクションのレシートを確認します。

[コマンド]

1
eth.getTransactionReceipt('0x489deb0f0e2b7366733e48f29481ace37d7906fb5f3b052879e87dda29cd275c')

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
blockHash: "0xe747b7c38b25a01a50cb5702414411fc947f1b5e2d9b8926c362ead467537120",
blockNumber: 506,
contractAddress: null,
cumulativeGasUsed: 21000,
effectiveGasPrice: 1000000000,
from: "0xf4572ec53ab834afa1bd93a2cb32f070fda1c06c",
gasUsed: 21000,
logs: [],
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
status: "0x1",
to: "0xcdf900d55700e14e1f1f92d20da5aa70611010d7",
transactionHash: "0x489deb0f0e2b7366733e48f29481ace37d7906fb5f3b052879e87dda29cd275c",
transactionIndex: 0,
type: "0x0"
}

トランザクションがブロックに取り込みが完了されていれば上記のような情報が表示されます。

「null」が返ってきた場合は、まだブロックに取り込まれていないので少し待つ必要があります。(Ethereumでは約15秒間隔でマイニングされます。)

blockNumberを見ると、506ブロックに取り込まれたことが確認できます。

送金先の残高確認

送金先アドレスの残高を確認します

[コマンド]

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

[結果]

1
5

5etherがきちんと送金されていることが分かります。

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をインストールします。