Eth адрес что это
Перейти к содержимому

Eth адрес что это

  • автор:

Network addresses

Ethereum nodes have to identify themselves with some basic information to connect to peers. To ensure any potential peer can interpret this information, it is relayed in one of three standardized formats that any Ethereum node can understand: multiaddr, enode, or Ethereum Node Records (ENRs). ENRs are the current standard for Ethereum network addresses.

Some understanding of Ethereum's networking layer is required to understand this page.

The original Ethereum node address format was the 'multiaddr' (short for 'multi-addresses'). Multiaddr is a universal format designed for peer-to-peer networks. Addresses are represented as key-value pairs with keys and values separated with a forward slash. For example, the multiaddr for a node with IPv4 address 192.168.22.27 listening to TCP port 33000 looks like:

For an Ethereum node, the multiaddr contains the node-ID (a hash of their public key):

An enode is a way to identify an Ethereum node using a URL address format. The hexadecimal node-ID is encoded in the username portion of the URL separated from the host using an @ sign. The hostname can only be given as an IP address; DNS names are not allowed. The port in the hostname section is the TCP listening port. If the TCP and UDP (discovery) ports differ, the UDP port is specified as a query parameter "discport"

In the following example, the node URL describes a node with IP address 10.3.58.6 , TCP port 30303 and UDP discovery port 30301 .

Ethereum Node Records (ENRs)

Ethereum Node Records (ENRs) are a standardized format for network addresses on Ethereum. They supersede multiaddr's and enodes. These are especially useful because they allow greater informational exchange between nodes. The ENR contains a signature, sequence number and fields detailing the identity scheme used to generate and validate signatures. The ENR can also be populated with arbitrary data organized as key-value pairs. These key-value pairs contain the node's IP address and information about the sub-protocols the node is able to use. Consensus clients use a specific ENR structure (opens in a new tab)

to identify boot nodes and also include an eth2 field containing information about the current Ethereum fork and the attestation gossip subnet (this connects the node to a particular set of peers whose attestations are aggregated together).

Chapter 2: Ethereum Basics

In this chapter we will start exploring Ethereum, learning how to use wallets, how to create transactions, and also how to run a basic smart contract.

Ether Currency Units

Ethereum’s currency unit is called ether, identified also as "ETH" or with the symbols Ξ (from the Greek letter "Xi" that looks like a stylized capital E) or, less often, ♦: for example, 1 ether, or 1 ETH, or Ξ1, or ♦1.

Use Unicode character U+039E for Ξ and U+2666 for ♦.

Ether is subdivided into smaller units, down to the smallest unit possible, which is named wei. One ether is 1 quintillion wei (1 * 10 18 or 1,000,000,000,000,000,000). You may hear people refer to the currency "Ethereum" too, but this is a common beginner’s mistake. Ethereum is the system, ether is the currency.

The value of ether is always represented internally in Ethereum as an unsigned integer value denominated in wei. When you transact 1 ether, the transaction encodes 1000000000000000000 wei as the value.

Ether’s various denominations have both a scientific name using the International System of Units (SI) and a colloquial name that pays homage to many of the great minds of computing and cryptography.

Ether denominations and unit names shows the various units, their colloquial (common) names, and their SI names. In keeping with the internal representation of value, the table shows all denominations in wei (first row), with ether shown as 10 18 wei in the 7th row.

Kilowei or femtoether

Megawei or picoether

Gigawei or nanoether

Microether or micro

Milliether or milli

Choosing an Ethereum Wallet

The term "wallet" has come to mean many things, although they are all related and on a day-to-day basis boil down to pretty much the same thing. We will use the term "wallet" to mean a software application that helps you manage your Ethereum account. In short, an Ethereum wallet is your gateway to the Ethereum system. It holds your keys and can create and broadcast transactions on your behalf. Choosing an Ethereum wallet can be difficult because there are many different options with different features and designs. Some are more suitable for beginners and some are more suitable for experts. The Ethereum platform itself is still being improved, and the "best" wallets are often the ones that adapt to the changes that come with the platform upgrades.

But don’t worry! If you choose a wallet and don’t like how it works—or if you like it at first but later want to try something else—you can change wallets quite easily. All you have to do is make a transaction that sends your funds from the old wallet to the new wallet, or export your private keys and import them into the new one.

We’ve selected three different types of wallets to use as examples throughout the book: a mobile wallet, a desktop wallet, and a web-based wallet. We’ve chosen these three wallets because they represent a broad range of complexity and features. However, the selection of these wallets is not an endorsement of their quality or security. They are simply a good starting place for demonstrations and testing.

Remember that for a wallet application to work, it must have access to your private keys, so it is vital that you only download and use wallet applications from sources you trust. Fortunately, in general, the more popular a wallet application is, the more trustworthy it is likely to be. Nevertheless, it is good practice to avoid "putting all your eggs in one basket" and have your Ethereum accounts spread across a couple of wallets.

The following are some good starter wallets:

MetaMask is a browser extension wallet that runs in your browser (Chrome, Firefox, Opera, or Brave Browser). It is easy to use and convenient for testing, as it is able to connect to a variety of Ethereum nodes and test blockchains. MetaMask is a web-based wallet.

Jaxx is a multiplatform and multicurrency wallet that runs on a variety of operating systems, including Android, iOS, Windows, macOS, and Linux. It is often a good choice for new users as it is designed for simplicity and ease of use. Jaxx is either a mobile or a desktop wallet, depending on where you install it.

MyEtherWallet is a web-based wallet that runs in any browser. It has multiple sophisticated features we will explore in many of our examples. MyEtherWallet is a web-based wallet.

Emerald Wallet is designed to work with the Ethereum Classic blockchain, but is compatible with other Ethereum-based blockchains. It’s an open source desktop application and works under Windows, macOS, and Linux. Emerald Wallet can run a full node or connect to a public remote node, working in a "light" mode. It also has a companion tool to do all operations from the command line.

We’ll start by installing MetaMask on a desktop—but first, we’ll briefly discuss controlling and managing keys.

Control and Responsibility

Open blockchains like Ethereum are important because they operate as a decentralized system. That means lots of things, but one crucial aspect is that each user of Ethereum can—and should—control their own private keys, which are the things that control access to funds and smart contracts. We sometimes call the combination of access to funds and smart contracts an "account" or "wallet." These terms can get quite complex in their functionality, so we will go into this in more detail later. As a fundamental principle, however, it is as easy as one private key equals one "account." Some users choose to give up control over their private keys by using a third-party custodian, such as an online exchange. In this book, we will teach you how to take control and manage your own private keys.

With control comes a big responsibility. If you lose your private keys, you lose access to your funds and contracts. No one can help you regain access—your funds will be locked forever. Here are a few tips to help you manage this responsibility:

Do not improvise security. Use tried-and-tested standard approaches.

The more important the account (e.g., the higher the value of the funds controlled, or the more significant the smart contracts accessible), the higher security measures should be taken.

The highest security is gained from an air-gapped device, but this level is not required for every account.

Never store your private key in plain form, especially digitally. Fortunately, most user interfaces today won’t even let you see the raw private key.

Private keys can be stored in an encrypted form, as a digital "keystore" file. Being encrypted, they need a password to unlock. When you are prompted to choose a password, make it strong (i.e., long and random), back it up, and don’t share it. If you don’t have a password manager, write it down and store it in a safe and secret place. To access your account, you need both the keystore file and the password.

Do not store any passwords in digital documents, digital photos, screenshots, online drives, encrypted PDFs, etc. Again, do not improvise security. Use a password manager or pen and paper.

When you are prompted to back up a key as a mnemonic word sequence, use pen and paper to make a physical backup. Do not leave that task "for later"; you will forget. These backups can be used to rebuild your private key in case you lose all the data saved on your system, or if you forget or lose your password. However, they can also be used by attackers to get your private keys, so never store them digitally, and keep the physical copy stored securely in a locked drawer or safe.

Before transferring any large amounts (especially to new addresses), first do a small test transaction (e.g., less than $1 value) and wait for confirmation of receipt.

When you create a new account, start by sending only a small test transaction to the new address. Once you receive the test transaction, try sending back again from that account. There are lots of reasons account creation can go wrong, and if it has gone wrong, it is better to find out with a small loss. If the tests work, all is well.

Public block explorers are an easy way to independently see whether a transaction has been accepted by the network. However, this convenience has a negative impact on your privacy, because you reveal your addresses to block explorers, which can track you.

Do not send money to any of the addresses shown in this book. The private keys are listed in the book and someone will immediately take that money.

Now that we’ve covered some basic best practices for key management and security, let’s get to work using MetaMask!

Как создать кошелек для хранения Ethereum

Эфириум одна из самых популярных криптовалют и вторая по капитализации после Биткоина. Для покупки, хранения, продажи или обмена монет ETH нужен специальный криптошелек. В этом руководстве мы расскажем, как создать кошелек для Ethereum, как отправлять и получать на него крипту: онлайн и офлайн .

Что такое кошелек Эфириум

Ethereum – это цифровая валюта, которую нужно где-то хранить. Для этого были созданы цифровые кошельки, которые используются для отправки и получения криптовалюты, торговли, оплаты товаров и услуг в сети.

Любое хранилище для эфира имеет набор закрытых ключей. Закрытый ключ – это секретный код из букв и цифр, который назначает определенные монеты личной собственностью пользователя. Их сложность, конечно же, не облегчает пользователям запоминание. Именно для этого и нужны криптошельки. Когда вы отправляете монеты Ethereum в свой кошелек, он сохраняет все связанные с ними ключи, благодаря чему вы получаете доступ к ним без необходимости каждый раз вводить закрытый ключ.

Виды кошельков Эфириум

Хранилища криптовалют можно разделить на две основные категории: холодные и горячие.

Аппаратные кошельки. Такие устройства внешне похожи на флешки и считаются самым безопасным хранилищем для монет ETH. Все потому, что они хранят закрытые ключи таким образом, что даже при подключении к зараженному вирусами устройству они остаются в безопасности. Поскольку они работают в автономном режиме, хакеры не могут взломать их и украсть Эфириум.

Бумажные кошельки. Такие хранилища – не что иное, как открытый и закрытый ключ, сгенерированный с сайта. Их преимущества в том, что они работают в автономном режиме и бесплатны, а создать их очень просто. К недостаткам, можно отнести то, что они, к сожалению, подвержены физическим повреждениям и их нельзя использовать для оплаты товаров на месте.

Десктопные кошельки. Такие приложения устанавливаются на компьютер и работают с операционными системами, как Windows, Mac и Linux. Из-за того, что они имеют доступ к Интернету, они менее безопасны, чем холодные кошельки, но их преимущество в том, что они функциональны и бесплатны.

Браузерные кошельки. По факту такие хранилища – это просто сайты, на которых вы можете зарегистрировать личный аккаунт и переводить на него Эфириум. Вам не нужно ничего скачивать и устанавливать. Преимущество таких криптокошельков в удобстве и скорости входа в систему: требуются только логин и пароль от учетной записи. Однако это не самое безопасное решение, если вы планируете хранить большое количество Эфириума.

Мобильные кошельки. Сюда относятся хранилища в виде приложения для смартфона или планшета. Среди преимуществ, безусловно, можно выделить удобство, простоту использования и то, что их можно установить просто из Google Play или Apple Store бесплатно.

В каждой категории есть виртуальные бумажники для Ethereum, которые считаются самыми надежными и удобными – их мы рассмотрим подробнее.

Аппаратные кошельки

На рынке аппаратных хранилищ для криптовалют лидируют два бренда – Trezor и Ledger, которые предлагают модели и для хранения Эфириума. Популярные варианты:

Trezor One – поддерживает более 1000 криптовалют, включая эфир, имеет монохромный дисплей с двумя кнопками, стоит около 65 долларов США;

Trezor T – поддерживает более 1000 криптовалют, включая ETH, имеет цветной сенсорный экран, стоит 170 долларов США;

Ledger Nano S – защищен PIN-кодом, на него можно установить от 3 до 20 приложений в зависимости от их размера, поддерживает несколько криптовалют, включая эфир и токены ERC-20, поставляется в шести цветовых вариантах: черном, желтом, розовом, зеленом, синем и металлическом, стоит около 70 долларов США;

Ledger Nano – поддерживает до 100 приложений одновременно, оснащен Bluetooth, что позволяет подключить его к приложению Ledger Live Mobile для доступа к монетам ETH с компьютера или смартфона, стоит около 130 долларов США;

KeepKey – выполняет те же функции, что и устройства от Ledger или Trezor: хранит ключи в автономном режиме, позволяет делать резервные копии и генерировать ключи из 12 символов для восстановления доступа к крипте на другом устройстве, стоит около 140 долларов США.

Мобильные кошельки

На рынке представлено не так много мобильных хранилищ для эфира, разработанных или одобренных командой Ethereum. Проверенный и наиболее востребованный мобильный кошелек – Jaxx, который работает на всех устройствах и дает владельцу полную свободу и гибкость в обращении Эфириума. Приложение имеет интуитивно понятный интерфейс и широкий набор функций. Его особенность – новая система шифрования данных с помощью алгоритма AES-256, усиленного 5000 циклами хеширования пароля по стандарту PBKDF2.

Десктопные кошельки

Актуальные криптобумажники для хранения эфира с установкой на компьютер:

Guarda – поддерживает более 40 блокчейнов и тысячи их токенов, функцию обмена монет и возможность покупки любой криптовалюты с помощью банковской карты;

Exodus – поддерживает около 100 криптовалют, включая Эфириум, не хранит никаких личных данных, принадлежащих клиентам, и требует обязательного подключения к интернету для доступа к активам;

Atomic Wallet – поддерживает более 300 криптовалют, позволяет управлять ETH и другими токенами ERC20, покупать и обменивать эфир на другие криптовалюты внутри кошелька.

Браузерные кошельки

Среди популярных и проверенных браузерных криптобумажников для хранения Ethereum:

MetaMask – предназначен как для Ethereum, так и для других токенов на его основе, имеет простой и понятный интерфейс, сохраняет ключи на компьютере пользователя, доступен для браузеров Chrome, Opera, Mozilla и других;

MyEtherWallet – подходит для Эфириума и всех токенов на основе ERC20, предлагает пользователю клиентский интерфейс с возможностью подключения холодного кошелька.

Недостатком браузерных версий является отсутствие русского языка в интерфейсе, что несколько затрудняет их использование для русскоязычных пользователей, но не критично.

Как создать кошелек Ethereum

Для каждого типа хранилища требуется своя регистрация, но если аппаратное хранилище нужно купить, а бумажное – просто распечатать, то мобильные, десктопные и браузерные приложения имеют примерно одинаковую процедуру создания. Поэтому рассмотрим процесс создания кошелька для Ethereum на примере браузерной версии MyEtherWallet.

Для регистрации криптобумажнику вам нужно выполнить несколько простых действий:

Посетите официальный сайт MyEtherWallet – www.myetherwallet.com, введите надежный пароль длиной не менее 9 символов и сгенерируйте кошелек, нажав «By Keystore File»».

Загрузите файл хранилища ключей. У вас есть два способа сделать это. Вы можете загрузить файл .JSON с зашифрованной версией закрытого ключа, совместимый с myetherwallet. Вы также можете сохранить незашифрованную версию своего закрытого ключа, загрузив ее в виде файла .JSON или скопировав с веб-сайта. Постарайтесь сохранить этот файл в наиболее безопасном месте, желательно на USB-накопителе или мобильном телефоне.

Откройте криптокошелек. Для этого нужно использовать файл хранилища ключей, выбрав соответствующий пункт в меню, после чего нажать «Enter».

Получить номер кошелька. После разблокировки хранилища вы сможете выбрать монеты ETH или другие токены ERC-20 для использования, а также скопировать номер кошелька для отправки и получения крипты.

Теперь вы можете отправлять и получать монеты Ethereum и другие токены со своего личного криптокошелька. Просто нажмите «Отправить эфир и токены», выберите тип закрытого ключа, который хотите использовать (хранилище ключей / файл JSON), и выберите файл кошелька.

Как отправлять монеты ETH и токены ERC-20 с кошелька

Для отправки крипты нужно указать адрес кошелька, на который будет переслан эфир, и сумму, после этого нажать «Сгенерировать транзакцию», а затем «Отправить». Управлять токенами ERC20 в кошельке MyEtherWallet так же просто, как и ETH. После входа в кошелек нажмите оранжевую кнопку «Показать все токены», чтобы увидеть весь список поддерживаемых токенов в их сокращенной форме. Теперь щелкните на любой токен, чтобы загрузить его, и включите в MyEtherWallet. Если токен еще не поддерживается MEW, его можно добавить его самостоятельно, введя необходимую информацию.

Как пополнить кошелек Ethereum

Передавать монеты на кошелек MyEtherWallet можно несколькими способами:

через платежные сервисы;

через обменники криптовалют;

через другие официальные кошельки Ethereum.

Независимо от того, какой кошелек вы используете, храните свой закрытый ключ в надежном месте. Мы рекомендуем скачивать приложения для хранения монет ETH только с официальных сайтов разработчиков и покупать аппаратные кошельки у производителей

Учебник по Solidity. Все об адресах

@ilyadruzh

Продолжаем серию статей про язык Solidity и платформу Ethereum. В этой статье будет рассказываться про адреса в Ethereum. Статья была написана в августе 2019 года, с той порой язык изменился, поэтому несоответствия в описании автора были исправлены.

Во введении проведено сравнение Ethereum адресов с почтовыми адресами в реальном мире.

Техническая часть начинается с раздела “Что такое (технически) адрес в Ethereum?”

Оглавление

  1. Введение
  2. Что такое (технически) адрес Ethereum?
  3. Основы адресов в Solidity
  4. address vs address payable
  5. Методы доступные при работе с адресами
  6. Преобразование типов address и address payable
  7. Методы возвращающие тип address
  8. Нулевой адрес
  9. Ссылки

1. Введение

На август 2021 года в блокчейне Ethereum насчитывается почти 166 миллионов уникальных адресов!

Давайте начнем с очень простого примера, чтобы понять, что такое адреса в Ethereum (и в блокчейне в целом). Для этого нам нужно представить себе сценарий.

Вы находитесь в отпуске в Суздали. Вы впервые посещаете этот город, и он вам очень понравился! Настолько, что вы решили сказать своему другу Алексу Цветкову, что он обязательно должен его посетить.

Хорошим способом намекнуть ему об этом будет отправка открытки с изображением Суздальского Кремля.

Вы идете на почту, и почтальон спрашивает вас: “Куда отправить?”, на что вы отвечаете: “Моему другу, Алексу Цветкову”.

Сотрудник за стойкой обязательно скажет, что:

  1. он не знает, КТО этот ваш друг и
  2. он не знает, ГДЕ он живет.

Поскольку вы знаете адрес Алекса, вы напишете его на открытке и передадите ее сотруднику почтового отделения.

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

Когда письмо прибудет в Москву, почтальон возьмет его и опустит в почтовый ящик Алекса Цветкова: это его домашний адрес.

Простые аналогии

Эта история с открыткой может показаться слишком упрощенным примером. Ведь каждый знает, как отправить письмо и проверить свой почтовый ящик, чтобы посмотреть, что ему принес курьер.

Адрес в Ethereum имеет схожие характеристики с почтовыми адресами. Благодаря использованию криптографии с открытым ключом.

Уникальность адреса

В реальном мире почтовый адрес связан с почтовым ящиком, а вернее он связан с его географическим расположением.

Даже если в мире существует несколько Алексов Цветковых, но есть только один Алекс Цветков, проживающий по адресу “RU, 121552, Москва, ул. Ярцевская, д. 30.

Почтовый адрес — это как этикетка на почтовом ящике, которая соответствует имени человека и месту, где находится этот почтовый ящик.

Ethereum адрес — это последние 20 байт хэша (хэш функция keccak-256) открытого ключа.

Поскольку функции хэширования детерминированы, это значит, что для разных входных данных будет разный хэш, при этом для одних и тех же входных данных хэш функция будет возвращать всегда еднообразный хэш. Поэтому для уникального закрытого ключа => создаётся уникальный хэш.

Личное и секретное

Ключ вашего почтового ящика не только уникален, но также личный и секретный. С уникальностью мы уже познакомились, теперь давайте рассмотрим “личный” и “секретный”.

Личный — только вы владеете ключом, который открывает ваш почтовый ящик. Вы храните ключ в тайне, прикрепив его к кольцу для ключей вместе со всеми остальными ключами.

Секретный (закрытый) вы и только вы знаете, для чего может быть использован данный физический ключ. Если я дам вам свой набор ключей, вы не будете знать, каким именно ключом вам открыть мой почтовый ящик.

Аналогично в Ethereum, ваш закрытый ключ хранится в вашем кошельке. Только вы должны знать его и никогда не делиться им!

Управление секретным (закрытым) ключом

В реальном мире вы можете открыть свой почтовый ящик уникальным физическим ключом. Ваш почтовый ящик имеет встроенный замок, к которому привязан уникальный секретный ключ для его открытия.

В Ethereum вы можете использовать свой аккаунт с уникальным закрытым ключом.

Заметка: закрытый или секретный ключ? По сути это одно и тоже. Если вы говорите про “открытый ключ”, то в пару к нему говорите “закрытый ключ”. Если говорите “публичный ключ”, то говорите “секретный ключ”. Зависит от ваших предпочтений как использовать русский язык. Далее по тексту будет использоваться “закрытый” ключ.

В мире криптографии “личный” и “закрытый” ключ являются взаимозаменяемыми терминами. Открытый ключ является производным от закрытого ключа, поэтому они связаны между собой.

Закрытые ключи в Ethereum позволяют отправлять ether путем подписания транзакций. Единственным исключением являются смарт-контракты, как мы увидим позже.

Различные типы адресов

Ethereum адрес — это то же самое, что и почтовый адрес: он представляет собой адресата сообщения.

Адрес в платежной части транзакции Ethereum — это то же самое, что и счет получателя при банковском переводе.

External owned accounts (учетные записи, принадлежащие внешним пользователям, EOA): контролируются закрытыми ключами.

Закрытый ключ даёт контроль над ether на счёте и над процессами аутентификации, необходимой счёту при взаимодействии со смарт-контрактами. Они (закрытые ключи) используются для создания цифровых подписей, которые требуются для транзакций по расходованию любых средств на счете.

Contract accounts (учетные записи смарт-контрактов, CA): самоуправляемы своим своим кодом.

В отличие от EOA, у смарт-контрактов нет открытых или закрытых ключей. Смарт-контракты поддерживаются не закрытым ключом, а присущим им кодом. Можно сказать, что они “владеют собой”.

Адрес каждого смарт-контракта определяется в ходе выполнения транзакции по созданию смарт-контракта, как результат функции от источника транзакции и nonce. Ethereum адрес смарт-контракта можно использовать в транзакции в качестве получателя, отправляя средства на смарт-контракт или вызывая одну из функций смарт-контракта.

2. Что такое (технически) адрес Ethereum?

Хэш-функции являются ключевым элементом при создании адресов. Ethereum использует хэш-функцию keccak-256 для генерации адресов.

В Ethereum и Solidity адрес имеет размер в 20 байт (160 бит или 40 шестнадцатеричных символов). Он соответствует последним 20 байтам хэша (keccak-256) открытого ключа. Адрес всегда имеет префикс 0x, поскольку он представлен в шестнадцатеричном формате (нотация base16).

Это определение довольно техническое и звучит сложно. Я выделил жирным шрифтом основные элементы адресного типа. Однако я считаю, что объяснять эти 3 элемента по отдельности — не лучший подход. Скорее, я бы выбрал альтернативный путь, который даст вам более полную картину. Пошагово посмотрим как создаётся адрес в Ethereum.

Как создается адрес Ethereum?

Очень полезно понять процесс создания адреса в Ethereum. Это позволит по-другому взглянуть и понять, как устроена платформа Ethereum.

Мы будем ссылаться на официальную техническую спецификацию блокчейна Ethereum: желтую бумагу. Хотя она выглядит сложной и трудночитаемой, я помогу вам понять ее, разбив описание на небольшие шаги, которые легко усвоить.

Процесс создания адресов в Ethereum можно разделить на два типа: создание EOA адресов и создание адресов смарт-контрактов.

Как создаются EOA адреса?

Давайте используем спецификацию Yellow Paper и создадим адрес Ethereum с нуля. Мы будем использовать эту статью Винсента Кобеля в качестве пошагового руководства по созданию адреса Ethereum.

1. Начнём с открытого ключа (128 символов / 64 байта)

Примечание: открытый ключ получается из закрытого ключа с помощью ECDSA (алгоритм цифровой подписи на эллиптической кривой). Ethereum использует тот же тип кривой, что и биткоин: secp256k1.

Почему они выбрали именно схему ECDSA? См. обсуждение на форуме Ethereum

2. Применим хэш (keccak-256) к открытому ключу. Должна получиться строка длиной 64 символа / 32 байта.

3. Возьмем последние 40 символов / 20 байт из полученного хэша или отбросьте первые 24 символа / 12 байт.

Эти 40 символов / 20 байт являются адресом.

С префиксом 0x адрес фактически становится длиной 42 символа. Кроме того, важно отметить, что они нечувствительны к регистру. Все кошельки должны понимать адреса Ethereum, выраженные заглавными или строчными символами. (Начиная с EIP-55, адреса в верхнем регистре используются для проверки контрольной суммы)

0x001d3f1ef827552ae1114027bd3ecf1f086ba0f9 или 0X001D3F1EF827552AE1114027BD3ECF1F086BA0F9

Как создаются адреса смарт-контрактов?

Адреса смарт-контрактов создаются по-другому. Они детерминировано вычисляются из двух вещей:

  • Адрес создателя смарт-контракта: sender
  • Сколько транзакций отправил создатель: nonce

Ниже описаны шаги по созданию адреса смарт-контракта

  1. Возьмите значения sender и nonce.
  2. Закодируйте их с помощью RLP
  3. Захэшируйте результат с помощью Keccak-256

Адреса в кратком изложении

В целом, основными характеристиками адресного типа в Solidity являются:

  • Длина 20 байт (160 бит): как уже было сказано, Ethereum адрес соответствует последним 20 байтам хэша Keccak-256 связанного с ним открытого ключа.
  • Шестнадцатеричный формат (нотация base16): Ethereum адрес содержит ровно 40 символов (2 символа = 1 байт) из шестнадцатеричного диапазона (0 1 2 3 4 5 6 7 8 9 или a b c d e f).
  • Префикс 0x: поскольку это шестнадцатеричный формат, он должен иметь префикс 0x. Поэтому его общая длина составляет 42 символа, если считать 0x.

3. Основы адресов в Solidity

Как определить переменную адресного типа?

Чтобы определить переменную адресного типа, укажите ключевое слово address перед именем переменной.

address user = msg.sender;

Мы использовали встроенную функцию Solidity msg.sender для получения адреса текущего аккаунта, взаимодействующего со смарт-контрактом.

Но вы можете жёстко закодировать определенные адреса в коде Solidity, используя адресные литералы. Они описаны в следующем разделе.

Адресные литералы

Адресные литералы — это шестнадцатеричное представление Ethereum адреса, жёстко закодированное в файле Solidity.

Вот пример того, как объявить литерал адреса в Solidity.

address owner = 0xc0ffee254729296a45a3885639AC7E10F9d54979;

Как уже отмечалось ранее, литерал адреса должен:

  1. содержать 40 символов (длиной 20 байт), и
  2. должны иметь префикс 0x.
  3. имеют правильную контрольную сумму

Что касается пункта 3), адресные литералы должны иметь правильную контрольную сумму. Если они не проходят тест на контрольную сумму, Remix или компилятор Solidity выдадут предупреждение и будут рассматривать их как обычные интервалы чисел. Формат контрольной суммы адреса в смешанном регистре определен в EIP-55.

Наконец, адресные литералы по умолчанию устанавливаются как address .

4. address vs address payable?

Различие между address и address payable было введено в Solidity версии 0.5.0. Идея заключалась в том, чтобы разграничить адреса, которые могут получать ether, и теми, которые не могут (используются для других целей). Проще говоря, address payable может получать ether, а обычный address — нет.

В Solidity, с точки зрения отправителя:

  • Вы можете отправить ether в переменную, определенную как address payable
  • Вы не можете отправить ether в переменную, определенную как address

Вы можете использовать ключевое слово payable перед именем переменной типа address, чтобы позволить переменной принимать ether.

Примечание: Тип, возвращаемый msg.sender, является типом address payable.

5. Методы, доступные при работе с адресами

Примечание: количество ether в _amount, указанное в качестве параметра в приведенных ниже методах, выражается в Wei (18 нулей):

1 ether = ¹¹⁸ wei = 1 000 000 000 000 000 000 000 000 000 000 wei

Все методы типа address в Solidity:

<address payable>.transfer(uint256 _amount)

<address payable>.send(uint256 _amount) returns (bool)

<address>.call(bytes memory) returns (bool, bytes memory)

<address>.delegatecall(bytes memory) returns (bool, bytes memory)

<address>.staticcall(bytes memory) returns (bool, bytes memory)

Мы разделим методы, связанные с адресами, на 3 категории и 2 типа транзакций:

  • методы связанные с ether: balance() , transfer() и send()
  • методы связанные с взаимодействием со смарт-контрактами: call() , delegatecall() и staticcall()
  • методы связанные с возможным кодом внутри адрес: code() , codehash()

Методы, связанные с ether

возвращает баланс счета в wei.

Любая переменная, определенная как address, имеет метод balance(). Этот метод позволяет получить количество ether, хранящегося на счете, принадлежащем внешнему владельцу (EOA / пользователю) или смарт-контракту. Возвращаемое число представляет собой количество ether в wei.

В приведенном ниже коде показано, как получить ether баланс вашего адреса. В примере мы используем msg.sender.

На самом деле существует два способа посмотреть баланс Ethereum адреса.

Если вы хотите получить остаток по текущему смарт-контракту, мы можем использовать address(this) (это явное преобразование).

Утверждение типа <address>.balance считается способом чтения информации из состояния, поскольку оно обращается к данным блокчейна. Поэтому любая функция в Solidity, возвращающая <address>.balance, может быть определена как view.

  • Переводит указанное количество ether (в wei) на указанный address.
  • Возвращает при неудаче и выбрасывает исключение при ошибке.
  • Потребляет 2 300 gas.

Под капотом функция transfer() запрашивает баланс адреса, применяя свойство balance, перед отправкой ether.

Метод: address.send(uint256) returns (bool)

send — это низкоуровневый аналог transfer. При неудачном выполнении текущий смарт-контракт не прекратится с выбросом исключением, просто send вернет false.

Использование send сопряжено с некоторыми опасностями: передача не состоится, если глубина стека вызовов равна 1024 (это всегда может быть принудительно исправлено вызывающей стороной), а также если у получателя закончится gas. Поэтому для безопасных переводов ether всегда проверяйте возвращаемое значение send, используйте transfer или даже лучше: используйте шаблон, в котором получатель снимает деньги.

  • Аналогичнен address.transfer(uint256)
  • Возвращает false при неудаче (Внимание: всегда проверяйте возвращаемое значение send).
  • Потребляет газ в размере 2300.

Методы взаимодействия со смарт-контрактами

Solidity предлагает удобный способ вызова функций удалённых смарт-контрактов (например: targetContract.doSomething(. ) ). Однако этот высокоуровневый синтаксис доступен только в том случае, если интерфейс удалённого смарт-контракта известен на этапе компиляции.

В EVM представлено 4 специальных операционных кодов (opcode) для взаимодействия с другими смарт-контрактами, из которых 3 доступны, как методы типа address: call, delegatecode и staticcall.

Примечание: callcode устарел, но все еще доступен в низкоуровневых ассемблерных вставках.

Все низкоуровневые функции, определенные ниже, принимают один аргумент: необработанное сообщение (Может быть создано в библиотеке web3 с помощью encodeABI()).

В этом разделе мы опишем эти низкоуровневые методы. Для лучшего понимания нам необходимо разделить контекст сценария на три части:

  • Мы рассматриваем сценарий, в котором смарт-контракт A взаимодействует с смарт-контрактом B
  • Кто вызывает функции удалённого смарт-контракта (отправляет сообщения)? Хранилище какого смарт-контракта обновляется?
  • Технические детали (возвращаемые значения, передаваемый gas и т.д.)

Метод: address.call(bytes memory) returns (bool, bytes memory)

Типичный случай: смарт-контракт A хочет выполнить функцию смарт-контракта B, которая обращается или изменяет хранилище смарт-контракта B. Вызов B.function() может обновить только хранилище B.

ПРЕДУПРЕЖДЕНИЕ: НЕБЕЗОПАСНО! Получатель может (случайно или злонамеренно) израсходовать весь ваш газ, в результате чего ваш смарт-контракт остановится с исключением out of gas (OOG); всегда проверяйте возвращаемое значение метода call.

Следует избегать использования .call() при выполнении функции другого смарт-контракта, так как она обходит проверку типов, проверку существования функции и упаковку аргументов.

Спецификация

  • Отправляет сообщение (низкоуровневый CALL, см. опкод OxF1), передавая полезную нагрузку полученную в аргументе и помеченную как memory.
  • Передаёт весь доступный газ.
  • Возвращает кортеж с:
  1. истинностное значение результата вызова (true при успехе, false при неудаче или ошибке).
  2. данные в байтовом формате.

Предупреждение: callcode() устарел, вместо него используется .delegatecall(). Однако его все еще можно использовать в assembly вставках в коде смарт-контракта.

Типичный случай: смарт-контракт A по сути копирует себе функцию B. Выполнение функции смарт-контракта В будет происходить в контексте смарт-контракта A, возможно взаимодействие со хранилищем смарт-контракта А. Вызов B.function() обновит хранилище A.

Спецификация

  • Низкоуровневая функция CALLCODE, подобная address(this).call(…), но с заменой кода этого смарт-контракта на код адреса.
  • Возвращает false при ошибке.

Метод: address.delegatecall(bytes memory) returns (bool, bytes memory)

Типичный случай: смарт-контракт A хочет выполнить функцию смарт-контракта B, при этом функция будет выполнена в контексте смарт-контракта А. При этом функция B может перезаписать хранилище A и выдать себя за A для любого другого смарт-контракта. Тогда msg.sender будет адресом A, а не B.

В этом случае смарт-контракт A по сути делегирует вызов функции смарт-контракту B. Разница с прежним методом callcode заключается в том, что использование delegatecall позволяет не только перезаписать хранилище смарт-контракта A. Но и если смарт-контракт B вызовет другой смарт-контракт C, смарт-контракт C увидит, что отправителем msg.sender является смарт-контракт A.

Спецификация

  • Низкоуровневая операция DELEGATECALL (см. опкод OxF4) (с полным контекстом msg, видимым текущим смарт-контрактом), передавая полезную нагрузку полученную в аргументе и помеченную как memory.
  • Передаёт весь доступный газ
  • Возвращает кортеж с:
  1. истинностным значением как результатом вызова (true при успехе, false при неудаче или ошибке).
  2. данные в байтовом формате.

Метод: address.staticcall(bytes memory) returns (bool, bytes memory)

Спецификация

  • Низкоуровневая операция STATICCALL (см. опкод OxF4) (с полным контекстом msg, видимым текущим смарт-контрактом), передавая полезную нагрузку полученную в аргументе и помеченную как memor.
  • Возвращает кортеж с:
  1. истинностным значением как результат вызова (true при успехе, false при неудаче или ошибке).
  2. данные в байтовом формате.
  • Передаёт весь имеющийся газ

Дополнительные параметры для вызовов низкого уровня

При взаимодействии с смарт-контрактами в Solidity через низкоуровневые вызовы call(…), delegatecall(…) и staticcall(…) у вас есть возможность добавить некоторые пользовательские параметры (немного похоже на web3js). Это позволит вам указать, например, сколько ether вы хотите отправить по адресу, указанному в вызове (value), а также сколько gas вы готовы использовать.

В приведенном ниже фрагменте кода приведен пример.

6. Преобразование типов address и address payable

  • Допускаются неявные преобразования из address payable в address
  • Неявные преобразования из address в address payable невозможен (за исключением address payable к address payable).

Примечание: для версии 0.5.* способ преобразования из address в address payable заключался в промежуточном преобразовании в uint160 (160 бит = 20 байт, размер Ethereum адреса). Для версии 0.6.* можно использовать ключевое слово payable, как функцию и передать в неё адрес — payable(address).

  • Явное преобразование из и в address разрешено для: целых чисел uint160, целочисленных литералов, bytes20 и типа contract.
  • Только выражения типа address и contract могут быть преобразованы в тип address payable с помощью явного преобразования payable(…). Для типа contract это преобразование допустимо только в том случае, если смарт-контракт может получать ether, т.е. смарт-контракт либо имеет функцию receive, либо функцию fallback c payable. Обратите внимание, что payable(0) допустимо и является исключением из этого правила.

Контракты как address

Начиная с версии 0.5.0 Solidity, смарт-контракты больше не cодержат тип address, но все еще могут быть явно преобразованы в address или address payable (если у них есть функция receive или fallback payable).

Примечание: преобразование выполняется с использованием address(переменная) и payable(address(переменная)).

Операторы используемые с address

С address доступны следующие операторы: <=, <, ==, !=, >= и >.

7. Методы, возвращающие тип address

msg.sender

msg.sender() возвращает address payable.

Как следует из названия, функция msg.sender возвращает адрес, который инициировал вызов этого смарт-контракта. Однако важно отметить следующее:

msg.sender возвращается в текущем вызове. Он не обязательно возвращает отправителя EOA, который отправил транзакцию.

  • Если смарт-контракт A вызван непосредственно в транзакции отправленной с EOA, то в msg.sender будет адрес EOA.
  • Если смарт-контракт A вызван другим смарт-контрактом B, где B был вызван транзакцией отправленной с EOA, то в msg.sender будет адрес смарт-контракта B.

tx.origin

tx.origin() возвращает address.

tx.origin возвращает EOA адрес отправителя изначальной транзакции. Таким образом, возвращается полная цепочка вызовов.

block.coinbase

block.coinbase() возвращает address payable.

Адрес добытчика текущего блока, т.е. адрес получателя платы за текущий блок и вознаграждения за блок.

ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address)

ecrecover восстанавливает адрес, связанный с открытым ключом, из подписи эллиптической кривой или возвращает ноль при ошибке. Параметры функции соответствуют значениям ECDSA подписи:

  • r = первые 32 байта подписи
  • s = вторые 32 байта подписи
  • v = последний 1 байт подписи

ecrecover возвращает address, а не address payable.

8. Нулевой адрес

После написания смарт-контракта он развертывается в сети Ethereum с помощью специальной транзакции. Однако транзакция подразумевает наличие отправителя и получателя. Поэтому эта специальная транзакция должна быть отправлена на специальный адрес.

Так какой же адрес следует указывать в качестве получателя, когда речь идет о создании смарт-контракта?

Создание смарт-контракта в Ethereum предполагает создание специальной транзакции, адресом назначения которой является адрес: 0x00000000000000000000000000000000000000000000000000, также известный как нулевой адрес.

Виртуальная машина Ethereum (EVM) понимает, что транзакция направлена на создание нового смарт-контракта, если в поле получателя указан этот нулевой адрес. Этот адрес также имеет длину 20 байт, но содержит только пустые байты 0x0.

В сети Ethereum майнеры выполняют такую транзакцию (содержащую нулевой адрес), как инструкцию по созданию нового смарт-контракта.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *