elcorp/umi-fork

UMI Core PHP Library fork

dev-master 2021-03-11 19:52 UTC

This package is not auto-updated.

Last update: 2024-05-04 10:51:03 UTC


README

travis 68747470733a2f2f6170702e636f646163792e636f6d2f70726f6a6563742f62616467652f47726164652f6263313063383565323930383466613561653361326236396137313231616336 Scrutinizer Code Quality Coverage Status PSR-12 GitHub Keybase PGP
GitHub release (latest SemVer) Packagist Version PHP Version Support Packagist Downloads

Оглавление

Введение

Для работы библиотеки требуются 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

Данная лицензия разрешает лицам, получившим копию данного программного
обеспечения и сопутствующей документации (в дальнейшем именуемыми
«Программное обеспечение»), безвозмездно использовать Программное обеспечение
без ограничений, включая неограниченное право на использование, копирование,
изменение, слияние, публикацию, распространение, сублицензирование и/или
продажу копий Программного обеспечения, а также лицам, которым предоставляется
данное Программное обеспечение, при соблюдении следующих условий:

Указанное выше уведомление об авторском праве и данные условия должны быть
включены во все копии или значимые части данного Программного обеспечения.

ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО
ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ТОВАРНОЙ
ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ НАРУШЕНИЙ,
НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ
ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА УЩЕРБ ИЛИ ПО ИНЫМ ТРЕБОВАНИЯМ, В ТОМ
ЧИСЛЕ, ПРИ ДЕЙСТВИИ КОНТРАКТА, ДЕЛИКТЕ ИЛИ ИНОЙ СИТУАЦИИ, ВОЗНИКШИМ ИЗ-ЗА
ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ
ОБЕСПЕЧЕНИЕМ.