Inside IOST #01: ローカルサーバーの利用

Inside IOST for Developers

Takao Wada
16 min readJun 18, 2022

IOSTブロックチェーンの公式ドキュメントはこちらにあります。ドキュメントとしては、説明は整っていますが、実際の使い方がわかりにくいものもありますので、実際の開発経験を基にしてシリーズで解説していきます。このシリーズでは、テスト実行はMacで行います。

第1回はIOSTブロックチェーンをローカルで起動し、その情報をコマンドで取得してみます。

1. IOSTローカルサーバー

1.1 準備

docker コマンドを利用しますので、環境に合わせてインストールをしておいてください。2022年6月現在、Docker CE 18.06以降のバージョンが必要です。

1.2 ローカルサーバーを起動する

データを永続化しやすいので、docker-compose を利用して起動することにします。iserver.yml を次のように作成してください。表示上、開業されてしまっている部分もありますので、コピーペーストでエディタに貼り付けて利用してください。ADMIN で指定しているのは、admin アカウントの秘密鍵で、バージョンを指定したい場合は、iost-node の部分をiost-node:3.4.0のように指定します。また、ログとstorageのデータをホストPCに永続化していますので、downした後、再度upしてもデータが残るようになっています。一から作り直したい場合は、iserver フォルダの内容を削除してください。

myiost フォルダを作成し、その中に次の内容の Dockerfile を配置します。

Dockerを使って、IOSTローカルサーバーを起動します。

$ docker-compopse up -d

ちなみに、停止するには次のようにします。

$ docker-compopse down

起動確認してみましょう。

$ docker logs -f iserver
Info 2022-06-17 23:43:41.970 main.go:78 Config Information:
acc:
id: producer000
seckey: 1rA******
algorithm: ed25519
genesis: /var/lib/iserver/genesis
vm:
jspath: vm/v8vm/v8/libjs/
loglevel: ""
db:
ldbpath: /var/lib/iserver/storage/
snapshot:
enable: false
filepath: /var/lib/iserver/storage/snapshot.tar.gz
p2p:
listenaddr: 0.0.0.0:30000
seednodes: []
chainid: 1020
version: 1
datapath: /var/lib/iserver/p2p/
inboundconn: 20
outboundconn: 10
blackpid: []
blackip: []
adminport: "30005"
rpc:
enable: true
gatewayaddr: 0.0.0.0:30001
grpcaddr: 0.0.0.0:30002
alloworigins:
- '*'
trytx: false
exectx: false
log:
filelog:
path: /var/lib/iserver/logs/
level: info
enable: true
consolelog:
level: info
enable: true
asyncwrite: true
enablecontractlog: true
metrics:
pushaddr: ""
username: ""
password: ""
enable: false
id: iost-testnet:visitor00
debug:
listenaddr: 0.0.0.0:30003
version:
netname: debugnet
protocolversion: "1.0"
spv: null
Info 2022-06-17 23:43:41.971 main.go:80 build time:20220316_162717+0000
Info 2022-06-17 23:43:41.971 main.go:81 git hash:560ab682eac02b307074fd2a8c89258a337a9dcc
Info 2022-06-17 23:43:41.971 main.go:82 code version:3.8.0
Info 2022-06-17 23:43:42.392 recovery.go:46 current Tag: ASxfM6F8ogdgE9saS3z6pATH8DxtDeXhYxBW6MqBfY97
Info 2022-06-17 23:43:42.393 chainbase.go:71 recover db done
Info 2022-06-17 23:43:42.397 wal.go:294 RecoverFromDir
Warn 2022-06-17 23:43:42.398 util.go:89 ignore file in WAL directory, path: .1655509368419008000.1.wal.tmp error: bad wal name
Info 2022-06-17 23:43:42.406 block_cache.go:303 Got LIB: 12
Info 2022-06-17 23:43:42.410 block_cache.go:321 Witness Block Num:12
Info 2022-06-17 23:43:42.410 block_cache.go:323 ActiveWitness:6sNQa7PV2SFzqCBtQUcQYJGGoU7XaB6R4xuCQVXNZe6b
Info 2022-06-17 23:43:42.410 block_cache.go:326 PendingWitness:6sNQa7PV2SFzqCBtQUcQYJGGoU7XaB6R4xuCQVXNZe6b
Info 2022-06-17 23:43:42.452 encoder.go:41 Encoder Name:
...

ログが永遠に流れていきますので、止める場合はCtrl+Cで止めてください。実際にトランザクションを発行したりすると、このログに表示されます。

起動後、起動したフォルダに、 iserver フォルダが作成されます。その中に次のようなファイルが作成されています。そのうち、storage フォルダがIOSTのブロックなどのデータを格納しているファイル群になります。BlockCacheWAL フォルダ内には、トランザクションを処理中のデータが格納され、BlockChainDB フォルダには永続化されたブロックデータが格納され、StateDB フォルダは MVCC キャッシュのデータが格納されています。データベースには自体にはLevelDBの改良版であるRocksDB を利用しています。root フォルダには、アカウント情報と作業するファイルを置くようにします。

├── iserver
│ ├── logs
│ │ └── iost.log -> iost_2022-06-18_14.log
│ └── storage
│ ├── BlockCacheWAL
│ ├── BlockChainDB
│ │ ├── 000001.ldb
│ │ ├── CURRENT
│ │ ├── CURRENT.bak
│ │ ├── LOCK
│ │ ├── LOG
│ │ └── MANIFEST-000102
│ └── StateDB
│ ├── 000001.ldb
│ ├── CURRENT
│ ├── CURRENT.bak
│ ├── LOCK
│ ├── LOG
│ └── MANIFEST-000092
├── myiost
│ └── Dockerfile
├── root

IOSTのVMの構成は次のようになっていて、右のState Storageの部分がこのデータベースにあたりますので、上の実際のファイルと合わせて確認してみてください。

2. コマンドラインウォレット iWallet

2.1 iwallet を使う

IOST のコマンドラインウォレットである iwallet は、ここに記述されているように、本来はGo言語をインストールした上で、IOSTサイトのサイトからインストールする必要があります。それでももちろんいいのですが、ここでは、ローカルPCの環境をできるだけ汚さないように、dockerを使って、ローカルサーバー内に入っている iwallet を使います。

iwallet を使うことで、IOSTローカルブロックチェーンに対して、さまざまな処理をすることができます。できることは大きく分けて、1. 情報の取得 、 2. 更新を含む操作、3. システムに関する操作です。それぞれについては、このあとのシリーズで紹介していきます。

まずは、dockerを使ってiwallet コマンドを起動しましょう。何も引数を指定しないとヘルプの表示になります。

$ docker exec -t iserver iwallet
An IOST RPC client
Usage:
iwallet [command]
Available Commands:
account KeyPair manager
balance Check the information of a specified account
block Print block info
call Call the method in contracts
compile Generate contract abi
help Help about any command
key Create a key pair
publish Publish a contract
receipt Find receipt
send Send transaction onto blockchain by given json file
sign Sign a tx and save the signature
state Get blockchain and node state
system Common system contract actions
table Fetch stored info of given contract
transaction Find transactions
transfer Transfer IOST
Flags:
-a, --account string which account to use
--account_dir string $(account_dir) will be used to save accounts (default $HOME/.iwallet)
--amount_limit string amount limit for one transaction, eg iost:300.00|ram:2000 (default "*:unlimited")
--as_publisher_sign use signKeyFiles/signatureFiles for publisher sign
--chain_id uint32 chain id which distinguishes different network (default 1024)
--check_result check publish/call status after sending to chain (default true)
--check_result_delay float32 rpc checking will occur at [checkResultDelay] seconds after sending to chain. (default 3)
--check_result_max_retry int32 max times to call grpc to check tx status (default 30)
--config string configuration file (default $HOME/.iwallet.yaml)
--elapsed_time print elapsed time
-e, --expiration int expiration time for a transaction in seconds (default 90)
-l, --gas_limit float gas limit for a transaction (default 1e+06)
-p, --gas_ratio float gas ratio for a transaction (default 1)
-h, --help help for iwallet
-k, --key_file string the json file that stores your account name and keypair
-o, --output string output json file to save transaction request
--output_key_file string the json file used to save your newly created account name and keypair, only used in 'iwallet account create/import' command
-s, --server string set server of this client (default "localhost:30002")
--sign_algo string sign algorithm (default "ed25519")
--sign_key_files strings optional private key files used for signing, split by comma
--sign_permission string permission used to sign transactions (default "active")
--signature_files strings optional signature files, split by comma
--signers strings additional signers
--try_tx Executes a new call immediately without creating a transaction on the block chain
--tx_time string use the special tx time instead of now, format: 2022-06-18T01:01:59Z
--tx_time_delay uint32 delay the tx time from now
--use_longest get info on longest chain
-v, --verbose print verbose information (default true)
Use "iwallet [command] --help" for more information about a command.

2.1 admin アカウントのインポート

iwallet に admin アカウントをインポートします。結果として、作業フォルダの root/.iwallet フォルダに admin.json というアカウントファイルが生成されます。ローカルでテストする場合はいいですが、これは秘密鍵が書かれたものですので、本番で使用する場合は、慎重に扱ってください。通常のGo版の iwallet コマンドの場合は、自分のフォルダ内に .iwallet が作成されます。ただし、その場合はテスト用と本番用などで .iwallet フォルダを使い分ける必要がでてきます。その際に、くれぐれも本番の秘密鍵を消して紛失したり、間違って共有してしまわないようにしてください。

$ docker exec -t iserver iwallet account import admin 2yquS3ySrGWPEKywCPzX4RTJugqRh7kJSo5aehsLYPEWkUxBWA39oMrZ7ZxuM4fgyXYs2cPwh5n8aNNpH5x2VyK1
keyfile of account admin saved to /root/.iwallet/admin.json
import account admin done

2.2 残高情報の取得

実際に、iwallet を使って、最初から用意されている admin アカウントの残高情報を取得してみましょう。

$ docker exec -t iserver iwallet --server 127.0.0.1:30002 balance admin
Connecting to server 127.0.0.1:30002 ...
{
"name": "admin",
"balance": 20999997618.36,
"gasInfo": {
"currentTotal": 30000000,
"transferableGas": 0,
"pledgeGas": 30000000,
"increaseSpeed": 115,
"limit": 30000000,
"pledgedInfo": [
{
"pledger": "admin",
"amount": 100
},
{
"pledger": "foundation",
"amount": 100
},
{
"pledger": "producer000",
"amount": 100
}
]
},
"ramInfo": {
"available": "100000",
"used": "0",
"total": "100000"
},
"permissions": {
"active": {
"name": "active",
"groupNames": [],
"items": [
{
"id": "Gcv8c2tH8qZrUYnKdEEdTtASsxivic2834MQW6mgxqto",
"isKeyPair": true,
"weight": "100",
"permission": ""
}
],
"threshold": "100"
},
"owner": {
"name": "owner",
"groupNames": [],
"items": [
{
"id": "Gcv8c2tH8qZrUYnKdEEdTtASsxivic2834MQW6mgxqto",
"isKeyPair": true,
"weight": "100",
"permission": ""
}
],
"threshold": "100"
}
},
"groups": {},
"frozenBalances": [],
"voteInfos": []
}
  • balance: 残高(IOST量)
  • gasInfo: GASの情報
  • ramInfo: RAMの情報
  • permissons: パーミッション情報
  • group: グループ情報
  • frozenBalances: フリーズされている(転送不可な)IOST量
  • voteInfos: 投票情報

詳細については、このあとのシリーズで紹介していきます。

関連記事

--

--