Акаунти в Етеріумі
Акаунт в Етеріумі — це сутність із балансом етеру (ETH), яка може надсилати повідомлення в Етеріумі. Акаунти можуть керуватися користувачами або розгортатися як смарт-контракти.
Передумови
Щоб краще зрозуміти цю сторінку, ми рекомендуємо спочатку прочитати наш вступ до Етеріуму.
Типи акаунтів
В Етеріумі є два типи акаунтів:
- Зовнішньо керований акаунт (EOA) — контролюється будь-ким, хто має приватні ключі
- Акаунт контракту — смарт-контракт, розгорнутий у мережі, який контролюється кодом. Дізнайтеся більше про смарт-контракти
Обидва типи акаунтів мають можливість:
- Отримувати, зберігати та надсилати ETH і токени
- Взаємодіяти з розгорнутими смарт-контрактами
Ключові відмінності
Зовнішньо керовані
- Створення акаунта нічого не коштує
- Можуть ініціювати транзакції
- Транзакції між зовнішньо керованими акаунтами можуть бути лише переказами ETH або токенів
- Складаються з криптографічної пари ключів: відкритого та приватного ключів, які контролюють діяльність акаунта
Контрактні
- Створення контракту має вартість, оскільки ви використовуєте сховище мережі
- Можуть надсилати повідомлення лише у відповідь на отримання транзакції
- Транзакції із зовнішнього акаунта на акаунт контракту можуть запускати код, який може виконувати багато різних дій, наприклад, переказ токенів або навіть створення нового контракту
- Акаунти контрактів не мають приватних ключів. Натомість вони контролюються логікою коду смарт-контракту
Огляд акаунта
Акаунти в Етеріумі мають чотири поля:
nonce— лічильник, який вказує на кількість транзакцій, надісланих із зовнішньо керованого акаунта, або кількість контрактів, створених акаунтом контракту. Для кожного акаунта може бути виконана лише одна транзакція із заданим нонсом, що захищає від атак повторного відтворення, коли підписані транзакції багаторазово транслюються та виконуються повторно.balance— кількість Wei, що належить цій адресі. Wei — це номінал ETH, і в одному ETH міститься 1e+18 Wei.codeHash— цей хеш посилається на код акаунта у Віртуальній машині Ethereum (EVM). Акаунти контрактів мають запрограмовані фрагменти коду, які можуть виконувати різні операції. Цей код EVM виконується, якщо акаунт отримує виклик повідомлення. Його неможливо змінити, на відміну від інших полів акаунта. Усі такі фрагменти коду містяться в базі даних стану під відповідними хешами для подальшого отримання. Це значення хешу відоме як codeHash. Для зовнішньо керованих акаунтів поле codeHash є хешем порожнього рядка.storageRoot— іноді відомий як хеш сховища. 256-бітний хеш кореневого вузла дерева Меркла-Патрісії, який кодує вміст сховища акаунта (відображення між 256-бітними цілими значеннями), закодований у дерево як відображення з 256-бітного хешу Keccak-256 256-бітних цілих ключів у 256-бітні цілі значення, закодовані за допомогою префікса рекурсивної довжини (RLP). Це дерево кодує хеш вмісту сховища цього акаунта і за замовчуванням є порожнім.
Діаграма адаптована з Ethereum EVM illustrated (відкривається в новій вкладці)
Зовнішньо керовані акаунти та пари ключів
Акаунт складається з пари криптографічних ключів: відкритого та приватного. Вони допомагають довести, що транзакція дійсно була підписана відправником, і запобігають підробкам. Ваш приватний ключ — це те, що ви використовуєте для підписання транзакцій, тому він надає вам контроль над коштами, пов'язаними з вашим акаунтом. Насправді ви ніколи не володієте криптовалютою, ви володієте приватними ключами — кошти завжди знаходяться в реєстрі Етеріуму.
Це запобігає трансляції фальшивих транзакцій зловмисниками, оскільки ви завжди можете перевірити відправника транзакції.
Якщо Аліса хоче надіслати етер зі свого акаунта на акаунт Боба, їй потрібно створити запит на транзакцію та надіслати його в мережу для перевірки. Використання криптографії з відкритим ключем в Етеріумі гарантує, що Аліса може довести, що саме вона ініціювала запит на транзакцію. Без криптографічних механізмів зловмисниця Єва могла б просто публічно транслювати запит на кшталт «надіслати 5 ETH з акаунта Аліси на акаунт Єви», і ніхто не зміг би перевірити, що він надійшов не від Аліси.
Створення акаунта
Коли ви хочете створити акаунт, більшість бібліотек згенерують для вас випадковий приватний ключ.
Приватний ключ складається з 64 шістнадцяткових символів і може бути зашифрований паролем.
Приклад:
fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036415f
Відкритий ключ генерується з приватного ключа за допомогою алгоритму цифрового підпису на еліптичних кривих (відкривається в новій вкладці). Ви отримуєте публічну адресу для свого акаунта, взявши останні 20 байтів хешу Keccak-256 відкритого ключа та додавши 0x на початку.
Це означає, що зовнішньо керований акаунт (EOA) має адресу з 42 символів (20-байтний сегмент, що становить 40 шістнадцяткових символів, плюс префікс 0x).
Приклад:
0x5e97870f263700f46aa00d967821199b9bc5a120
Наступний приклад показує, як використовувати інструмент для підписання під назвою Clef (відкривається в новій вкладці) для генерації нового акаунта. Clef — це інструмент для керування акаунтами та підписання, який постачається в комплекті з клієнтом Етеріуму Go Ethereum (Geth) (відкривається в новій вкладці). Команда clef newaccount створює нову пару ключів і зберігає їх у зашифрованому сховищі ключів.
> clef newaccount --keystore <path>
Please enter a password for the new account to be created:
> <password>
------------
INFO [10-28|16:19:09.156] Your new key was generated address=0x5e97870f263700f46aa00d967821199b9bc5a120
WARN [10-28|16:19:09.306] Please backup your key file path=/home/user/go-ethereum/data/keystore/UTC--2022-10-28T15-19-08.000825927Z--5e97870f263700f46aa00d967821199b9bc5a120
WARN [10-28|16:19:09.306] Please remember your password!
Generated account 0x5e97870f263700f46aa00d967821199b9bc5a120
Документація Geth (відкривається в новій вкладці)
З вашого приватного ключа можна отримати нові відкриті ключі, але ви не можете отримати приватний ключ із відкритих ключів. Життєво важливо зберігати ваші приватні ключі в безпеці та, як випливає з назви, ПРИВАТНИМИ.
Вам потрібен приватний ключ для підписання повідомлень і транзакцій, які генерують підпис. Інші потім можуть використати цей підпис, щоб отримати ваш відкритий ключ, доводячи авторство повідомлення. У своєму застосунку ви можете використовувати бібліотеку JavaScript для надсилання транзакцій у мережу.
Акаунти контрактів
Акаунти контрактів також мають 42-символьну шістнадцяткову адресу:
Приклад:
0x06012c8cf97bead5deae237070f9587f8e7a266d
Адреса контракту зазвичай надається під час розгортання контракту в блокчейні Етеріуму. Адреса формується з адреси творця та кількості транзакцій, надісланих із цієї адреси («нонс»). Саме так операція CREATE отримує адресу.
Контракти також можна розгортати за допомогою CREATE2 (відкривається в новій вкладці), що формує адресу з адреси творця, значення, яке вибирає творець («сіль»), і хешу коду створення контракту. Нонс не використовується, тому адресу можна обчислити до того, як контракт почне існувати, і вона залишається незмінною незалежно від того, скільки інших транзакцій творець надсилає тим часом. Це дає змогу посилатися на контракт, який ще не розгорнуто.
Ключі валідатора
В Етеріумі також існує інший тип ключів, запроваджений під час переходу Етеріуму від консенсусу на основі доказу виконання роботи (PoW) до доказу частки (PoS). Це ключі BLS, і вони використовуються для ідентифікації валідаторів. Ці ключі можна ефективно агрегувати, щоб зменшити пропускну здатність, необхідну мережі для досягнення консенсусу. Без цієї агрегації ключів мінімальний стейк для валідатора був би набагато вищим.
Примітка про гаманці
Акаунт — це не гаманець. Гаманець — це інтерфейс або застосунок, який дає змогу взаємодіяти з вашим акаунтом в Етеріумі, незалежно від того, чи це зовнішньо керований акаунт, чи акаунт контракту.
Візуальна демонстрація
Подивіться, як Остін розповідає про хеш-функції та пари ключів.
Додаткове читання
Знаєте ресурс спільноти, який вам допоміг? Відредагуйте цю сторінку та додайте його!