Автор Тема: WEB LightWallet examples and libs JavaScript (HTML)  (Прочитано 1058 раз)

datachains

  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 358
  • Карма: +6/-0
  • icreator
    • Просмотр профиля
    • Блокчейн 3-го поколения
WEB LightWallet examples and libs JavaScript (HTML)
« : 15 Апрель 2017, 16:24:07 »
Легкий кошелек - все работает на стороне клиента в WEB-броузере, так что вводимые пользователем секретные ключи и СИД никому не передаются и нигде не запоминаются. При этом библиотеки, которые используются поставляются в исходном коде на JavaScript. Такой подход - распространенная практика для легких кошельков. Транзакции на удаленный сервер отсылаются уже в виде готового байт-кода, в который уже вставлены цифровая подпись и открытый ключ. Сервер просто их передает в сеть блокчейн. При этом канал связи между вашим компьютером и удаленным сервером нет надобности как-то защищать.

Если вы разработчик и желаете по примеру сделать свой легкий кошелек, то помните что - человек вводит или свою фразу длинную которую он держит в голове или SEED и оказывается в своем аккаунте (на стороне клиента)- причем при выходе из акаунта (кнопкой выход) или обычном обновлении страницы сессия должна прерываться, все данные стираться и требоваться новый ввод SEED`а или секретной фразы.

ИСХОДНИКИ JS
exapmles - https://github.com/rty1966/ERA-Tutorial/tree/master/API%20Tutorial

project - https://github.com/aufklaerer/ERAchainWEBwallet

Идеология mind-phraze (пароль в голове - как набор слов):
фраза преобразуется в SEED, Потом СИД преобразуется в пару закрытый ключ и открытый ключ, открытый ключ в адрес - это уже СТАНДАРТ на всех системах.
Кстати на полной ноде просто вводится сразу СИД. На легких кошельках можно использовать словесную фразу - что не обязательно для нас - можно сразу ввод СИД - но он НЕ ДОЛЖЕН запоминаться в кукиях или сессии - он должен броузером забываться сразу же - стираться отовсюду. И так чтобы нельзя было скопировать кукиес на другой комп - чтобы сразу пропадал доступ к СИД, поэтому никаких сессий лучше не организовывать.

Так же есть пример оболочки легкого кошелька - он не доделан:
Исходники кошелька - использовался фреймворк Vue - https://ru.vuejs.org/v2/guide/
https://github.com/andskur/ERA_web
основа взята отсюда:
https://github.com/misterGF/CoPilot

Описания API
http://datachainsworld.ru/index.php?topic=178.0

Еще есть старый модуль для подписывания транзакций
https://github.com/abrikos/aronicle/blob/master/libs/transaction.js

И пример на его основе простого легкого кошелька с генерацией ключей
https://github.com/abrikos/aronicle
[/size]

для WEB
https://github.com/icreator/ERMbase_public/blob/master/LightWallet/LightWallet.java
для RPC
https://github.com/icreator/ERMbase_public/blob/master/api/Rec_Resource.java

DEVELOPER JAR файл программы кошелька полной ноды для разработчика с пробной цепочкой блокв качаем отсюда
http://datachains.world/static/files/erachain-dev.jar


СУТЬ
На локальном кошельке (в вебэксполере в кукиях) есть приватный ключ, который создал пользователь из своей секрктной фразы.
Из секреного ключа получаем открытый (проверочный, публичный) ключ
Этот публичный ключ шлем вместе с другими параметрами на сервер для создания байт-кода
Сервер создает для этих даных байт-код, и выслает его в ответ на запрос команды getraw
Полученный байт-код подписываем на строне клиентв (в блокэксплорере) используя свой секретный ключ и получаем электронную подпись
Добавляем полученную подпись к данным (вставляем ее в байт-код) и шлем на сервер чтобы он ее посла в сеть блокчейн среды
Поэтому в байт коде нет секретного ключа, а есть открытый и сама подпись - там сохраняется тайность для клиента его приватных ключей

через WEB - доступ по порту 9047, через RPC - 9048
WEB - работает без доступа к кошельку сервера и поэтому безопасен для вашего сервера - по сути это добавка к вебэксплореру
RPC - там много функций которые доступ к кошельку Вашего сервера дают, поэтому их не нужно открывать всему миру. По умолчанию только локально разрешено

RPC команды так же доступны в консоли программы (файл - отладка - консоль)
help - список всех команд

суть добавленных команд в том чтобы удаленный сервер через запрос АПИ создавал raw-data для записи, потом эти данные локально - на стороне клиента (в веб-броузере) подписываем и отправляем опять удаленному серверу чтобы он транзакцию проверил и в сеть послал.

например получить ответ можно от локального сервера по URL ссылке
WEB
http://127.0.0.1:9047/lightwallet/getraw/31/5mgpEGqUGpfme4W2tHJmG7Ew21Te2zNY7Ju3e9JfUmRF?feePow=2&recipient=77QnJnSbS9EeGBa2LPZFZKVwjPwzeAxjmy&amount=123.0000123&key=1
RPC
http://127.0.0.1:9048/record/getraw/31/5mgpEGqUGpfme4W2tHJmG7Ew21Te2zNY7Ju3e9JfUmRF?feePow=2&recipient=77QnJnSbS9EeGBa2LPZFZKVwjPwzeAxjmy&amount=123.0000123&key=1

на нашем сервере:
WEB
http://datachains.world:9047/lightwallet/getraw/31/5mgpEGqUGpfme4W2tHJmG7Ew21Te2zNY7Ju3e9JfUmRF?feePow=2&recipient=77QnJnSbS9EeGBa2LPZFZKVwjPwzeAxjmy&amount=123.0000123&key=1
RPC - доступ будет закрыт
http://datachains.world:9048/record/getraw/31/5mgpEGqUGpfme4W2tHJmG7Ew21Te2zNY7Ju3e9JfUmRF?feePow=2&recipient=77QnJnSbS9EeGBa2LPZFZKVwjPwzeAxjmy&amount=123.0000123&key=1

на наших серверах ВЕБ включен - можно пробовать

Так же есть еще для разработчиков среда - она работает на портах 906Х, а не на 904Х
поэтому вы можете послать команду в среду разработки, в ней действия не значимые и действия в ней не отражаются в рабочей среде (порт 9046)
http://datachains.world:9067/lightwallet/getraw/31/5mgpEGqUGpfme4W2tHJmG7Ew21Te2zNY7Ju3e9JfUmRF?feePow=2&recipient=77QnJnSbS9EeGBa2LPZFZKVwjPwzeAxjmy&amount=123.0000123&key=1


и так есть команды

@GET
@Path("/getraw/{type}/{creator}")
public String toBytes(@PathParam("type") int record_type,
@PathParam("creator") String creator)
Собирает транзакцию из параметров и делает из нее набор байтов, готовый для подписи на стороне клиента

@GET
@Path("/getraw/{type}/{version}/{creator}/{timestamp}/{feePow}")
public String toBytes(@PathParam("type") int record_type,
@PathParam("version") int version,
@PathParam("creator") String creator,
@PathParam("timestamp") long timestamp,
@PathParam("feePow") int feePow,
@PathParam("reference") long reference
)
Собирает транзакцию из параметров и делает из нее набор байтов, готовый для подписи на стороне клиента

@POST
@Path("/broadcast")
public String broadcastFromRaw(String rawDataBase58)
Подписанную трнзакцию в байт-коде проверяет на правильность и если все хорошо то распространяет по блокчейн среде

@GET
@Path("/parse/")
public String parse()
посмотреть что получилось - байт-код переводит в удобочитаемый вид JSON

@GET
@Path("/parsetest/")
public String parseShort()
посмотреть что получилось без подписи - байт-код переводит в удобочитаемый вид JSON

JavaScript библиотеки для создания электронной подписи
Старые JS библиотеки на SHA256 лежат в папке проекта ERM4, если вы его установили
\ERM\web\libs\js\crypto
\ERM\web\libs\js
НО они не подойдут, надо портировать с Java, срипты можно взять тут
https://github.com/icreator/ERMbase_public/tree/master/crypto
https://github.com/icreator/ERMbase_public/tree/master/org/whispersystems/curve25519/java

Вставка подписи в байт-код
После того как на основе полученного байт-кода и приватного ключа получена электронная подпись (signature), ее нужно вставить в байт код по следующему алгоритму:
byte[] data = Base58.decode(dataStr);
int cut = 53;
byte[] dataTail = Arrays.copyOfRange(data, cut, data.length);
data = Bytes.concat(Arrays.copyOfRange(data, 0, cut), signature, dataTail);
После чего можно проверить правильность включения подписи через команду parse.
Если все правильно получилось то этот байт-код с подписью можно отправить на исполнение командой broadcast


алгоритм создания подписи для RAW-data и PrivateKey на языке Java:
public void sign(PrivateKeyAccount creator, boolean asPack)
{

// use this.reference in any case and for Pack too
// but not with SIGN
boolean withSign = false;
byte[] data = this.toBytes( withSign, null );
if ( data == null ) return;

// all test a not valid for main test
// all other network must be invalid here!
int port = Controller.getInstance().getNetworkPort();
data = Bytes.concat(data, Ints.toByteArray(port));

this.signature = Crypto.getInstance().sign(creator, data);
if (!asPack)
// need for recalc! if not as a pack
this.calcFee();
}
в командах для LightWallet port уже добавлен к байт-коду

эти функции есть на GitHub
https://github.com/icreator/ERMbase_public/tree/master/crypto

где функция Crypto.getInstance().sign:
public byte[] sign(PrivateKeyAccount account, byte[] message)
{
try
{
//GET SIGNATURE
return Ed25519.sign(account.getKeyPair(), message);
}
catch (Exception e)
{
LOGGER.error(e.getMessage(),e);
return new byte[64];
}
}

В свою очередь функция Ed25519.sign(account.getKeyPair(), message) (она есть в библиотеке JS)
public static byte[] sign(Pair<byte[],byte[]> keyPair, byte[] message) throws NoSuchAlgorithmException
{
byte[] private_key = keyPair.getA();
byte[] public_key = keyPair.getB();

byte[] signature = new byte[64];

byte[] hram  = new byte[64];
    byte[] r  = new byte[64];
    ge_p3 R = new ge_p3();

    MessageDigest sha512 = MessageDigest.getInstance("SHA-512");
    sha512.update(private_key, 32, 32);
    sha512.update(message, 0, message.length);
    r = sha512.digest();

sc_reduce.sc_reduce(r);
ge_scalarmult_base.ge_scalarmult_base(R, r);
ge_p3_tobytes.ge_p3_tobytes(signature, R);

    sha512 = MessageDigest.getInstance("SHA-512");
    sha512.update(signature, 0, 32);
    sha512.update(public_key, 0, 32);
sha512.update(message, 0, message.length);
hram = sha512.digest();

sc_reduce.sc_reduce(hram);

byte[] sm32 = new byte[32];
        sc_muladd.sc_muladd(sm32, hram, private_key, r);
        System.arraycopy(sm32, 0, signature, 32, 32);
        CryptoBytes.Wipe(sm32);
       
        return signature;
}
в свою очередь библиотеки для этого тут
https://github.com/icreator/ERMbase_public/tree/master/org/whispersystems/curve25519/java


Сейчас преобразовывается в байт-код (RAW) только запись вида 31 - послать кому-то что-то
« Последнее редактирование: 21 Февраль 2018, 10:51:57 от datachains »
  • 5mgpEGqUGpfme4W2tHJmG7Ew21Te2zNY7Ju3e9JfUmRF

datachains

  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 358
  • Карма: +6/-0
  • icreator
    • Просмотр профиля
    • Блокчейн 3-го поколения
Re: WEB LightWallet API etc
« Ответ #1 : 17 Апрель 2017, 12:46:15 »
  • 5mgpEGqUGpfme4W2tHJmG7Ew21Te2zNY7Ju3e9JfUmRF

datachains

  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 358
  • Карма: +6/-0
  • icreator
    • Просмотр профиля
    • Блокчейн 3-го поколения
Re: WEB LightWallet API etc
« Ответ #2 : 17 Апрель 2017, 13:44:20 »
да еще пробная среда сидит на порту 9067

вот пример работы команды -  разбора байт-кода без подписи
http://datachains.world:9067/lightwallet/parsetest?data=3RKre8zCEarMSgdHQVYA4h5feQ6uWmxuZ4JMzXhQBdgrmDrij7H4V3Lx1mtwXTxfLvksaScskt6dQBABNqawtXVUpwJYCEdnagvbqJfFzjFDeswnLpziRB8AwWmopM9R6X
  • 5mgpEGqUGpfme4W2tHJmG7Ew21Te2zNY7Ju3e9JfUmRF

abrikos

  • Пользователь
  • **
  • Сообщений: 95
  • Карма: +5/-0
  • абрикосизм
    • Просмотр профиля
Re: WEB LightWallet API etc
« Ответ #3 : 18 Апрель 2017, 00:47:45 »
библиотеку с ed25519 можно найти тут
http://npm.taobao.org/package/ed25519

То же самое здесь: https://github.com/dazoe/ed25519
Но с примерчиком example.js
  • 2Rdm5J5Ha5pzogvFvbF8Kufid4LTxat5Lmo7G4ANVbpy

datachains

  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 358
  • Карма: +6/-0
  • icreator
    • Просмотр профиля
    • Блокчейн 3-го поколения
Re: WEB LightWallet API etc
« Ответ #4 : 18 Апрель 2017, 07:28:25 »
библиотеку с ed25519 можно найти тут
http://npm.taobao.org/package/ed25519

То же самое здесь: https://github.com/dazoe/ed25519
Но с примерчиком example.js

там на С библиотека же - как ее к JS прилепить? это наверняка для мобильника?
  • 5mgpEGqUGpfme4W2tHJmG7Ew21Te2zNY7Ju3e9JfUmRF

datachains

  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 358
  • Карма: +6/-0
  • icreator
    • Просмотр профиля
    • Блокчейн 3-го поколения
Re: WEB LightWallet API etc
« Ответ #5 : 18 Апрель 2017, 07:32:33 »
тут библиотека есть в тексте - ищи ge_p3_0
NODE.js
https://github.com/nfarina/homebridge/issues/205
  • 5mgpEGqUGpfme4W2tHJmG7Ew21Te2zNY7Ju3e9JfUmRF

datachains

  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 358
  • Карма: +6/-0
  • icreator
    • Просмотр профиля
    • Блокчейн 3-го поколения
Re: WEB LightWallet API etc
« Ответ #6 : 18 Апрель 2017, 10:17:43 »
УРА!
Абрикоз сделал подписание транзакций на стороне клиента в JavaScript
вот его репозитарий
https://github.com/abrikos/aronicle
https://github.com/abrikos/aronicle/blob/master/controllers/WalletController.js

Артем Филиппов
https://www.messenger.com/t/abrikoz

« Последнее редактирование: 18 Апрель 2017, 10:30:40 от datachains »
  • 5mgpEGqUGpfme4W2tHJmG7Ew21Te2zNY7Ju3e9JfUmRF

abrikos

  • Пользователь
  • **
  • Сообщений: 95
  • Карма: +5/-0
  • абрикосизм
    • Просмотр профиля
Re: WEB LightWallet API etc
« Ответ #7 : 18 Апрель 2017, 11:46:21 »
https://github.com/abrikos/aronicle/blob/master/libs/transaction.js
var ed25519 = require('ed25519');
var bs58 = require('bs58')
var http   = require('../libs/http');

module.exports = {

sendTo:function (pubKey,secretKey, recipient,amount, cb) {
var cmd = '/lightwallet/getraw/31/'+pubKey+'?feePow=2&recipient='+recipient+'&amount='+amount+'&key=1';
//Отсылаем на сервер запрос на создание транзакции
http.getErmData('GET',cmd,null,function (message) {
var byteMessage = bs58.decode(message)
var signature = ed25519.Sign(byteMessage, bs58.decode(secretKey));
var slice1 = byteMessage.slice(0,53)
var slice2 = byteMessage.slice(53,byteMessage.length)
var messageBuf = Buffer.concat([slice1,signature, slice2]);
var cmd = '/lightwallet/parse?data='+bs58.encode(messageBuf)
//Подписываем транзакцию
http.getErmData('GET',cmd,'',function (data) {
cb(data);
})

});
},
}


« Последнее редактирование: 18 Апрель 2017, 11:54:28 от abrikos »
  • 2Rdm5J5Ha5pzogvFvbF8Kufid4LTxat5Lmo7G4ANVbpy

datachains

  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 358
  • Карма: +6/-0
  • icreator
    • Просмотр профиля
    • Блокчейн 3-го поколения
Re: WEB LightWallet API etc
« Ответ #8 : 25 Май 2017, 10:56:45 »
пробная версия кошелька
http://78.129.246.180:8080/

Исходники кошелька
https://github.com/andskur/ERA_web
  • 5mgpEGqUGpfme4W2tHJmG7Ew21Te2zNY7Ju3e9JfUmRF

evg

  • Глобальный модератор
  • Постоялец
  • *****
  • Сообщений: 105
  • Карма: +13/-0
  • Наблюдатель
    • Просмотр профиля
Re: WEB LightWallet API etc
« Ответ #9 : 28 Май 2017, 01:23:06 »
пробная версия кошелька
http://78.129.246.180:8080/

Да, что Вы, право слово, я даже рассмеялся! ;D
Вводить на сайте (пусть даже на сайте владельцев проекта) свой SEED?! Вы серьёзно?
Тут нужна авторизация по паролю и е-мэйлу или двухфакторная ("мыло" + телефон), но вводить SEED... Увольте`с.
« Последнее редактирование: 28 Май 2017, 01:25:50 от evg »
  • H4ydRH5n2PQ474idvtto91XYZwQqkMK4wZEHy65T7BuM
Стая волков, возглавляемая овцой, проиграет стаду овец, возглавляемому волком.

datachains

  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 358
  • Карма: +6/-0
  • icreator
    • Просмотр профиля
    • Блокчейн 3-го поколения
Re: WEB LightWallet API etc
« Ответ #10 : 28 Май 2017, 19:59:12 »
пробная версия кошелька
http://78.129.246.180:8080/

Да, что Вы, право слово, я даже рассмеялся! ;D
Вводить на сайте (пусть даже на сайте владельцев проекта) свой SEED?! Вы серьёзно?
Тут нужна авторизация по паролю и е-мэйлу или двухфакторная ("мыло" + телефон), но вводить SEED... Увольте`с.

ни в коем случае свой СИД нельзя - это пробный!
генерите новый
  • 5mgpEGqUGpfme4W2tHJmG7Ew21Te2zNY7Ju3e9JfUmRF

evg

  • Глобальный модератор
  • Постоялец
  • *****
  • Сообщений: 105
  • Карма: +13/-0
  • Наблюдатель
    • Просмотр профиля
Re: WEB LightWallet API etc
« Ответ #11 : 29 Май 2017, 00:23:22 »
Я и не вводил, что-ж я, совсем "того"?  ;D
Но на будущее-то всё-равно надо продумать механизм авторизации.
  • H4ydRH5n2PQ474idvtto91XYZwQqkMK4wZEHy65T7BuM
Стая волков, возглавляемая овцой, проиграет стаду овец, возглавляемому волком.

datachains

  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 358
  • Карма: +6/-0
  • icreator
    • Просмотр профиля
    • Блокчейн 3-го поколения
Re: WEB LightWallet examples and libs JavaScript (HTML)
« Ответ #12 : 21 Январь 2018, 18:38:46 »
новые ИСХОДНИКИ JS выложены тут
https://github.com/rty1966/ERA-Tutorial/tree/master/API%20Tutorial
« Последнее редактирование: 24 Январь 2018, 15:59:28 от datachains »
  • 5mgpEGqUGpfme4W2tHJmG7Ew21Te2zNY7Ju3e9JfUmRF