Цей допис востаннє відредаговано jimi2018 11.12.2018 09:06
1. Огляд пакету розробкиМета EosTool — усунути труднощі при розробці блокчейн-додатків EOS на PHP, таких як: - Викликайте його функції через інтерфейс RPC Nodeos і Keosd
- Генерація приватних і публічних ключів у форматі EOS офлайн
- Використовуйте свій локальний приватний ключ для генерації підписів транзакцій, сумісних з EOS,
- Серіалізуйте транзакційні об'єкти у форматі packed_trx, необхідний Nodeos
Можна вважати, що EosTool — це PHP-версія eosjs, яку можна повністю реалізувати функції офіційного клієнта EOS Cleos, а також легко додати до підтримки блокчейну EOS у PHP-додатках, значно підвищуючи ефективність розробки.
Зацікавлені друзі також можуть перейти безпосередньо на цю адресу, щоб завантажити комплект розробки EOS блокчейну PHP:http://t.cn/EUZAODQ
EosTool працює в середовищі Php 7.1+, поточна версія — 1.0.0, а список основних кодових файлів виглядає так:
| Кодові файли | Ілюстрації | | eostool/src/client/NodeClient.php | Клас пакету інтерфейсу RPC для вузлових програмних вузлів | | eostool/src/client/WalletClient.php | Клас інкапсуляції інтерфейсу RPC у програмному забезпеченні гаманця KEOSD | | eostool/src/client/RpcOutput.php | RPC повертає отриманий клас інкапсуляції | | eostool/src/Crypto/PrivateKey.php | Клас приватних ключів EOS | | eostool/src/Crypto/PublicKey.php | Клас відкритого ключа EOS | | eostool/src/Crypto/Signature.php | Підписний клас EOS | | eostool/src/Serializer/AbiType.php | Клас пакетів типу ABI від EOS | | eostool/src/Serializer/AbiTypeFactory.php | Заводський клас типу ABI | | eostool/src/Serializer/SerialBuffer.php | Клас реалізації серіалізованого буфера | | eostool/src/Serializer/Serializer.php | Клас реалізації серіалізатора | | eostool/src/Signer/Signer.php | Інтерфейс підписанта | | eostool/src/Signer/KeosdSigner.php | Клас реалізації Keosd signer | | eostool/src/Signer/LocalSigner.php | Реалізація локального офлайн-підписача | | Eostool/SRC/Contract.php | Контрактний клас | | Eostool/SRC/EosTool.php | Клас входу в пакет розробки | | Eostool/Тести | Каталог одиничних тестових випадків | | Eostool/phpunit.xml | Профілі модульних тестів | | eostool/постачальник | Пакети залежності від сторонніх сторін | | Eostool/composer.json | Конфігураційний файл композитора | 2. Доступ до сервера вузлівВикористовуйте клас NodeClient для доступу до інтерфейсу rpc nodeos. Наприклад, наступний код звертається до get_info інтерфейсу плагіна ланцюга для нативно запущеного вузла Nodeos: 2.1 Групування викликів RPC
EosTool використовує узгоджений метод іменування, і метод виклику NodeClient можна вивести згідно з API: групування API відповідає властивості з тією ж назвою, що й NodeClient, а API — методу, конвертованому CamelCase під тим самим атрибутом з тією ж назвою, що й групування Client of No. Наприклад:
| Плагіни | Групування API | RPC API | Метод NodeClient | | chain_api_plugin | Ланцюг | get_info | $nc->chain->getInfo() | | history_api_plugin | Історія | get_transaction | $nc->history->getTransaction() | | net_api_plugin | net | Статус | $nc->net->status() | | producer_api_plugin | Продюсер | get_runtime_options | $nc->producer->getRunTimeOptions() | | dbsize_api_plugin | dbsize | Іди | $nc->dbsize->get() |
Офіційна документація для RPC API:https://developers.eos.io/eosio-nodeos/reference
2.2 Параметри виклику RPC
Для Nodeos деякі виклики вимагають передачі додаткових параметрів, наприклад, інтерфейсу get_block плагіна ланцюга; при використанні EosTool для виклику просто організуйте параметри у відповідний масив, зразковий код виглядає так:
2.3 RPC-виклики повертаються значення
Результатом повернення всіх RPC-викликів є екземпляр RpcOutput, і виклик його методу hasError() дозволяє визначити, чи виклик неправильний, а також можна додатково використовувати метод getError() для отримання інформації про помилку. Відповідь виклику RPC можна отримати за допомогою методу getResult(), який є об'єктом StdClass, конвертованим з оригінального результату JSON, тому його легко витягувати атрибутну інформацію, наприклад:
2.4 Доступ до вузлів mainnet/testnet
При створенні екземпляра NodeClient можна передавати додаткові виконання параметрів для визначення основної або тестнету-вузла EOS для доступу. Наприклад, використовуйте наступний код для доступу до основного вузла:
Або відвідайте вузол у тестнеті Jungle:
3. Доступ до сервера гаманцяНова версія Keosd більше не надає документації RPC API, що може означати, що вона почала втрачати рівень у стеку програмного забезпечення EOS. Однак ви можете отримати доступ до старої версії документації за цією адресою: https://developers.eos.io/eosio-nodeos/v1.1.0/reference
Використовуйте клас WalletClient для доступу до інтерфейсу rpc Keosd. Наприклад, наступний код звертається до list_wallets інтерфейсу Keosd, який працює нативно: Оскільки API Keosd більше не групується, відповідний метод RPC безпосередньо зависає на об'єкті WalletClient, що є різницею. Як і в NodeClient, виклик WalletClient повертає об'єкт RpcOutput.
Keosd версії 1.4 використовує UNIX-сокети замість HTTP для забезпечення RPC-інтерфейсів за замовчуванням, що може вважатися безпечнішим для IPC, враховуючи, що в більшості випадків Keosd працює нативно. Отже, це також стандартний варіант інстанції для WalletClient, і в більшості випадків не потрібно передавати додаткові параметри для створення WalletClient. 4. Приватні та публічні ключі
Ключовий алгоритм EOS схожий на Bitcoin, але з деякими змінами та визначенням власного формату. Використовуйте статичний метод класу PrivateKey new() для генерації випадкового приватного ключа. Наприклад: Метод toEos() використовується для конвертації приватних ключових об'єктів у власний формат для EOS.
4.1 Похід публічного ключа Публічний ключ можна отримати з приватного ключа, наприклад:
Аналогічно, використовуйте метод toEos() для конвертації публічного ключа у власний формат для EOS.
4.2 Імпорт приватних ключів EOS Ви можете конвертувати приватний ключ, відформатований EOS, у об'єкт PrivateKey EosTool, наприклад, код нижче імпортує вказаний приватний ключ EOS і відображає відповідний публічний ключ EOS:
4.3 Авторитетний підпис Метод sign() у PrivateKey підтримує як звичайні підписи, так і авторитативні підписи, необхідні вузлам EOS. Наприклад, наступний код повертає простий підпис:
Передайте додаткові параметри для отримання авторитетного підпису для зазначених даних:
5. Серіалізація
EOS вимагає серіалізації транзакцій перед фіксацією вузла push_transaction, що також є неминучою частиною операцій EOS у PHP. В EosTool клас серіалізатора використовується для операцій серіалізації. Наприклад, наступний код серіалізує транзакцію передачі EOS у форматі 16-десяткового кодового потоку, який можна подати до вузла EOS:
Статичний метод fromAbi() Serializer використовується для побудови екземпляра серіалізатора на основі заданого abi, а потім метод serialize() цього екземпляра застосовується для серіалізації заданого типу даних з метою отримання шістнадцяткового потоку коду. 6. ПідписEosTool пропонує два способи підписування транзакцій: використання Keosd для підпису або використання локального приватного ключа. Використовуйте клас KeosdSigner для завершення підписання через сервер гаманця. Наприклад:
Використовуючи клас LocalSigner, ви можете уникнути використання keosd і безпосередньо використовувати офлайн-підписку приватних ключів. Наприклад: використовуйте EosTool\Signer\LocalSigner;
$prvKeys = ['5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3']; $signer = новий LocalSigner($prvKeys); $signatures = $signer->знак($tx,$pubKeys,$chainId);
7. Подання угоди
Дані транзакції мають бути нормалізовані, серіалізовані, підписані та упаковані через серію операцій, перш ніж їх можна буде передати вузлу Nodeos для трансляції. Клас EosTool надає метод transact() для ізоляції цих складних операцій. Наприклад, код нижче створює екземпляр EosTool за допомогою NodeClient і LocalSigner, а потім відправляє транзакцію: Зручно змінити підписатор на KeosdSigner, наприклад:
8. Посилання на єдиний договірний позовВикористовуйте метод pushAction() від EosTool, щоб викликати одну дію за контрактом. Наприклад, наступний код викликає метод hi() у контракті хостингу облікового запису Tommy:
9. Розгорнути контрактРозгорніть контракт за допомогою методу setContract() EosTool, наприклад: Зацікавлені друзі можуть звернутися сюди:http://t.cn/EUZAODQ
|