elcorp / umi-fork
UMI Core PHP Library fork
Requires
- php: >=7.1
- php-64bit: >=7.1
- ext-hash: *
Suggests
- ext-sodium: *
This package is not auto-updated.
Last update: 2024-05-04 10:51:03 UTC
README
Оглавление
Введение
Для работы библиотеки требуются 64-битная версия PHP >= 5.4 и стандартное расширение hash.
Установка
Библиотека опубликована в репозитории Packagist и может быть установлена с помощью менеджера зависимостей Composer.
Composer
composer require umi-top/umi-core-php
Примеры
Мнемоники
UMI не накладывает никаких ограничений на способ генерации и хранения приватных
ключей.
Для совместимости, рекомендуем использовать
bip39.
Seed из мнемонической фразы
Пример с использованием библиотеки bitcoin-php:
<?php declare(strict_types=1); include __DIR__ . '/../vendor/autoload.php'; use BitWasp\Bitcoin\Mnemonic\Bip39\Bip39SeedGenerator; use UmiTop\UmiCore\Key\SecretKey; use UmiTop\UmiCore\Address\Address; $mnemonic = 'mix tooth like stock powder emerge protect index magic'; $bip39 = new Bip39SeedGenerator(); $seed = $bip39->getSeed($mnemonic)->getBinary(); $address = Address::fromKey(SecretKey::fromSeed($seed)); echo $address->getBech32(), PHP_EOL;
Ключи
В UMI применяется Ed25519 (RFC 8032) — схема подписи EdDSA использующая SHA-512 и Curve25519.
Ключ из seed
Seed может быть любой длины. Оптимальным вариантом является длина 32 байта.
<?php declare(strict_types=1); include __DIR__ . '/../vendor/autoload.php'; use UmiTop\UmiCore\Key\SecretKey; $seed = random_bytes(32); $secKey = SecretKey::fromSeed($seed); $bytes = $secKey->getBytes();
Подписать сообщение
<?php declare(strict_types=1); include __DIR__ . '/../vendor/autoload.php'; use UmiTop\UmiCore\Key\SecretKey; $secKey = SecretKey::fromSeed(random_bytes(32)); $message = 'Hello World'; $signature = $secKey->sign($message); echo base64_encode($signature), PHP_EOL;
Проверить подпись
<?php declare(strict_types=1); include __DIR__ . '/../vendor/autoload.php'; use UmiTop\UmiCore\Address\Address; $address = 'umi18d4z00xwk6jz6c4r4rgz5mcdwdjny9thrh3y8f36cpy2rz6emg5s6rxnf6'; $message = 'Hello World'; $signature = base64_decode( 'Jbi9YfwLcxiTMednl/wTvnSzsPP9mV9Bf2vvZytP87oyg1p1c9ZBkn4gNv15ZHwEFv3bVYlowgyIKmMwJLjJCw==' ); $pubKey = Address::fromBech32($address)->getPublicKey(); $isValid = $pubKey->verifySignature($signature, $message); var_dump($isValid);
Адреса
UMI использует адреса в формате Bech32
(bip173)
длиной 62 символа. Префикс имеет длину 3 символа.
Специальным случаем являются Genesis-адреса, существующие только
в Genesis-блоке, такие адреса имеют длину 65 символов
и всегда имеют префикс genesis
.
Адрес в формате Bech32
Создать адрес из строки Bech32 можно используя статический метод Address::fromBech32()
и экспортировать с помощью Address->getBech32()
:
<?php declare(strict_types=1); include __DIR__ . '/../vendor/autoload.php'; use UmiTop\UmiCore\Address\Address; $bech32 = 'umi18d4z00xwk6jz6c4r4rgz5mcdwdjny9thrh3y8f36cpy2rz6emg5s6rxnf6'; $address = Address::fromBech32($bech32); echo $address->getBech32(), PHP_EOL;
Адрес из приватного или публичного ключа
Статический метод Address::fromKey()
создает адрес из приватного
или публичного ключа:
<?php declare(strict_types=1); include __DIR__ . '/../vendor/autoload.php'; use UmiTop\UmiCore\Address\Address; use UmiTop\UmiCore\Key\SecretKey; use UmiTop\UmiCore\Key\PublicKey; $secKey = SecretKey::fromSeed(random_bytes(32)); $address1 = Address::fromKey($secKey); echo $address1->getBech32(), PHP_EOL; $pubKey = new PublicKey(random_bytes(32)); $address2 = Address::fromKey($pubKey); echo $address2->getBech32(), PHP_EOL;
Префикс
По умолчанию адреса имеют префикс umi
.
Изменить префикс можно с помощью метода Address->setPrefix()
:
<?php declare(strict_types=1); include __DIR__ . '/../vendor/autoload.php'; use UmiTop\UmiCore\Address\Address; $bech32 = 'umi18d4z00xwk6jz6c4r4rgz5mcdwdjny9thrh3y8f36cpy2rz6emg5s6rxnf6'; $address = Address::fromBech32($bech32)->setPrefix('aaa'); echo $bech32, PHP_EOL; echo $address->getBech32(), PHP_EOL;
Транзакции
Перевести монеты
Поля sender
, recipient
и value
являются обязательными.
Сумма указывается в UMI-центах, т.е. 1.23 UMI = 123.
<?php declare(strict_types=1); include __DIR__ . '/../vendor/autoload.php'; use UmiTop\UmiCore\Address\Address; use UmiTop\UmiCore\Key\SecretKey; use UmiTop\UmiCore\Transaction\Transaction; $secKey = SecretKey::fromSeed(random_bytes(32)); $sender = Address::fromKey($secKey)->setPrefix('umi'); $recipient = Address::fromKey($secKey)->setPrefix('aaa'); $value = 42; $trx = new Transaction(); $trx->setVersion(Transaction::BASIC) ->setSender($sender) ->setRecipient($recipient) ->setValue($value) ->sign($secKey); echo 'txid: ', bin2hex($trx->getHash()), PHP_EOL; echo 'base64: ', base64_encode($trx->getBytes()), PHP_EOL;
Создать структуру
Поля sender
, prefix
, name
, profitPercent
и feePercent
являются
обязательными.
Префикс имеет длину 3 символа. Название указывается в кодировке UTF-8 и может
иметь длину до 35 байтов. Проценты указываются в сотых долях процента,
т.е. 1.23% = 123.
<?php declare(strict_types=1); include __DIR__ . '/../vendor/autoload.php'; use UmiTop\UmiCore\Address\Address; use UmiTop\UmiCore\Key\SecretKey; use UmiTop\UmiCore\Transaction\Transaction; $secKey = SecretKey::fromSeed(random_bytes(32)); $sender = Address::fromKey($secKey)->setPrefix('umi'); $trx = new Transaction(); $trx->setVersion(Transaction::CREATE_STRUCTURE) ->setSender($sender) ->setPrefix('aaa') ->setName('🙂') ->setProfitPercent(500) ->setFeePercent(2000) ->sign($secKey); echo 'txid: ', bin2hex($trx->getHash()), PHP_EOL; echo 'base64: ', base64_encode($trx->getBytes()), PHP_EOL;
Обновить настройки структуры
Поля sender
, prefix
, name
, profitPercent
и feePercent
являются
обязательными.
Необходимо задать все поля, даже если они не изменились.
<?php declare(strict_types=1); include __DIR__ . '/../vendor/autoload.php'; use UmiTop\UmiCore\Address\Address; use UmiTop\UmiCore\Key\SecretKey; use UmiTop\UmiCore\Transaction\Transaction; $secKey = SecretKey::fromSeed(random_bytes(32)); $sender = Address::fromKey($secKey)->setPrefix('umi'); $trx = new Transaction(); $trx->setVersion(Transaction::UPDATE_STRUCTURE) ->setSender($sender) ->setPrefix('aaa') ->setName('🙂') ->setProfitPercent(500) ->setFeePercent(2000) ->sign($secKey); echo 'txid: ', bin2hex($trx->getHash()), PHP_EOL; echo 'base64: ', base64_encode($trx->getBytes()), PHP_EOL;
Установить адрес для начисления профита
Поля sender
и recipient
являются обязательными.
Адрес для начисления профита должен принадлежать структуре.
<?php declare(strict_types=1); include __DIR__ . '/../vendor/autoload.php'; use UmiTop\UmiCore\Address\Address; use UmiTop\UmiCore\Key\SecretKey; use UmiTop\UmiCore\Transaction\Transaction; $secKey = SecretKey::fromSeed(random_bytes(32)); $sender = Address::fromKey($secKey)->setPrefix('umi'); $newPrf = Address::fromBech32('aaa18d4z00xwk6jz6c4r4rgz5mcdwdjny9thrh3y8f36cpy2rz6emg5svsuw66'); $trx = new Transaction(); $trx->setVersion(Transaction::UPDATE_PROFIT_ADDRESS) ->setSender($sender) ->setRecipient($newPrf) ->sign($secKey); echo 'txid: ', bin2hex($trx->getHash()), PHP_EOL; echo 'base64: ', base64_encode($trx->getBytes()), PHP_EOL;
Установить адрес для перевода комиссии
Поля sender
и recipient
являются обязательными.
Адрес для перевода комиссии должен принадлежать структуре.
<?php declare(strict_types=1); include __DIR__ . '/../vendor/autoload.php'; use UmiTop\UmiCore\Address\Address; use UmiTop\UmiCore\Key\SecretKey; use UmiTop\UmiCore\Transaction\Transaction; $secKey = SecretKey::fromSeed(random_bytes(32)); $sender = Address::fromKey($secKey)->setPrefix('umi'); $newFee = Address::fromBech32('aaa18d4z00xwk6jz6c4r4rgz5mcdwdjny9thrh3y8f36cpy2rz6emg5svsuw66'); $trx = new Transaction(); $trx->setVersion(Transaction::UPDATE_FEE_ADDRESS) ->setSender($sender) ->setRecipient($newFee) ->sign($secKey); echo 'txid: ', bin2hex($trx->getHash()), PHP_EOL; echo 'base64: ', base64_encode($trx->getBytes()), PHP_EOL;
Активировать транзитный адрес
Поля sender
и recipient
являются обязательными.
Адрес должен принадлежать структуре.
<?php declare(strict_types=1); include __DIR__ . '/../vendor/autoload.php'; use UmiTop\UmiCore\Address\Address; use UmiTop\UmiCore\Key\SecretKey; use UmiTop\UmiCore\Transaction\Transaction; $secKey = SecretKey::fromSeed(random_bytes(32)); $sender = Address::fromKey($secKey)->setPrefix('umi'); $transit = Address::fromBech32('aaa18d4z00xwk6jz6c4r4rgz5mcdwdjny9thrh3y8f36cpy2rz6emg5svsuw66'); $trx = new Transaction(); $trx->setVersion(Transaction::CREATE_TRANSIT_ADDRESS) ->setSender($sender) ->setRecipient($transit) ->sign($secKey); echo 'txid: ', bin2hex($trx->getHash()), PHP_EOL; echo 'base64: ', base64_encode($trx->getBytes()), PHP_EOL;
Деактивировать транзитный адрес
Поля sender
и recipient
являются обязательными.
Адрес должен принадлежать структуре.
<?php declare(strict_types=1); include __DIR__ . '/../vendor/autoload.php'; use UmiTop\UmiCore\Address\Address; use UmiTop\UmiCore\Key\SecretKey; use UmiTop\UmiCore\Transaction\Transaction; $secKey = SecretKey::fromSeed(random_bytes(32)); $sender = Address::fromKey($secKey)->setPrefix('umi'); $transit = Address::fromBech32('aaa18d4z00xwk6jz6c4r4rgz5mcdwdjny9thrh3y8f36cpy2rz6emg5svsuw66'); $trx = new Transaction(); $trx->setVersion(Transaction::DELETE_TRANSIT_ADDRESS) ->setSender($sender) ->setRecipient($transit) ->sign($secKey); echo 'txid: ', bin2hex($trx->getHash()), PHP_EOL; echo 'base64: ', base64_encode($trx->getBytes()), PHP_EOL;
Отправить транзакцию в сеть
Пример с использованием расширений cURL и JSON:
<?php declare(strict_types=1); include __DIR__ . '/../vendor/autoload.php'; use UmiTop\UmiCore\Transaction\Transaction; $trx = new Transaction(); $payload = json_encode( [ 'jsonrpc' => '2.0', 'id' => '', 'method' => 'sendTransaction', 'params' => [ 'base64' => base64_encode($trx->getBytes()) ] ] ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://testnet.umi.top/json-rpc"); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_VERBOSE, true); $response = curl_exec($ch); curl_close($ch); echo $response, PHP_EOL;
Лицензия
Лицензия MIT
Copyright © 2020 UMI
Данная лицензия разрешает лицам, получившим копию данного программного
обеспечения и сопутствующей документации (в дальнейшем именуемыми
«Программное обеспечение»), безвозмездно использовать Программное обеспечение
без ограничений, включая неограниченное право на использование, копирование,
изменение, слияние, публикацию, распространение, сублицензирование и/или
продажу копий Программного обеспечения, а также лицам, которым предоставляется
данное Программное обеспечение, при соблюдении следующих условий:
Указанное выше уведомление об авторском праве и данные условия должны быть
включены во все копии или значимые части данного Программного обеспечения.
ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО
ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ТОВАРНОЙ
ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ НАРУШЕНИЙ,
НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ
ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА УЩЕРБ ИЛИ ПО ИНЫМ ТРЕБОВАНИЯМ, В ТОМ
ЧИСЛЕ, ПРИ ДЕЙСТВИИ КОНТРАКТА, ДЕЛИКТЕ ИЛИ ИНОЙ СИТУАЦИИ, ВОЗНИКШИМ ИЗ-ЗА
ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ
ОБЕСПЕЧЕНИЕМ.