From 52175c07afdc19f9e34c35017e032f3136e5a6d7 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 29 Aug 2018 01:12:30 +0300 Subject: [PATCH 1/5] russian tutorial #1 Installation --- ...20\275\320\276\320\262\320\272\320\260.md" | 326 ++++++++++++++++++ 1 file changed, 326 insertions(+) create mode 100644 "tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 01 \320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" diff --git "a/tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 01 \320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" "b/tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 01 \320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" new file mode 100644 index 0000000..32fad73 --- /dev/null +++ "b/tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 01 \320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" @@ -0,0 +1,326 @@ + + +# Nebulas 101 - 01 Сборка и установка Nebulas + +[Руководство на Youtube](https://www.youtube.com/watch?v=qtjss2LzSI4&list=PLFipfN18ZQwsW1_dge4w7dfsVNdNZZ37R) + +Код проекта [Nebulas](https://nebulas.io/) был выпущен в нескольких версиях и протестирован для локального запуска. Вы можете скачать исходный код Nebulas для поднятия локальной сети. + +Чтобы узнать о Nebulas, пожалуйста, прочитайте [Нетехническую документацию](https://nebulas.io/docs/NebulasWhitepaper.pdf) Nebulas. + +Чтобы узнать о технологиях, пожалуйста, прочитайте [Техническую документацию](https://nebulas.io/docs/NebulasTechnicalWhitepaper.pdf) Nebulas, а также просмотрите [исходный код на гите](https://github.com/nebulasio/go-nebulas). + +> На данный момент сеть Nebulas можно запустить только на Mac и Linux. Версия для Windows появится в ближайшее время. + +## Реализация на Golang + +На сегодняшний день, Nebulas реализуется на языке Golang. + +| Компоненты | Версия | Описание | +|----------|-------------|-------------| +|[Golang](https://golang.org) | >= 1.9.2| Язык программирования Go | + +### Mac OSX + +[Homebrew](https://brew.sh/) рекомендуется для установки golang на Mac. + +```bash +# Установка +brew install go + +# Переменные рабочей директории +export GOPATH=/path/to/workspace +``` + +> Примечание. GOPATH — это локальная рабочая директория golang, которую можно определить самостоятельно. После настройки GOPATH ваши go-проекты должны быть помещены в директорию GOPATH. + +### Linux + +```bash +# Загрузка +wget https://dl.google.com/go/go1.9.3.linux-amd64.tar.gz + +# Распаковка +tar -C /usr/local -xzf go1.9.3.linux-amd64.tar.gz + +# Переменные рабочей директории +export PATH=$PATH:/usr/local/go/bin +export GOPATH=/path/to/workspace +``` + +## Сборка Nebulas + +### Загрузка + +Скопируйте исходный код с помощью следующих команд: + +```bash +# вход в рабочую директорию +mkdir -p $GOPATH/src/github.com/nebulasio +cd $GOPATH/src/github.com/nebulasio + +# Загрузка +git clone https://github.com/nebulasio/go-nebulas.git + +# открытие репозитория +cd go-nebulas + +# master-ветка самая актуальная и стабильная +git checkout master +``` + +### Установка RocksDB + +* **OS X**: +* Установка rocksdb через [Homebrew](https://brew.sh/) +```bash +brew install rocksdb +``` + +* **Linux - Ubuntu** +* Установка зависимостей +```bash +apt-get update +apt-get -y install build-essential libgflags-dev libsnappy-dev zlib1g-dev libbz2-dev liblz4-dev libzstd-dev +``` +* Установка rocksdb через исходный код: +```bash +git clone https://github.com/facebook/rocksdb.git +cd rocksdb && make shared_lib && make install-shared +``` + +* **Linux - Centos** +* Установка зависимостей +```bash +yum -y install epel-release && yum -y update +yum -y install gflags-devel snappy-devel zlib-devel bzip2-devel gcc-c++ libstdc++-devel +``` +* Установка rocksdb через исходный код: +```bash +git clone https://github.com/facebook/rocksdb.git +cd rocksdb && make shared_lib && make install-shared +``` + +### Установка зависимостей GO + +Зависимости GO в Go-Nebulas определены через [Dep](https://github.com/golang/dep). + +| Компоненты | Версия | Описание | +|----------|-------------|-------------| +[Dep](https://github.com/golang/dep) | >= 0.3.1 | Dep - это инструмент управления зависимостями для Go. | + +#### Установка Dep + +* **Mac OSX** +* Установка Dep через [Homebrew](https://brew.sh/) +```bash +brew install dep +brew upgrade dep +``` + +* **Linux** +* Установка dep +```bash +cd /usr/local/bin/ +wget https://github.com/golang/dep/releases/download/v0.3.2/dep-linux-amd64 +ln -s dep-linux-amd64 dep +``` + +#### Загрузка зависимостей + +Перейдите в корневую директорию проекта для загрузки зависимостей Go-Nebulas: + +```bash +cd $GOPATH/src/github.com/nebulasio/go-nebulas +make dep +``` + +> `make dep` загружает множество зависимостей. В первый раз загрузка зависимостей может длиться довольно долго. Некоторые зависимости могут не загружаться. Если загрузить зависимость не удается, попробуйте напрямую загрузить заархивированные файлы зависимостей, созданные dep [vendor.tar.gz](http://ory7cn4fx.bkt.clouddn.com/vendor.tar.gz) и извлечь их в кореневой каталог nebulas. +> ```bash +> vendor.tar.gz +> MD5: c2c1ff9311332f90e11fb81b48ca0984 +> ``` + +Nebulas's NVM (Виртуальная машина Nebulas) зависит от движка V8 JavaScript. Мы создали зависимости v8 для Mac / Linux. Для их установки выполните следующие команды: + +```bash +cd $GOPATH/src/github.com/nebulasio/go-nebulas +make deploy-v8 +``` + +### Сборка Neb + +После установки golang-зависимостей и зависимостей V8, вы можете собрать исполняемый файл для Nebulas. + +Сборка в корневом каталоге проекта: + +```bash +cd $GOPATH/src/github.com/nebulasio/go-nebulas +make build +``` + +После завершения сборки будет создан исполняемый файл `neb`, созданный в корневом каталоге. +![Сборка](resources/101-01-make-build.png) + + +## Запуск NEB + +### Нулевой блок + +Перед запуском новой сети Nebulas мы должны определить конфигурацию нулевого блока. + +#### Конфигурация нулевого блока + +```protobuf +# Текстовый файл neb genesis. Расположен в core / pb / genesis.proto. + +meta { +# Chain identity +chain_id: 100 +} + +consensus { +dpos { +# Initial dynasty, including all initial miners +dynasty: [ +[ miner address ], +... +] +} +} + +# Pre-allocation of initial tokens +token_distribution [ +{ +address: [ allocation address ] +value: [ amount of allocation tokens ] +}, +... +] +``` + +Пример genesis.conf находится в `conf/default/genesis.conf`. + +### Конфигурация + +Прежде чем запустить ноду neb, необходимо настроить конфигурацию ноды. + +#### Конфигурация Neb Node + +```protobuf +# Файл конфигурация Neb. Схема определена в neblet/pb/config.proto:Config. + +# Конфигурация сети +network { +# Для первого ноды в новой сети Nebulas «seed» не нужен. +# В противном случае каждой ноде нужны некоторые «seed-ноды», чтобы добавить ее в сеть Nebulas. +# seed: ["/ip4/127.0.0.1/tcp/8680/ipfs/QmP7HDFcYmJL12Ez4ZNVCKjKedfE7f48f1LAkUc3Whz4jP"] + +# P2P хост сети. Поддерживает несколько IP-адресов и портов. +listen: ["0.0.0.0:8680"] + +# Приватный ключ используется для генерации идентификатора ноды. Если вы не используете приватный ключ, нода будет генерировать новый идентификатор. +# private_key: "conf/network/id_ed25519" +} + +# Configuration сети +chain { +# Идентификатор сети +chain_id: 100 + +# Расположение базы данных +datadir: "data.db" + +# Расположение хранилища ключей всех аккаунтов +keydir: "keydir" + +# Конфигурация нулевого блока +genesis: "conf/default/genesis.conf" + +# Алгоритм подписи +signature_ciphers: ["ECC_SECP256K1"] + +# Адрес майнера +miner: "n1SAQy3ix1pZj8MPzNeVqpAmu1nCVqb5w8c" + +# Награждение за майнинг будет отправлено на указанный адрес +coinbase: "n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE" + +# Кодовая фраза к приватному ключу майнера +passphrase: "passphrase" +} + +# Конфигурация API +rpc { +# Порт GRPC API +rpc_listen: ["127.0.0.1:8684"] + +# Порт HTTP API +http_listen: ["127.0.0.1:8685"] + +# Открытие модуля +http_module: ["api", "admin"] +} + +# Конфигурация логов +app { +# Log level: [debug, info, warn, error, fatal] +log_level: "info" + +# Расположение логов +log_file: "logs" + +# Открытие краш-логов +enable_crash_report: false +} + +# Конфигурация показателей +stats { +# Open node metrics +enable_metrics: false + +# Конфигурация Influxdb +influxdb: { +host: "http://localhost:8086" +db: "nebulas" +user: "admin" +password: "admin" +} +} + +``` + +Множество примеров можно найти здесь `$GOPATH/src/github.com/nebulasio/go-nebulas/conf/` + +## Запуск ноды + +> Сеть Nebulas, с которой вы работаете в данный момент, является локальной и отличается от основной и тестовой сетей. + +Запустите вашу первую ноду Nebulas с помощью следующих команд: + +```bash +cd $GOPATH/src/github.com/nebulasio/go-nebulas +./neb -c conf/default/config.conf +``` + +После запуска, в терминале должно быть видно следующее: +![запуск seed ноды](resources/101-01-seed-node-start.png) + +По умолчанию, нода, использующая `conf/default/config.conf`, не будет обрабатывать новые блоки. +Запустите майнинг-ноду Nebulas с помощью следующих команд: + +```bash +cd $GOPATH/src/github.com/nebulasio/go-nebulas +./neb -c conf/example/miner.conf +``` + +После того, как нода запустится, и соединение с seed-нодой прошло успешно, вы можете увидеть данные логи, которые находятся в файле логов `logs/miner/neb.log`: +![запуск ноды](resources/101-01-node-start.png) + +> Примечание. Вы можете запустить множество нод локально. Убедитесь, что порты в конфигурациях нод не конфликтуют друг с другом. + +### Следующий шаг: Руководство 2 + +[Отправление транзакций в сети Nebulas](https://github.com/nebulasio/wiki/blob/master/tutorials/%5BEnglish%5D%20Nebulas%20101%20-%2002%20Transaction.md) + + From b31e837a96acfef73e4046fea12843a365bde4bf Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 29 Aug 2018 01:23:13 +0300 Subject: [PATCH 2/5] russian tutorial fix --- ...320\260\320\275\320\276\320\262\320\272\320\260.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 01 \320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" "b/tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 01 \320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" index 32fad73..6b91941 100644 --- "a/tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 01 \320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" +++ "b/tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 01 \320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" @@ -175,13 +175,13 @@ make build # Текстовый файл neb genesis. Расположен в core / pb / genesis.proto. meta { -# Chain identity +# Идентификатор сети chain_id: 100 } consensus { dpos { -# Initial dynasty, including all initial miners +# Назначение первых майнеров dynasty: [ [ miner address ], ... @@ -189,11 +189,11 @@ dynasty: [ } } -# Pre-allocation of initial tokens +# Первичное распределение токенов token_distribution [ { -address: [ allocation address ] -value: [ amount of allocation tokens ] +address: [ адрес распределения ] +value: [ количество распределяемых токенов ] }, ... ] From c245a404af205697ee928a8b8374959c4ff396ff Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 29 Aug 2018 01:35:40 +0300 Subject: [PATCH 3/5] fix --- ...\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 01 \320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" "b/tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 01 \320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" index 6b91941..b4a776b 100644 --- "a/tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 01 \320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" +++ "b/tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 01 \320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" @@ -212,7 +212,7 @@ value: [ количество распределяемых токенов ] # Конфигурация сети network { -# Для первого ноды в новой сети Nebulas «seed» не нужен. +# Для первой ноды в новой сети Nebulas «seed» не нужен. # В противном случае каждой ноде нужны некоторые «seed-ноды», чтобы добавить ее в сеть Nebulas. # seed: ["/ip4/127.0.0.1/tcp/8680/ipfs/QmP7HDFcYmJL12Ez4ZNVCKjKedfE7f48f1LAkUc3Whz4jP"] From 8e9d0e3938a537a909c32c15d3f6ac98894bae7f Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 30 Aug 2018 12:12:32 +0300 Subject: [PATCH 4/5] fix --- ...\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 01 \320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" "b/tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 01 \320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" index b4a776b..9a20bc8 100644 --- "a/tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 01 \320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" +++ "b/tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 01 \320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" @@ -314,7 +314,7 @@ cd $GOPATH/src/github.com/nebulasio/go-nebulas ./neb -c conf/example/miner.conf ``` -После того, как нода запустится, и соединение с seed-нодой прошло успешно, вы можете увидеть данные логи, которые находятся в файле логов `logs/miner/neb.log`: +После того, как нода запустится, и соединение с seed-нодой пройдет успешно, вы сможете увидеть отчеты в файле логов `logs/miner/neb.log`: ![запуск ноды](resources/101-01-node-start.png) > Примечание. Вы можете запустить множество нод локально. Убедитесь, что порты в конфигурациях нод не конфликтуют друг с другом. From 431b676e79ab8c78c6b90d163105e23e86199b4d Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 30 Aug 2018 21:07:27 +0300 Subject: [PATCH 5/5] russian tutorial #2 --- ...20\260\320\272\321\206\320\270\320\270.md" | 210 ++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 "tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 02 \320\242\321\200\320\260\320\275\320\267\320\260\320\272\321\206\320\270\320\270.md" diff --git "a/tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 02 \320\242\321\200\320\260\320\275\320\267\320\260\320\272\321\206\320\270\320\270.md" "b/tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 02 \320\242\321\200\320\260\320\275\320\267\320\260\320\272\321\206\320\270\320\270.md" new file mode 100644 index 0000000..e927284 --- /dev/null +++ "b/tutorials/[\320\240\321\203\321\201\321\201\320\272\320\270\320\271] Nebulas 101 - 02 \320\242\321\200\320\260\320\275\320\267\320\260\320\272\321\206\320\270\320\270.md" @@ -0,0 +1,210 @@ +# Nebulas 101 - 02 Отправление транзакций в сети Nebulas + +[Руководство на Youtube](https://www.youtube.com/watch?v=-44tVVR6ETo&list=PLFipfN18ZQwsW1_dge4w7dfsVNdNZZ37R&index=1) + +> Для полного понимания данного руководства советуем ознакомиться с [Руководством по установке](https://github.com/nebulasio/wiki/blob/master/tutorials/%5BEnglish%5D%20Nebulas%20101%20-%2001%20Installation.md). + +В сети Nebulas существует три метода отправления транзакций: + +1. Подписать и отправить +2. Отправить с помощью парольной фразой +3. Разблокировать кошелек и отправить + +Ниже будут подробно описаны все методы отправления транзакций, а также способы проверки их успешности. + +## Подготовка аккаунтов + +В сети Nebulas каждый адрес представляет собой уникальный аккаунт. + +Подготовьте два аккаунта: аккаунт для отправления токенов (отправляющий адрес, называемый «from») и аккаунт для получения токенов (принимающий адрес, называемый «to»). + +### Отправитель + +В данном примере мы будем использовать аккаунт coinbase, расположенный в `conf/example/miner.conf`, которому соответствует адрес `n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE`. Так этот аккаунт является еще и майнером, он будет получать токены за подтверждение транзакций в сети. Позже мы отправим эти токены на новый аккаунт. + +### Получатель + +Создайте новый кошелек, чтобы получить токены. + +```bash +$ ./neb account new +Your new account is locked with a passphrase. Please give a passphrase. Do not forget this passphrase. +Passphrase: +Repeat passphrase: +Address: n1SQe5d1NKHYFMKtJ5sNHPsSPVavGzW71Wy +``` + +> Необходимо помнить, что после запуска данной команды, адрес вашего нового кошелька не будет таким, как старый `n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE`. Пожалуйста, используйте ваш сгенерированный новый адрес в качестве получателя. + +Файл с ключами от нового кошелька расположен здесь `$GOPATH/src/github.com/nebulasio/go-nebulas/keydir/` + +## Запуск ноды + +### Запуск первичной ноды + +Во-первых, запустите первичную ноду в вашей локальной сети. + +```bash +./neb -c conf/default/config.conf +``` + +### Запуск майнинг-ноды + +Во-вторых, запустите майнинг-ноду, подключенную к первичной ноде. Эта нода будет генерировать новые блоки в вашей локальной сети. + +```bash +./neb -c conf/example/miner.conf +``` + +> **С какой скоростью будут появляться новые блоки?** +> +> В сети Nebulas, DPoS был выбран в качестве временного алгоритма консенсуса перед тем, как Proof-of-Devotion(PoD, описанным в [Технической документации](https://nebulas.io/docs/NebulasTechnicalWhitepaper.pdf)) будет готов. В этом алгоритме, все майнеры будут генерировать блок в течение 15 секунд. +> +> На скгодняшний день нужно ждать 315(=15*21) секунд чтобы появился новый блок, т.к. работает только 1 майнер из заявленных 21 `conf/default/genesis.conf`. + +Как только майнер сгенерирует блок, вознаграждение будет отправлено на адрес `n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE`, указанном в `conf/example/miner.conf`. + +## Взаимодействие с нодами + +Nebulas позволяет разработчикам использовать HTTP API, gRPC API и CLI для взаимодействия с работающими нодами. Здесь мы расскажем как отправлять транзакции тремя способами, используя HTTP API ([API Модуль](https://github.com/nebulasio/wiki/blob/master/rpc.md) | [Admin Модуль](https://github.com/nebulasio/wiki/blob/master/rpc_admin.md)). + +> Nebulas HTTP Listener определен в конфигурации ноды. Стандартный порт первичной ноды: `8685`. + +Вначале проверьте баланс отправителя перед отправкой транзакции. + +### Проверка баланса аккаунта + +Получить состояние аккаунта отправителя `n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE` с помощью `/v1/user/accountstate` в API модуле, используя `curl`. + +```bash +> curl -i -H Accept:application/json -X POST http://localhost:8685/v1/user/accountstate -d '{"address":"n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE"}' + +{ + "result": { + "balance": "67066180000000000000", + "nonce": "0", + "type": 87 + } +} +``` + +> **Примечание** +> Свойство "Type" используется для проверки того, является ли адрес смартконтрактом. `88` означает адрес смартконтракта, а `87` обычный пользовательский адрес. + +Как мы видим, получатель был награжден несколькими токенами за генерацию новых блоков. + +Затем давайте проверим состояние учетной записи получателя. + +```bash +> curl -i -H Accept:application/json -X POST http://localhost:8685/v1/user/accountstate -d '{"address":"your_address"}' + + +{ + "result": { + "balance": "0", + "nonce": "0", + "type": 87 + } +} +``` + +Как и ожидалось, на балансе нового аккаунта токенов нет. + +### Отправление транзакций + +Теперь давайте отправим транзакцию тремя способами для перевода нескольких токенов от отправителя получателю! + +#### Подписать и отправить + +С помощью этого метода мы можем подписать транзакцию в оффлайн режиме, а затем отправить ее на другую онлайн ноду. Это самый безопасный способ для отправления транзакций, т.к. ваш приватный ключ не падает в интернет. + +Сначала подпишите транзакцию, чтобы получить необработанные данные. + +```bash +> curl -i -H 'Content-Type: application/json' -X POST http://localhost:8685/v1/admin/sign -d '{"transaction":{"from":"n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE","to":"n1QZMXSZtW7BUerroSms4axNfyBGyFGkrh5", "value":"1000000000000000000","nonce":1,"gasPrice":"1000000","gasLimit":"2000000"}, "passphrase":"passphrase"}' + +{"result":{"data":"CiAbjMP5dyVsTWILfXL1MbwZ8Q6xOgX/JKinks1dpToSdxIaGVcH+WT/SVMkY18ix7SG4F1+Z8evXJoA35caGhlXbip8PupTNxwV4SRM87r798jXWADXpWngIhAAAAAAAAAAAA3gtrOnZAAAKAEwuKuC1wU6CAoGYmluYXJ5QGRKEAAAAAAAAAAAAAAAAAAPQkBSEAAAAAAAAAAAAAAAAAAehIBYAWJBVVuRHWSNY1e3bigbVKd9i6ci4f1LruDC7AUtXDLirHlsmTDZXqjSMGLio1ziTmxYJiLj+Jht5RoZxFKqFncOIQA="}} +``` + +> **Примечание** +> Nonce - очень важный атрибут транзакции. Он создан чтобы предотвратить [Атаку повторного воспроизведения](https://ru.wikipedia.org/wiki/%D0%90%D1%82%D0%B0%D0%BA%D0%B0_%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B2%D0%BE%D1%81%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F). Только после того, как как была принята транзакция с nonce N, будет обработана транзакция с nonce N + 1. Таким образом, перед отправлением новой транзакции, проверяется актуальный баланс аккаунта в сети. + +Затем отправьте необработанные данные онлайн-ноде Nebulas. + +```bash +> curl -i -H 'Content-Type: application/json' -X POST http://localhost:8685/v1/user/rawtransaction -d '{"data":"CiAbjMP5dyVsTWILfXL1MbwZ8Q6xOgX/JKinks1dpToSdxIaGVcH+WT/SVMkY18ix7SG4F1+Z8evXJoA35caGhlXbip8PupTNxwV4SRM87r798jXWADXpWngIhAAAAAAAAAAAA3gtrOnZAAAKAEwuKuC1wU6CAoGYmluYXJ5QGRKEAAAAAAAAAAAAAAAAAAPQkBSEAAAAAAAAAAAAAAAAAAehIBYAWJBVVuRHWSNY1e3bigbVKd9i6ci4f1LruDC7AUtXDLirHlsmTDZXqjSMGLio1ziTmxYJiLj+Jht5RoZxFKqFncOIQA="}' + +{"result":{"txhash":"1b8cc3f977256c4d620b7d72f531bc19f10eb13a05ff24a8a792cd5da53a1277","contract_address":""}} +``` + +#### Отправление с помощью парольной фразой + +Если вы доверяете ноде Nebulas настолько, что можете передать ей файлы хранилища ключей, этот метод вам подойдет. + +Сначала загрузите файлы хранилища ключей в папки keydir в ноду Nebulas. + +Затем отправьте транзакцию с помощью вашей кодовой фразы. + +```bash +> curl -i -H 'Content-Type: application/json' -X POST http://localhost:8685/v1/admin/transactionWithPassphrase -d '{"transaction":{"from":"n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE","to":"n1QZMXSZtW7BUerroSms4axNfyBGyFGkrh5", "value":"1000000000000000000","nonce":2,"gasPrice":"1000000","gasLimit":"2000000"},"passphrase":"passphrase"}' + +{"result":{"txhash":"3cdd38a66c8f399e2f28134e0eb556b292e19d48439f6afde384ca9b60c27010","contract_address":""}} +``` + +> **Примечание** +> Т.к. мы отправили транзакцию с nonce равным 1 с аккаунта `n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE`, nonce новой транзакции от того же `from` должен увеличиться на 1, а значит стать 2. + +#### Разблокировать кошелек и отправить + +Это самый опасный метод. Вероятно, вы не должны использовать его, если не имеете полной уверенности в безопастности получения данных нодой Nebulas. + +Сначала загрузите файлы хранилища ключей в папки keydir в ноду Nebulas. + +Затем разблокируйте свой аккаунт с помощью вашей кодовой фразы с заданной продолжительности хранения в ноде. +Единицей продолжительности является наносекунда (300000000000=300сек). + +```bash +> curl -i -H 'Content-Type: application/json' -X POST http://localhost:8685/v1/admin/account/unlock -d '{"address":"n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE","passphrase":"passphrase","duration":"300000000000"}' + +{"result":{"result":true}} +``` + +После разблокировки вашего аккаунта, любой, кто имеет к нему доступ, сможет отправить транзакцию в течение указанного времени даже без вашего разрешения. + +```bash +> curl -i -H 'Content-Type: application/json' -X POST http://localhost:8685/v1/admin/transaction -d '{"from":"n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE","to":"n1QZMXSZtW7BUerroSms4axNfyBGyFGkrh5", "value":"1000000000000000000","nonce":3,"gasPrice":"1000000","gasLimit":"2000000"}' + +{"result":{"txhash":"8d69dea784f0edfb2ee678c464d99e155bca04b3d7e6cdba6c5c189f731110cf","contract_address":""}} +``` + +## Получение транзакции + +После успешного отправления транзакции любым из трех вышеперечисленных методов мы получим `txhash`. Значение `txhash` может использоваться для запроса статуса транзакции. + +```bash +> curl -i -H Accept:application/json -X POST http://localhost:8685/v1/user/getTransactionReceipt -d '{"hash":"8d69dea784f0edfb2ee678c464d99e155bca04b3d7e6cdba6c5c189f731110cf"}' + +{"result":{"hash":"8d69dea784f0edfb2ee678c464d99e155bca04b3d7e6cdba6c5c189f731110cf","chainId":100,"from":"n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE","to":"n1QZMXSZtW7BUerroSms4axNfyBGyFGkrh5","value":"1000000000000000000","nonce":"3","timestamp":"1524667888","type":"binary","data":null,"gas_price":"1000000","gas_limit":"2000000","contract_address":"","status":1,"gas_used":"20000"}} +``` + +Значение поля `status` может быть равным 0, 1 или 2. + +- **0: Неудачная.** Это означает, что транзакция была отправлена по сети, но ее выполнение не удалось. +- **1: Успешная.** Это означает, что транзакция была отправлена по сети и ее исполнение выполнено успешно. +- **2: В ожидании.** Это означает, что транзакция пока еще не была добавлена в блок. + +### Перепроверка + +Давайте перепроверим баланс получателя. + +```bash +> curl -i -H Accept:application/json -X POST http://localhost:8685/v1/user/accountstate -d '{"address":"n1QZMXSZtW7BUerroSms4axNfyBGyFGkrh5"}' + +{"result":{"balance":"3000000000000000000","nonce":"0","type":87}} +``` + +Здесь вы должны увидеть баланс, который является результатом всех успешных транзакций, которые вы отправляли. + +### Следующий шаг: Руководство 3 + + [Написание и запуск смартконтрактов на JavaScript](https://github.com/nebulasio/wiki/blob/master/tutorials/%5BEnglish%5D%20Nebulas%20101%20-%2003%20Smart%20Contracts%20JavaScript.md)