До релиза дошла библиотека для PHP: https://github.com/VIZ-Blockchain/viz-php-lib/releases/tag/v1.0
Полный инструментарий для разработки:
- Управление ключами (генерация, подпись, проверка, кодирование);
- Построение транзакций (поддерживаются все операции блокчейна VIZ);
- Мульти-операции;
- Мульти-сиг;
- Все JsonRPC методы;
- Беспарольная аутентификация;
- Шифрование заметок через общий ключ (AES-256-cbc, совместимость с viz-js-lib);
- Простота (PSR-4).
Возможности
Библиотека содержит 3 основных класса и 1 вспомогательный. Все зависимости уже загружены и внедрены без необходимости их отдельно скачивать.
- Класс JsonRPC — использование обыкновенного сокета для JsonRPC запросов к ноде (поддержка всех API методов, кэш доменов, переключатель проверки ssl, переключатель для получения полного ответа в json формате);
- Класс Keys — приватные ключи (для подписи), публичные (для проверки), нахождение общего ключа, поддержка кодирование ключей (в формате wif и в формате публичного ключа с префиксом VIZ);
- Класс Transaction — простое использование, поддержка мульти-подписей, поддержка мульти-операций в одной транзакции, исполнение через JsonRPC, поддержка 5 наиболее используемых операций: transfer, transfer_to_vesting, withdraw_vesting, award, create_invite (другие операции будут имплементированы позже);
- Классы поддерживают стандарт PSR-4, вам достаточно подключить autoloader.php и вы сможете сразу создавать экземпляры требуемого класса;
- Содержит модифицированные сторонник классы для работы с криптографией для лучшей интеграции с блокчейном VIZ (по принципу «все в одном»)
- Нативный код без дополнительных установок (да, без composer, так как были необходимы изменения в сторонних решениях)
Ну и конечно же, лицензия MIT как у библиотеки, так и у всех подключенных зависимостей.
Зависимости
Одно расширение PHP из списка:
- GMP (множественная точность GNU) —
sudo apt-get install libgmp-dev php-gmp
- BCMath —
sudo apt-get install php-bcmath
У большинства хостинг-провайдеров он уже включён, но если он не найден, проверьте панель управления.
Выражаю благодарность разработчикам:
- https://github.com/simplito/bigint-wrapper-php
- https://github.com/simplito/bn-php
- https://github.com/simplito/elliptic-php
- https://github.com/kornrunner/php-keccak
Примеры
В некоторых примерах есть заполнители для закрытых ключей или учётных записей. Измените их для успешного прохождения теста.
Ключи: инициализация из шестнадцатеричного, кодирование в wif, получение открытого ключа из приватного, получение закодированной версии, проверка подписи.
<? php
include ( './class/autoloader.php' );
$ private_key = новый VIZ \ Key ( 'b9f3c242e5872ac828cf2ef411f4c7b2a710bd9643544d735cc115ee939b3aae' );
напечатайте 'Закрытый ключ из шестнадцатеричного:' . $ private_key -> шестнадцатеричный . PHP_EOL ;
напечатайте «Закрытый ключ WIF:» . $ private_key -> кодировать (). PHP_EOL ;
$ data = 'Привет, VIZ.World! ' . дата ( 'dmY H: i: s' );
напечатайте «Данные для подписи:» . $ data . PHP_EOL ;
$ подпись = $ private_key -> подписать ( $ data );
if ( false === $ подпись ) {
print 'Каноническая подпись не найдена, попробуйте еще раз.' ;
}
else {
напечатайте «Подпись:» . $ подпись . PHP_EOL ;
$ public_key = $ private_key -> get_public_key ();
$ Recovered_public_key = $ public_key -> recover_public_key ( $ данные , $ подписи );
print 'Восстановлен открытый ключ из подписи:' . $ public_key -> кодировать (). PHP_EOL ;
if ( $ public_key ) {
print 'Открытый ключ из частного:' . $ public_key -> кодировать (). PHP_EOL ;
print 'Проверить статус подписи для тех же данных:' . var_export ( $ public_key -> проверить ( $ данные , $ подписи ), истинные ). PHP_EOL ;
print 'Проверить статус подписи для других данных:' . var_export ( $ public_key -> проверить ( 'Bye VIZ.World!' , $ подписи ), истинный ). PHP_EOL ;
}
}
JsonRPC: инициализация с конечной точкой, метод api без параметров, изменение конечной точки, получение учётной записи, включение всех результатов json, запрос несуществующей учётной записи.
<? php
include ( './class/autoloader.php' );
$ api = новый VIZ \ JsonRPC ( 'https://node.viz.plus/' );
$ dgp = $ api -> execute_method ( 'get_dynamic_global_properties' );
var_dump ( $ dgp );
$ api -> endpoint = 'https://node.viz.media/' ;
$ account_login = 'on1x' ;
$ account = $ api -> execute_method ( 'get_account' , [ $ account_login , '' ]);
if ( false ! == $ account ) {
напечатать PHP_EOL . «Учетная запись» . $ account_login . 'был основан:' ;
var_dump ( $ аккаунт );
}
$ api -> return_only_result = false ;
$ account_login = 'странный.viz' ;
$ account = $ api -> execute_method ( 'get_account' , [ $ account_login , '' ]);
if ( isset ( $ account [ 'error' ])) {
напечатать PHP_EOL . $ account [ 'ошибка' ] [ 'сообщение' ];
}
Транзакция: инициализация с конечной точкой и закрытым ключом в wif, построение простой транзакции с операцией награждения и выполнение её.
<? php
include ( './class/autoloader.php' );
$ initiator = 'аккаунт' ;
$ initiator_private_key = '5Jaw8HtYbPDWRDhoH3eojmwquvsNZ8Z9HTWCsXJ2nAMrSxNPZ4F' ;
$ tx = новый VIZ \ Transaction ( 'https://node.viz.plus/' , $ initiator_private_key );
$ tx_data = $ tx -> награда ( $ инициатор , 'комитет' , 1000 , 0 , 'тестирование операции награды viz-php-lib' );
var_dump ( $ tx_data );
$ tx_status = $ tx -> выполнить ( $ tx_data [ 'json' ]);
var_dump ( $ tx_status );
Инициируйте с конечной точкой и закрытым ключом в wif, активируйте режим очереди и добавьте 2 операции, завершите очередь и получите массив результатов. Выполнить транзакцию json из массива. Добавьте дополнительную подпись для примера с несколькими подписями (может быть false, если каноническая подпись не найдена).
<? php
include ( './class/autoloader.php' );
$ initiator = 'some.account' ;
$ initiator_private_key = '5Jaw8HtYbPDWRDhoH3eojmwquvsNZ8Z9HTWCsXJ2nAMrSxNPZ4F' ;
$ tx = новый VIZ \ Transaction ( 'https://node.viz.plus/' , $ initiator_private_key );
$ tx -> start_queue ();
$ tx -> награда ( $ инициатор , 'комитет' , 1000 , 0 , 'тестирование нескольких операций viz-php-lib' );
$ tx -> награда ( $ инициатор , 'комитет' , 2000 , 0 ,'тестирование нескольких операций viz-php-lib 2' );
$ tx_data = $ tx -> end_queue ();
var_dump ( $ tx_data );
// поворачиваем флаг api для возврата всего результата (включая состояние ошибки)
$ tx -> api -> return_only_result = false ;
$ tx_status = $ tx -> выполнить ( $ tx_data [ 'json' ]);
var_dump ( $ tx_status );
$ tx2_data = $ tx -> add_signature ( $ tx_data [ 'json' ], $ tx_data [ 'data' ], '5HrmLC83FybxVgJ5jXQN5dUHxXZfHVc27sYpjdnoTviRqppPhPN' );
var_dump ( $ tx2_data );
Создайте новый закрытый ключ, получите из него открытый ключ, выполните транзакцию с помощью операции create_invite.
<? php
include ( './class/autoloader.php' );
$ key = новый VIZ \ Key ();
$ key_data = $ key -> gen ( 'будет введено какое-то семя, соль' , 'там' );
print 'Ключевые семена с введенной солью:' . $ key_data [ 0 ]. PHP_EOL ;
$ key_data = $ key -> gen ( 'будет сгенерировано некоторое семя, соль' );
print 'Ключевое семя со случайной солью:' . $ key_data [ 0 ]. PHP_EOL ;
напечатайте 'Закрытый ключ (wif):' . $ key_data [ 1 ]. PHP_EOL ;
print 'Закрытый ключ (wif) от объекта:' . $ ключ -> кодировать (). PHP_EOL ;
print 'Открытый ключ (закодированный):' . $ key_data [ 2 ]. PHP_EOL ;
print 'Открытый ключ (закодированный) от объекта:' . $ key_data [ 3 ] -> кодировать (). PHP_EOL ;
$ tx = новый VIZ \ Transaction ( 'https://node.viz.plus/' , '5JWm ...' );
$ tx_data = $ tx -> create_invite ( 'on1x' , '50 .005 VIZ ' , $ key_data [ 2 ]);
var_dump ( $ tx_data );
$ tx_status = $ tx -> выполнить ( $ tx_data [ 'json' ]);
var_dump ( $ tx_status );
Найдите общий ключ с двух сторон. Простое шифрование и дешифрование строк с помощью AES-256-CBC. Кодирование и декодирование заметок со
viz-js-lib
структурой совместимости для зашифрованных заметок.
<? php
include ( './class/autoloader.php' );
$ private_key1 = новый VIZ \ Key ();
$ private_key1 -> gen ();
$ public_key1 = $ private_key1 -> get_public_key ();
напечатайте '$ public_key1:' . $ public_key1 -> кодировать (). PHP_EOL ;
$ private_key2 = новый VIZ \ Key ();
$ private_key2 -> gen ();
$ public_key2 = $ private_key2 -> get_public_key ();
напечатайте '$ public_key2:' . $ public_key2 -> кодировать (). PHP_EOL ;
$ shared_key1 = $ private_key1 -> get_shared_key ( $ public_key2 -> encode ());
напечатайте '$ shared_key1:' . $ shared_key1 . PHP_EOL ;
$ shared_key2 = $ private_key2 -> get_shared_key ( $ public_key1 -> encode ());
напечатайте '$ shared_key2:' . $ shared_key2 . PHP_EOL ;
$ string = 'Привет, мир ВИЗ! ? ' ;
$ encrypted = VIZ \ Utils :: aes_256_cbc_encrypt ( $ string , hex2bin ( $ shared_key1 ));
$ decrypted = VIZ \ Utils :: aes_256_cbc_decrypt ( hex2bin ( $ encrypted [ 'данные' ]), hex2bin ( $ shared_key2 ), hex2bin ( $ encrypted [ 'iv' ]));
напечатать PHP_EOL . 'Простой зашифрованный AES-256-cbc с $ shared_key1:' . var_export ( $ encrypted , истина ). PHP_EOL ;
напечатать PHP_EOL . 'Простой расшифрованный AES-256-cbc с помощью $ shared_key2:' . var_export ( $ дешифровано , правда ). PHP_EOL ;
$ crypted = $ private_key1 -> encode_memo ( $ public_key2 -> encode (), $ string );
напечатать PHP_EOL . 'Зашифрованная памятка AES-256-cbc с общим ключом между private_key1 и public_key2:' . var_export ( $ crypted , истина ). PHP_EOL ;
$ result = $ private_key2 -> decode_memo ( $ crypted );
напечатать PHP_EOL . 'Расшифрованная записка с помощью AES-256-cbc с общим ключом между private_key2 и public_key1:' . var_export ( $ result , истина ). PHP_EOL ;
$ result = $ private_key1 -> decode_memo ( $ crypted );
напечатать PHP_EOL . 'Расшифрованная записка с помощью AES-256-cbc с общим ключом между private_key1 и public_key2:' . var_export ( $ result , истина ). PHP_EOL ;
$ result = $ private_key3 -> decode_memo ( $ crypted );
напечатать PHP_EOL . 'Расшифрованная записка с помощью AES-256-cbc с общим ключом между private_key3 и public_key1:' . var_export ( $ result , истина ). PHP_EOL ;
Сгенерируйте данные и подпись для аутентификации без пароля и проверьте их на предмет действия аутентификации домена с активными полномочиями.
<? php
include ( './class/autoloader.php' );
$ account = 'пригласить' ;
$ private_key = новый VIZ \ Key ( '5KcfoRuDfkhrLCxVcE9x51J6KN9aM9fpb78tLrvvFckxVV6FyFW' );
напечатайте «Закрытый ключ WIF:» . $ private_key -> кодировать (). PHP_EOL ;
list ( $ data , $ signature ) = $ private_key -> auth ( $ account , 'domain.com' , 'auth' , 'active' );
напечатайте "Данные для аутентификации:" . $ data . PHP_EOL ;
напечатайте «Подпись:» . $ подпись . PHP_EOL ;
$ viz_auth = новый VIZ \ Auth ( 'https://node.viz.plus/' , 'domain.com' , 'auth' , 'active' );
$ auth_status = $ viz_auth -> check ( $ data , $ signature );
напечатайте «Аутентификация без пароля:» . var_export ( $ auth_status , истина );
Совершите транзакцию с помощью специальной операции.
<? php
include ( './class/autoloader.php' );
$ account = 'тест' ;
$ private_key = '5K ...' ; // обычный
$ tx = new VIZ \ Transaction ( 'https://node.viz.plus/' , $ private_key );
$ tx_data = $ tx -> custom ([], [ $ account ], 'test' , '{"msg": "тестирование пользовательской операции viz-php-lib"}' );
$ tx_data );
$ tx -> api -> return_only_result = false ;
$ tx_status = $ tx -> выполнить ( $ tx_data [ 'json' ]);
var_dump ( $ tx_status );
Совершите транзакцию с помощью операции создания учётной записи.
<? php
include ( './class/autoloader.php' );
$ account = 'тест' ;
$ private_key = '5K ...' ; // обычный
$ tx = new VIZ \ Transaction ( 'https://api.viz.world/' , $ private_key );
Комиссия $ = '0,000 VIZ' ;
$ делегирование = '10 .000000 АКЦИЙ ' ;
// вы можете установить любые права
доступа в виде простой строки с закодированным открытым ключом $ master = 'VIZ7RXhpaw8SbedSp84EqMGGzeBZgAPLEn7D6kQhJu8bMMvUKtuxk' ; // 5JRd4Toy8cmDr15qEtZieqAgbg3qQMU6n8cPC1Las2hBah46tr1
$ active = 'VIZ7H8S8rHkKQkX8bSUpDtBAwy8tTphq2NH7ZRv1dcCvk1Cjz38n ; // 5JvgdGsA5M8rZ9oY2p7qcKkexG1kWqN2jQcQ6afEPCqQXrKTsbS
// или создайте полную структуру полномочий (если вам нужна большая гибкость)
$ regular = [
// 'weight_threshold' => 1, // может быть пустым, если weight_threshold = 1
'account_auths' => [
[ 'on1x' , 1 ]
],
'key_auths' => [
[ 'VIZ5bGNeJPjoDdZTEK3LSMUfP21gcBH34AdMPHpvQymuYMk2YMbsB' , 1 ], // 5HuHKQhiiAAAp7zMCgRpCCyv8hramEmzAzDUagrhMkTWDhyVtK6
[ 'VIZ5jWA94PYBanGSPhTyWrwvT8RAJcnB7onXGvK5DnzbxB6874yap' , 1 ] // 5KESchwZvs67C4Xz5SQQ1ea4N9rZR67NEvi6yemWpSYoKo9eTrM
]
];
// вам нужно вручную проверить сортировку открытых ключей в key_auths, иначе узел откажется от транзакции
$ memo_key = 'VIZ1111111111111111111111111111111114T1Anm' ; // может быть пустой ключ
$ json_metadata = '' ;
$ реферер = '' ;
$ new_account_name = 'тестовая библиотека ' ;
$ tx_data = $ tx -> account_create ( $ fee , $ делегирование , $ account , $ new_account_name , $ master , $ actove , $ regular , $ memo_key , $ json_metadata , $ referrer );
var_dump ( $ tx_data );
$ tx -> api -> return_only_result = false ;
$ tx_status = $ tx -> выполнить ( $ tx_data [ 'json' ]);
var_dump ( $ tx_status );
Сделать транзакцию с операциями предложения в виде массива (необходимо использовать
build_
префикс). Подтвердите это предложение с другим активным ключом учетной записи.
<? php
include ( './class/autoloader.php' );
$ account = 'тест' ;
$ private_key = '5K ...' ; // обычный
$ account2 = 'test2' ;
$ private_key2 = '5 КБ ...' ; // активен
$ tx = новый VIZ \ Transaction ( 'https://api.viz.world/' , $ private_key );
$ Tx_data = $ ТХ -> proposal_create ( $ счет , 'тест' , "тест предложение работы строителя , '2021-03-03T12: 00: 01' , [ $ ТХ -> build_transfer ( $ account2 , 'комитет' , ' 1.000 ВИЗ » , « Предлагаемая операция 1 » ),build_transfer ( $ account2 , 'комитет' , '2.000 VIZ' , 'предлагаемая операция 2' )], false );
var_dump ( $ tx_data );
$ tx_status = $ tx -> выполнить ( $ tx_data [ 'json' ]);
var_dump ( $ tx_status );
$ tx2 = новый VIZ \ Transaction ( $ config [ 'jsonrpc_node' ], $ private_key2 );
$ Tx2_data = $ tx2 -> proposal_update ( $ счет , 'тест' , [ $ account2 ]);
var_dump ( $ tx2_data );
$ tx2_status = $ tx -> выполнить ( $ tx2_data [ 'json' ]);
var_dump ( $ tx2_status );
Создана заявка в комитет, просьба изучить и принять участие в голосовании:
https://my.viz.plus/dao/fund-requests/3773/
Да пребудет с вами ВИЗ!
Наградить автора поста