Disclaimer:
Exonum на VirtualBox в образе CentOS 7.5 работает по разному в Docker (корректно) и скомпилированный вручную (вылезают ошибки в JS). При этом версии Node.JS и Linux Kernel совпадают. Дальнейшее расследование будет проводиться по необходимости.
Схема:
Короткий путь:
Образ
VirtualBox image на 17.10.2018 (требует 20 Gb на диске + сам образ 6 Gb)
\\Billing.ru\dfs\incoming\ASushkov\VirtualBox
CentOS 7.5 + Exonum + make v2.ova
User: nwm
Pass: nwm
Запуск Docker:
docker run -p 8000-8008:8000-8008 serhiioryshych/exonum-cryptocurrency-advanced-example
Доступ: http://192.168.56.1:8008
Запуск ручной сборки
cd exonum/examples/cryptocurrency-advanced/backend
exonum-cryptocurrency-advanced run --node-config example/node_1_cfg.toml --db-path example/db1 --public-api-address 0.0.0.0:8200
cd exonum/examples/cryptocurrency-advanced/frontend
npm start -- --port=5555 --api-root=http://127.0.0.1:8200
Доступ: http://192.168.56.1:5555
Скриншоты и API
см. Appendix
Длинный путь:
Документы и исходники
GitHub: https://github.com/exonum/
Exonum Doc включая установку: https://exonum.com/doc/
Install examples: https://github.com/exonum/exonum/blob/master/examples/cryptocurrency-advanced/README.md
VirtualBox
Устанавливаем:
- CentOS 7.5
- Add Extentions
- uname -a
Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Установка Exonum из Docker образа
sudo yum install docker
docker –version
systemctl start docker
docker run -p 8000-8008:8000-8008 serhiioryshych/exonum-cryptocurrency-advanced-example
Доступ:
Установка Exonum из исходников
В образе CentOS 7.5 от Nexign уже установлено:
sudo yum install git gcc gcc-c++
Sodium – крипто библиотека
Скачиваем отсюда:
https://download.libsodium.org/libsodium/releases/
Например так:
wget https://download.libsodium.org/libsodium/releases/libsodium-1.0.16.tar.gz
Устанавливаем:
tar -xf libsodium-1.0.16.tar.gz
cd libsodium-1.0.16.tar.gz
./configure && make && make check && sudo make install
RocksDB
Подготовка
cd ~
git clone https://github.com/gflags/gflags.git
cd gflags
git checkout v2.0
./configure && make && sudo make install
sudo yum install snappy snappy-devel zlib zlib-devel bzip2 bzip2-devel lz4-devel
Ставим саму RocksDB
cd ~
git clone https://github.com/facebook/rocksdb.git
cd rocksdb/
make shared_lib
или это:
make static_lib
Правим окружение:
export ROCKSDB_LIB_DIR=/home/nwm/rocksdb
export LIBRARY_PATH=$LIBRARY_PATH:/home/nwm/rocksdb
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nwm/rocksdb:/usr/local/lib
export CPATH=$CPATH:/usr/local/include
export SNAPPY_LIB_DIR=/usr/local/lib
Rust Toolchain
устанавливаем
curl https://sh.rustup.rs -sSf | sh
пути сразу
source $HOME/.cargo/env
проверяем
rustc --version
Добавить в PATH:
$HOME/.cargo/bin
source .bash_profile
Compiling Exonum
Install OpenSSL
sudo yum install openssl
sudo yum install openssl-devel
Сам Exonum
cd ~
git clone https://github.com/exonum/exonum.git
cd exonum
cargo test –manifest-path exonum/Cargo.toml
Компилим пример: cryptocurrency-advanced
Из каталога с Exonum переходим в backend:
cd examples/cryptocurrency-advanced/backend
Или компилим пример:
cargo install
Или если уже были скомпилированы в другом месте, то
cargo install --force
Или если уже был установлен:
cargo build
Для ЧЕТЫРЕХ нод
Далее в этом же каталоге же запускаем генерацию конфигураций
Грохаем все Exonum: sudo ss -tupl | pgrep -f exonum | xargs kill
mkdir example
exonum-cryptocurrency-advanced generate-template example/common.toml –validators-count 4
exonum-cryptocurrency-advanced generate-config example/common.toml example/pub_1.toml example/sec_1.toml --peer-address 127.0.0.1:6331 exonum-cryptocurrency-advanced generate-config example/common.toml example/pub_2.toml example/sec_2.toml --peer-address 127.0.0.1:6332 exonum-cryptocurrency-advanced generate-config example/common.toml example/pub_3.toml example/sec_3.toml --peer-address 127.0.0.1:6333 exonum-cryptocurrency-advanced generate-config example/common.toml example/pub_4.toml example/sec_4.toml --peer-address 127.0.0.1:6334
exonum-cryptocurrency-advanced finalize --public-api-address 0.0.0.0:8200 --private-api-address 0.0.0.0:8091 example/sec_1.toml example/node_1_cfg.toml --public-configs example/pub_1.toml example/pub_2.toml example/pub_3.toml example/pub_4.toml exonum-cryptocurrency-advanced finalize --public-api-address 0.0.0.0:8201 --private-api-address 0.0.0.0:8092 example/sec_2.toml example/node_2_cfg.toml --public-configs example/pub_1.toml example/pub_2.toml example/pub_3.toml example/pub_4.toml exonum-cryptocurrency-advanced finalize --public-api-address 0.0.0.0:8202 --private-api-address 0.0.0.0:8093 example/sec_3.toml example/node_3_cfg.toml --public-configs example/pub_1.toml example/pub_2.toml example/pub_3.toml example/pub_4.toml exonum-cryptocurrency-advanced finalize --public-api-address 0.0.0.0:8203 --private-api-address 0.0.0.0:8094 example/sec_4.toml example/node_4_cfg.toml --public-configs example/pub_1.toml example/pub_2.toml example/pub_3.toml example/pub_4.toml
Далее в этом же каталоге же запускаем блокчейн:
cd examples/cryptocurrency-advanced/backend
nohup exonum-cryptocurrency-advanced run --node-config example/node_1_cfg.toml --db-path example/db1 --public-api-address 0.0.0.0:8200 &
nohup exonum-cryptocurrency-advanced run --node-config example/node_2_cfg.toml --db-path example/db2 --public-api-address 0.0.0.0:8201 &
nohup exonum-cryptocurrency-advanced run --node-config example/node_3_cfg.toml --db-path example/db3 --public-api-address 0.0.0.0:8202 &
nohup exonum-cryptocurrency-advanced run --node-config example/node_4_cfg.toml --db-path example/db4 --public-api-address 0.0.0.0:8203 &
Для ОДНОЙ ноды
mkdir example
exonum-cryptocurrency-advanced generate-template example/common.toml –validators-count 1
exonum-cryptocurrency-advanced generate-config example/common.toml example/pub_1.toml example/sec_1.toml --peer-address 127.0.0.1:6331
exonum-cryptocurrency-advanced finalize --public-api-address 0.0.0.0:8200 --private-api-address 0.0.0.0:8091 example/sec_1.toml example/node_1_cfg.toml --public-configs example/pub_1.toml
nohup exonum-cryptocurrency-advanced run --node-config example/node_1_cfg.toml --db-path example/db1 --public-api-address 0.0.0.0:8200 &
Frontend
Устанавливаем Node.js and npm on CentOS 7
https://nodejs.org/en/download/package-manager/
On RHEL, CentOS or Fedora, for Node.js v8 LTS:
curl –silent –location https://rpm.nodesource.com/setup_8.x | sudo bash –
sudo yum -y install nodejs
Из каталога с Exonum переходим в пример frontend:
cd examples/cryptocurrency-advanced/frontend
Смотрим версию Node:
node -e “console.log(‘Running Node.js ‘ + process.version)”
Устанавливаем нужную версию:
nvm install 8.11.3
npm install
npm run build
Отключаем firewall:
systemctl stop firewalld
systemctl disable firewalld
Запускаем:
npm start -- --port=5555 --api-root=http://127.0.0.1:8200
Доступ:
Изнутри:
Или снаружи:
Appendix
При входе на IP примера заводим кошелек test_user:
При нажатии на кнопку Register запоминаем Secret key, например:
8e08fa13466581a30958198b1d6e729e53943eaeaf203570e3b3ec879c1cbc70dea18489e18e342ccbb994633aebb7397df6c7aebe380581e2a74264a70c9d82
И Public key:
dea18489e18e342ccbb994633aebb7397df6c7aebe380581e2a74264a70c9d82
В ответ получаем hash транзакции
{
“tx_hash”: “b10ca1bdee4b4958ca7adbfef81a44a5ce795bc0ed32b19c849c187ed4eb1437”
}
запоминаем hash. Далее можно получать информацию используя API.
Кошелек можно завести и с помощью API, но для этого надо уметь работать с крипто API:
API Create wallet
посылаем POST
http://192.168.56.1:5555/api/services/cryptocurrency/v1/wallets/transaction
с корректно сформированным телом:
{
“protocol_version”: 0,
“service_id”: 128,
“message_id”: 2,
“body”: {
“pub_key”: “dea18489e18e342ccbb994633aebb7397df6c7aebe380581e2a74264a70c9d82”,
“name”: “test_user”
},
“signature”: “e75ab828636c3496e00f033621081117a2dc840e1f84cb44bbbf1705001360988ce34008746c66a6b4a680293fafd894dc100224ee989c6652eedae4a937a30d”
}
API get transaction information
Responce:
{
“type”: “committed”,
“content”: {
“debug”: {
“name”: “test_user”
},
“message”: “dea18489e18e342ccbb994633aebb7397df6c7aebe380581e2a74264a70c9d820000800002000800000009000000746573745f7573657204125a331a647e224aaab7b7ee8a7f087011343d03de6f36c6622ef45cc1a1376d65bd4fa5aa9b64efcd6863754d0f21526bc17539c568c08cddd515a2913a0e”
},
“location”: {
“block_height”: “382577”,
“position_in_block”: “0”
},
“location_proof”: {
“val”: “b10ca1bdee4b4958ca7adbfef81a44a5ce795bc0ed32b19c849c187ed4eb1437”
},
“status”: {
“type”: “success”
}
}
API get Blockchain config
http://192.168.56.1:5555/api/services/configuration/v1/configs/actual
Responce:
{
“hash”: “c12bdd8b288b3a99db51b9ee4cdde0dfe4b6d3019c27fe3b33e4d1eabe3899d9”,
“config”: {
“previous_cfg_hash”: “0000000000000000000000000000000000000000000000000000000000000000”,
“actual_from”: 0,
“validator_keys”: [
{
“consensus_key”: “015ac0497a8fa3376a53c4e1b2e7acac906b7bdef5c901576b3d4bc0ac6bfbca”,
“service_key”: “087741fe75991ed8fead744610c6d12952f70d425a2452938f0d188adfd3bb00”
}
],
“consensus”: {
“first_round_timeout”: 3000,
“status_timeout”: 5000,
“peers_timeout”: 10000,
“txs_block_limit”: 1000,
“max_message_len”: 1048576,
“min_propose_timeout”: 10,
“max_propose_timeout”: 200,
“propose_timeout_threshold”: 500
},
“services”: {
“configuration”: {
“majority_count”: null
},
“cryptocurrency”: null
}
},
“propose”: null,
“votes”: null
}
API get wallet info
Responce:
{
“block_proof”: {
“block”: {
“height”: “386666”,
“prev_hash”: “c81a41822c9c0eedd9690538897a5c544a0cf7e7d90b1c16217957772b4206f1”,
“proposer_id”: 0,
“state_hash”: “486e24f7407ab70b23ab763b6b24846c7f12612fdd0495d111d330aa7c8b06d4”,
“tx_count”: 0,
“tx_hash”: “0000000000000000000000000000000000000000000000000000000000000000”
},
“precommits”: [
{
“payload”: {
“block_hash”: “f01fe8e96a052016c3414d9d078b1553fb62e132ccdf25b5bf8e8aea64f9f232”,
“height”: “386666”,
“propose_hash”: “4192d67b9cb5a99cf3c1b2df702a4191d0563e9a20ac3b2dc0d27f553fb8021d”,
“round”: 1,
“time”: {
“nanos”: 458982097,
“secs”: “1539761739”
},
“validator”: 0
},
“message”: “015ac0497a8fa3376a53c4e1b2e7acac906b7bdef5c901576b3d4bc0ac6bfbca010000006ae6050000000000010000004192d67b9cb5a99cf3c1b2df702a4191d0563e9a20ac3b2dc0d27f553fb8021df01fe8e96a052016c3414d9d078b1553fb62e132ccdf25b5bf8e8aea64f9f2324be6c65b00000000d1825b1bde1d71045a30fad82506a323fbcb76fd1643fdb7c64ff45c65c23b9012ba73e343ffb9372fd2f13201686dee782c0100852bd0a7bc7734b27e55ffd7be823102”
}
]
},
“wallet_proof”: {
“to_table”: {
“entries”: [
{
“key”: “50c8ba3a6170f0a2fb6736ece8a603576ef6309a35e810911599bc6211b554a9”,
“value”: “aa0914c9d1b6fb32440b638b097b53d40f3a219f374068ae78739b8ceac1aa11”
}
],
“proof”: [
{
“path”: “0000101010101110110000001010110110011000000001100011001110110111000101011001101100100100000010011111001000011101110010101110111001111111101111101110100011111110000111011111101111110011011010100100110101110010101000101110101000100110011100100010101101100001”,
“hash”: “0000000000000000000000000000000000000000000000000000000000000000”
},
{
“path”: “11”,
“hash”: “80fa8fb547d3239db57a8d6938f367f441564c6209995f00f4669301f2be883b”
}
]
},
“to_wallet”: {
“entries”: [
{
“key”: “dea18489e18e342ccbb994633aebb7397df6c7aebe380581e2a74264a70c9d82”,
“value”: {
“balance”: “100”,
“history_hash”: “b10ca1bdee4b4958ca7adbfef81a44a5ce795bc0ed32b19c849c187ed4eb1437”,
“history_len”: “1”,
“name”: “test_user”,
“pub_key”: “dea18489e18e342ccbb994633aebb7397df6c7aebe380581e2a74264a70c9d82”
}
}
],
“proof”: [
{
“path”: “00”,
“hash”: “e5943d10cc29dfb660ba6a94a66e74a0d8a925b53d5ff82bacd037c38ebffcab”
},
{
“path”: “010”,
“hash”: “c5757783188f6588674041333cfb8039d68199cfc78f72603a50f75603b39a31”
},
{
“path”: “01100”,
“hash”: “9d2ae26c27e51428cff43407c06f132316c523755fde516f841ad529086551e0”
},
{
“path”: “1”,
“hash”: “8c7cde3df7d436232f9d6d5557d733a38733e7945632e26b34bc2ff7e1a10dd1”
}
]
}
},
“wallet_history”: {
“proof”: {
“val”: “b10ca1bdee4b4958ca7adbfef81a44a5ce795bc0ed32b19c849c187ed4eb1437”
},
“transactions”: [
{
“CreateWallet”: {
“name”: “test_user”
}
}
]
}
}
API Add Money wallet
посылаем POST
http://192.168.56.1:5555/api/services/cryptocurrency/v1/wallets/transaction
с корректно сформированным телом:
{
“protocol_version”: 0,
“service_id”: 128,
“message_id”: 1,
“body”: {
“pub_key”: “dea18489e18e342ccbb994633aebb7397df6c7aebe380581e2a74264a70c9d82”,
“amount”: “100”
“seed”: “13786703415428081604”
},
“signature”: “e75ab828636c3496e00f033621081117a2dc840e1f84cb44bbbf1705001360988ce34008746c66a6b4a680293fafd894dc100224ee989c6652eedae4a937a30d”
}
Responce:
hash транзакции: 8527662d56ffdf92b63740350fce9e217a06bfb0063ad060ee16ceb3b9c54816
По ней также можно получить информацию:
Responce:
{
“type”: “committed”,
“content”: {
“body”: {
“amount”: “100”,
“pub_key”: “8b30d707b8ee3d1266532afb12ef3e3e49d3edf5dcb3ceff7511fb8e64c23050”,
“seed”: “13786703415428081604”
},
“message_id”: 1,
“protocol_version”: 0,
“service_id”: 128,
“signature”: “76b80304392c86d80afe4d0aee93083bf8f9b43bb04207a875cc00b0b2621f599368c4a29ab7555fe45a9047e9bc3d09c6c93e0bcfad0a2ca9a958b786b53e05”
},
“location”: {
“block_height”: “319275”,
“position_in_block”: “0”
},
“location_proof”: {
“val”: “8527662d56ffdf92b63740350fce9e217a06bfb0063ad060ee16ceb3b9c54816”
},
“status”: {
“type”: “success”
}
}
API Transfer Money
посылаем POST
http://192.168.56.1:5555/api/services/cryptocurrency/v1/wallets/transaction
с корректно сформированным телом и PublicID того парня:
{
“protocol_version”: 0,
“service_id”: 128,
“message_id”: 0,
“body”: {
“amount”: “50”
“from”: “92c1be1d17c2d2178553b24ace0e6e285f4b0725a271e58732cbfba0c4fa8086”
“to”: “eb4b7537bea382602274c1ad26cbfcd461636368a450b913cc68011a9fd7bc3a”
“seed”: “13786703415428081604”
},
“signature”: “e75ab828636c3496e00f033621081117a2dc840e1f84cb44bbbf1705001360988ce34008746c66a6b4a680293fafd894dc100224ee989c6652eedae4a937a30d”
}
Responce:
hash
