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
Ставим саму R
ocksDB
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