Прежде чем заняться изучением смарт-контрактов Ethereum, необходимо подготовить рабочую среду — установить операционную систему (ОС) Ubuntu, клиента Geth сети Ethereum, а также другое необходимое программное обеспечение (ПО). Мы могли бы приступить к работе сразу в какой-либо интегрированной среде разработки (IDE, Integrated Development Environment), например, Remix. Возможно, это был бы самый быстрый путь к изучению смарт-контрактов Solidity. Однако для того, чтобы глубже разобраться в работе Ethereum, мы начнем с базовых инструментов. Для изучения Ethereum можно арендовать виртуальный или облачный сервер у одного из провайдеров. Еще вариант — установить Ubuntu на свой настольный компьютер или на виртуальную машину VMware Workstation, либо аналогичную. Описание процесса установки Ubuntu мы описывать не будем, т.к. в интернете есть немало достаточно подробных руководств. При аренде виртуального или облачного сервера провайдер обязательно поможет установить на него ОС. Учтите, что вам нужна 64-разрядная Ubuntu версии 20.04 или более новой версии. Для работы потребуется виртуальный или физический сервер в такой конфигурации: От 4 ядер процессора (CPU) с тактовой частотой от 2 ГГц; Оперативная память от 2 Гбайт; Диск SSD объемом от 20 Гбайт. Конфигурация сервера влияет на скорость майнинга новых блоков. Чтобы было удобно работать, эта скорость не должна быть слишком низкой.  Сразу после установки Ubuntu обновите пакеты при помощи команды apt:$ sudo apt update$ sudo apt upgrade  Если в Ubuntu Server обновилось ядро, может потребоваться перезагрузка ОС. Сообщение об этом вы увидите при подключении к консоли: *** System restart required ***  В этом случае перед продолжением работы выполните перезагрузку: $ sudo shutdown -r now Пакеты Ubuntu можно также обновлять также через менеджер обновлений в графическом интерфейсе. Обновление пакетов нужно делать с правами пользователя root, используя sudo. Свой первый узел сети Ethereum мы будем делать на базе программы Go Ethereum (https://geth.ethereum.org). Эта программа представляет собой официальную реализацию протокола Ethereum. Она написана на Go и доступна в виде программы Geth. С помощью Geth можно сделать полнофункциональный узел сети Ethereum или его упрощенные варианты. Для работы с узлом Geth можно использовать интерфейс командной строки, а также программный интерфейс (API, Application Programming Interface) JSON-RPC, доступный через протоколы HTTP и WebSocket, а также через механизм коммуникации процессов Unix  (IPC, Inter-Process Communication).  Используя этот интерфейс и различные фреймворки, вы сможете создавать программы, работающие с узлами Ethereum, практически на всех современных языках программирования. Клиент Geth может работать на платформах, где имеется Go. Это, например, Linux, Mac OSX, Windows, Raspberry Pi, Android OS, iOS. На странице загрузки доступны реализации для Linux, macOS и Windows, а также исходные коды Geth. Итак, перейдем к установке программы Geth. Чтобы установить эту программу, добавьте персональный пакет архивов PPA (Personal Package Archives) и установите стабильную версию пакета go-ethereum:$ sudo add-apt-repository -y ppa:ethereum/ethereum$ sudo apt-get update$ sudo apt-get install ethereum После установки проверьте версию Geth:$ geth versionGethVersion: 1.10.13-stableGit Commit: 7a0c19f813e285516f4b525305fd73b625d2dec8Architecture: amd64Go Version: go1.17.2Operating System: linuxGOPATH=GOROOT=go   Как видите, установлен Geth стабильной версии 1.10.13, который работает в Go версии 1.17.2. В процессе подготовки нам будут нужны различные файлы. Чтобы не набирать их содержимое каждый раз вручную, загрузите весь репозиторий из GitHub. Для этого сначала установите git: $ sudo apt install git Далее  скопируйте их из репозитория GitHub с помощью следующей команды: $ git clone https://github.com/AlexandreFrolov/sol01.git  Для обновления файлов из репозитория воспользуйтесь командой git pull: $ git pull origin main В вашем домашнем каталоге будет создано дерево каталогов sol01, в котором вы найдете каталоги к урокам. Например, файлы третьего урока находятся в каталоге sol01/les03. Для того чтобы быстро освоить процесс создания смарт-контрактов, нам нужен блокчейн. Вначале вы создадите приватный блокчейн на вашем сервере, так как с ним проще всего работать. Далее вы будете использовать тестовую сеть Rinkeby, работающую в точности как основная сеть Ethereum и пригодную для отладки «настоящих» контрактов Solidity перед их публикацией в Ethereum. Откройте свой домашний каталог и проверьте, что в каталоге ~/sol01/les03 находится файл genesis.json, загруженный из только что упомянутого репозитория GitHub (листинг 3.1.). Листинг 3.1. Файл ~/sol01/les03/genesis.json{  "config": {     "chainId": 98760,     "homesteadBlock": 0,     "eip150Block": 0,     "eip155Block": 0,     "eip158Block": 0,     "byzantiumBlock": 0,     "constantinopleBlock": 0,      "istanbulBlock": 0,     "petersburgBlock": 0  },  "difficulty": "10",  "gasLimit": "5100000",  "alloc": {}} Этот файл описывает первичный блок (genesis block) цепочки блоков — самый первый блок блокчейна. Мы создаем наш собственный приватный блокчейн, поэтому о первом блоке должны позаботиться сами. Блок config файла genesis.json содержит переменные конфигурации сети Ethereum. В поле chainId находится идентификатор блокчейна. Он используется для защиты от репликации, т.е. от неавторизованных действий пользователей, пытающихся действовать от имени настоящего отправителя данных. Если речь идет о главной сети Ethereum, то ее идентификатор равен 1. Идентификатор тестовой сети Rinkeby равен 4. При создании нашей приватной сети мы можем указать любое значение, отличное от известных. Мы выбрали значение 98760. Значение 0 в поле homesteadBlock указывает на то, что мы будем использовать релиз сети Ethereum под названием Homestead. Homestead представляет собой второй релиз сети Ethereum (первый релиз назывался Frontier). Нулевое значение этого параметра используется и в основной сети Ethereum. Немного о параметрах с префиксом EIP. При реализации Homestead был обновлен протокол, причем без обратной совместимости с предыдущим релизом Ethereum. Соответствующие изменения отражены в документах «Предложения по улучшению Ethereum» (Ethereum Improvement Proposals, EIPs), опубликованных на сайте https://eips.ethereum.org/. Реализация изменений может потребовать выполнения так называемой процедуры хардфорка (hard-forking), или обновления ПО узлов. В результате этой процедуры может меняться структура блока, появляется возможность использовать ранее недоступные блоки и вносить различные изменения в протокол. Так как мы не будем делать хардфорк, то установим значения соответствующих параметров eip150Block, eip155Block и eip158Block равными нулю. Аналогично, установим равными нулю значения параметров byzantiumBlock, constantinopleBlock,  istanbulBlock и petersburgBlock. В основной сети такие параметры задают номера блоков, при достижении которых был изменен протокол. Параметр difficulty важен для нас в практическом смысле. Этот параметр имеет прямое влияние на время генерации новых блоков блокчейна. Для нашего «учебного» блокчейна мы установим очень маленькое значение этого параметра, равное 10, чтобы скорость добавления новых блоков была приемлемой даже на виртуальных серверах небольшой производительности. С помощью параметра gasLimit мы задаем в рамках блокчейна предел расхода так называемого газа (Gas).  Газ Ethereum представляет собой расходный ресурс, который тратится на выполнение таких операций, как отправка транзакций, публикация и выполнение контрактов и т.п. Далее мы расскажем об этом подробнее. В нашей приватной тестовой сети мы устанавливаем достаточно большое значение, чтобы не возникали ограничения при запуске тестовых программ. Параметр alloc позволяет при инициализации блокчейна создать кошельки и заранее наполнить их тестовым эфиром. В наших примерах мы не будем использовать эту возможность. Теперь создайте в своем домашнем каталоге подкаталог node1:$ cd$ mkdir node1 В каталоге node1 будут располагаться данные блокчейна. Теперь перейдем к созданию нашего приватного блокчейна. Прежде всего создайте новый аккаунт: $ geth --datadir ~/node1 account new При создании аккаунта будет запрошен пароль, который нужно сохранить в безопасном месте: $ geth --datadir ~/node1 account new INFO [12-08|06:18:33.646] Maximum peer count                       ETH=50 LES=0 total=50 INFO [12-08|06:18:33.647] Smartcard socket not found, disabling    err="stat /run/pcscd/pcscd.comm: no such file or directory" Your new account is locked with a password. Please give a password. Do not forget this password.Password:Repeat password:Your new key was generated Public address of the key:   0x2cF942e02baAC0BB883147873943666e397CAe03 Path of the secret key file: /home/developer/node1/keystore/UTC--2021-12-08T14-18-43.611281385Z--2cf942e02baac0bb883147873943666e397cae03 - You can share your public address with anyone. Others need it to interact with you.- You must NEVER share the secret key with anyone! The key controls access to your funds!- You must BACKUP your key file! Without the key, it's impossible to access account funds!- You must REMEMBER your password! Without the password, it's impossible to decrypt the key! Команда account new выведет на консоль параметр Public address of the key — так называемый адрес узла. В нашем случае это адрес 0x2cF942e02baAC0BB883147873943666e397CAe03. Мы будем указывать его в различных командах. Также обратите внимание на путь к файлу с секретным ключом Path of the secret key file. Этот файл необходим для выполнения транзакций. Его можно скопировать и хранить в безопасном месте. Параметр datadir команды geth указывает путь к рабочему каталогу. Мы используем каталог node1, расположенный в вашем домашнем каталоге. После создания аккаунта нам нужно выполнить инициализацию узла: $ geth --datadir ~/node1 init ~/sol01/les03/genesis.json Здесь мы с помощью параметра datadir указали путь к рабочему каталогу. Параметр init задает путь к файлу первичного блока genesis.json. Команда выполнит инициализацию и выведет на консоль результаты своей работы: INFO [12-08|06:19:56.127] Maximum peer count                       ETH=50 LES=0 total=50 INFO [12-08|06:19:56.127] Smartcard socket not found, disabling    err="stat /run/pcscd/pcscd.comm: no such file or directory" INFO [12-08|06:19:56.128] Set global gas cap                       cap=50,000,000 INFO [12-08|06:19:56.128] Allocated cache and file handles         database=/home/developer/node1/geth/chaindata cache=16.00MiB handles=16 INFO [12-08|06:19:56.146] Writing custom genesis block INFO [12-08|06:19:56.146] Persisted trie from memory database      nodes=0 size=0.00B time="14.424µs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B INFO [12-08|06:19:56.147] Successfully wrote genesis state         database=chaindata                            hash=a5e5bc..3f490e INFO [12-08|06:19:56.147] Allocated cache and file handles         database=/home/developer/node1/geth/lightchaindata cache=16.00MiB handles=16 INFO [12-08|06:19:56.151] Writing custom genesis block INFO [12-08|06:19:56.152] Persisted trie from memory database      nodes=0 size=0.00B time="5.185µs"  gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B INFO [12-08|06:19:56.153] Successfully wrote genesis state         database=lightchaindata                       hash=a5e5bc..3f490e Далее для работы с узлом вам нужно будет открыть две консоли. Чтобы запустить узел, выполните в первой консоли следующую команду: $ geth --datadir ~/node1 --ipcpath "~/node1/geth.ipc" --nodiscover --mine --miner.threads 1 --maxpeers 0 --verbosity 3 --networkid 98760 console Здесь предполагается, что вы подключились к консоли пользователем developer.  На экране появится множество сообщений о ходе инициализации. В ходе этого процесса будет запущена генерация так называемого файла DAG. Он содержит направленный ациклический граф (Directed Acyclic Graph,  DAG).  Файл DAG используется для добавления блоков в Ethereum с помощью алгоритма с названием Ethash. Его размер может составлять несколько Гбайт. Размер этого файла увеличивается по мере роста сети Ethereum.  При первом запуске узла нужно дождаться завершения процесса генерации: Welcome to the Geth JavaScript console!  instance: Geth/v1.10.13-stable-7a0c19f8/linux-amd64/go1.17.2 coinbase: 0x2cf942e02baac0bb883147873943666e397cae03 at block: 0 (Wed Dec 31 1969 16:00:00 GMT-0800 (PST))  datadir: /home/developer/node1  modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0  To exit, press ctrl-d or type exit > INFO [12-08|06:22:31.712] Generating DAG in progress               epoch=0 percentage=0 elapsed=1.076s INFO [12-08|06:22:32.749] Generating DAG in progress               epoch=0 percentage=1 elapsed=2.114s INFO [12-08|06:22:33.123] Mapped network port                      proto=tcp extport=30303 intport=30303 interface="UPNP IGDv1-IP1" INFO [12-08|06:22:33.793] Generating DAG in progress               epoch=0 percentage=2 elapsed=3.158s INFO [12-08|06:22:34.848] Generating DAG in progress               epoch=0 percentage=3 elapsed=4.213s … INFO [12-08|06:29:35.171] Commit new mining work                   number=69 sealhash=5549e6..4d0eba uncles=0 txs=0 gas=0 fees=0 elapsed="150.228µs" INFO [12-08|06:29:43.723] Successfully sealed new block            number=69 sealhash=5549e6..4d0eba hash=de53cc..05e38c elapsed=8.551s INFO [12-08|06:29:43.723] 🔗 block reached canonical chain          number=62 hash=dd9c17..4f1a18 INFO [12-08|06:29:43.723] 🔨 mined potential block                  number=69 hash=de53cc..05e38c В зависимости от производительности вашего виртуального или физического сервера генерация файла DAG может занять несколько минут или дольше. Текущий размер блока и прогнозы по его росту можно узнать, например, на сайте https://minerstat.com/dag-size-calculator?lang=ru. На момент создания этого урока файл DAG для основной сети Ethereum был размером 4.5 Гбайт. Чем больше файл DAG, тем труднее выполнить майнинг.  Для ускорения майнинга используются видеокарты. При этом данные DAG должны полностью поместиться в память видеокарты. Так как запуск узла будет выполняться часто, мы подготовили в репозитории пакетный файл для запуска ~/sol01/les03/start_node.sh (листинг 3.2.). Листинг 3.2. Файл ~/sol01/les03/start_node.shgeth --datadir ~/node1 --ipcpath "~/node1/geth.ipc" --nodiscover --mine --miner.threads 1 --maxpeers 0 --verbosity 3 --networkid 98760 console Запускайте его следующей командой: $ bash ~/sol01/les03/start_node.sh Чтобы завершить работу узла, нажмите в окне консоли комбинацию клавиш Ctrl+D. Расскажем о параметрах geth, которые мы использовали при запуске узла. Эти параметры были выбраны исходя из назначения нашего узла — мы создаем узел для учебной приватной сети Ethereum. Когда вы будете создавать узел для работы с тестовой сетью Rinkeby или с основной сетью Ethereum, нужно будет указывать другие параметры. Чтобы получить краткую справку по всем командам и параметрам geth, запустите ее следующим образом: $ geth -h С параметром datadir, который указывает путь к каталогу блокчейна, вы уже знакомы. При запуске узла укажите тот же каталог, что мы использовали при инициализации приватного блокчейна. Для явного указания пути к файлу IPC мы использовали параметр ipcpath. Параметр nodiscover отключает поиск других узлов сети. Этот поиск не нужен, так как пока будем работать только с одним узлом блокчейна. Мы также указали значение параметра maxpeers, равное нулю. Таким способом мы фактически отключили обмен по сети между узлами нашего блокчейна. С помощью параметра mine мы запускаем так называемый майнинг — процесс создания новых блоков в нашем блокчейне. Это необходимо, так как без появления новых блоков выполнение транзакций и публикация смарт-контрактов будут невозможны. Параметр minerthreads указывает количество потоков, используемых для майнинга. Если ресурсы вашего сервера позволяют и там установлен многоядерный процессор, то для ускорения майнинга можно увеличить значение этого параметра. Очень важный параметр — networkid. Это идентификатор сети. Здесь мы должны указать уникальный идентификатор 98760 нашего приватного блокчейна. Параметр verbosity задает детализацию журнала:  ·         0 — не записывать данные в журнал;  ·         1 — записывать сообщения об ошибках;  ·         2 — записывать предупреждающие сообщения;  ·         3 — записывать информационные сообщения;  ·         4 — записывать отладочную информацию;  ·         5 — записывать детальную информацию. По умолчанию используется значение 3. При запуске geth мы указываем команду console. Эта команда запускает интерактивную консоль JavaScript, где мы сможем выдавать команды. Теперь откройте вторую консоль и введите в ней следующую команду: $ geth --datadir ~/node1 --networkid 98760 attach Здесь необходимо указать те же значения параметров datadir и networkid, что и при запуске узла. Команда attach подключается к узлу и запускает интерактивную консоль JavaScript. В параметре datadir нам нужно указать полный путь к рабочему каталогу нашего приватного блокчейна. Эта команда откроет консоль geth и подключится к вашему приватному узлу. Вы увидите на консоли адрес вашего узла в строке coinbase: Welcome to the Geth JavaScript console!  instance: Geth/v1.10.12-stable-6c4dc6c3/linux-amd64/go1.17.2 coinbase: 0xf82e93ef1de726ac0bbbb64f8efa3ffa0d5a393b at block: 271 (Mon Nov 29 2021 01:01:06 GMT-0800 (PST))  datadir: /home/developer/node1  modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0 To exit, press ctrl-d or type exit Команду подключения вы найдете в файле репозитория ~/sol01/les03/attach_node.sh (листинг 3.3.). Листинг 3.3. Файл ~/sol01/les03/attach_node.shgeth --datadir ~/node1 --networkid 98760 attach Запустите этот файл, и вы увидите приглашение консоли geth: $ bash ~/sol01/les03/attach_node.sh  Welcome to the Geth JavaScript console!  instance: Geth/v1.10.12-stable-6c4dc6c3/linux-amd64/go1.17.2 coinbase: 0x9eb9b6147be101260597a0e011156355ebff9a81 at block: 2787 (Tue Nov 30 2021 05:03:19 GMT-0800 (PST))  datadir: /home/frolov/node1  modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0  To exit, press ctrl-d or type exit > Чтобы выйти из консоли, можно ввести команду exit или нажать комбинацию клавиш Ctrl+D. Введите в этом приглашении команду web3.eth.accounts: > web3.eth.accounts  Вы увидите идентификаторы (адреса) аккаунтов, которые мы создали ранее. У вас эти идентификаторы будет другие. Попробуйте также ввести команду web3.version. Эта команда позволяет посмотреть версию фреймворка Web3, с помощью которого мы будем работать с контрактами, версию geth, а также номер сети. Мы задали номер нашей приветной сети, равный 98760. Для стабильного релиза Geth версии 1.10.13 на консоль будет выведено сообщение: > web3.version{  api: "0.20.1",  ethereum: undefined,  network: "98760",  node: "Geth/v1.10.15-stable-8be800ff/linux-amd64/go1.17.5",  whisper: undefined,  getEthereum: function(callback),  getNetwork: function(callback),  getNode: function(callback),  getWhisper: function(callback)} При запуске узла мы автоматически запускаем майнинг. Текущий баланс вы можете проверить при помощи следующей команды: > web3.fromWei( eth.getBalance(eth.coinbase) )0 Сразу после инициализации сети баланс нашего аккаунта равен нулю. Однако по мере того, как будут «добыты» новые блоки, баланс будет расти: > web3.fromWei( eth.getBalance(eth.coinbase) )15 В первой консоли, где мы запустили узел, добавление каждого блока будет отмечено такими сообщениями: INFO [02-13|09:37:10.577] 🔗 block reached canonical chain          number=45 hash=924ce1…d8b5a2 INFO [02-13|09:37:10.577] 🔨 mined potential block                  number=52 hash=a80a36…153593 INFO [02-13|09:37:10.577] Commit new mining work                   number=53 sealhash=3acb6c…0ecd19 uncles=0 txs=0 gas=0 fees=0 elapsed=130.557µs INFO [02-13|09:37:11.223] Successfully sealed new block            number=53 sealhash=3acb6c…0ecd19 hash=14e0fa…575494 elapsed=645.999ms INFO [02-13|09:37:11.223] 🔗 block reached canonical chain          number=46 hash=c5ff7a…da8069 INFO [02-13|09:37:11.224] 🔨 mined potential block                  number=53 hash=14e0fa…575494 INFO [02-13|09:37:11.224] Commit new mining work                   number=54 sealhash=96235b…f3fc50 uncles=0 txs=0 gas=0 fees=0 elapsed=124.053µs INFO [02-13|09:37:11.723] Successfully sealed new block            number=54 sealhash=96235b…f3fc50 hash=e5438e…2f6f2e elapsed=498.975ms С помощью команд miner.start и miner.stop можно запускать и останавливать майнинг. При ручном запуске майнинга нужно указать количество потоков для поиска новых блоков: > miner.start(4) Здесь мы запускаем майнинг на четырех ядрах виртуальной машины. Перед запуском проверьте, сколько ядер доступно на вашем сервере. Заметим, что при отладке смарт-контрактов процесс майнинга останавливать не нужно, иначе ваш узел не сможет обрабатывать транзакции, публиковать контракты и вызывать методы контрактов. Тем не менее, вы всегда сможете остановить майнинг с помощью такой команды: > miner.stop() Если скорость майнинга недостаточна и вам приходится ждать появления новых блоков более 20-30 секунд, попробуйте увеличить размер оперативной памяти и количество процессорных ядер на виртуальной машине. Облачные хостинги, как правило, позволяют сделать это очень просто через Web-интерфейс вашего личного кабинета. Для завершения работы Geth введите в приглашении команду exit: > exit Вы скорее всего будете работать с узлами Ethereum с помощью скриптов JavaScript, работающих под управлением Node.js. При этом используется фреймворк Web3, а также узлы Ganache CLI и Geth. Устанавливать Node.js в ОС Ubuntu нужно с помощью скрипта менеджера управления версиями NVM (Node Version Manager).  Эта процедура описана здесь:  https://github.com/nodesource/distributions/blob/master/README.md. Прежде всего установите программу curl и скопируйте скрипт NVM из репозитория Github: sudo apt install curlcurl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -sudo apt-get install -y nodejs После установки проверьте версии Node.js и npm: $ node -vv16.13.1$ npm -v8.1.2 В нашем курсе мы будем изучать интегрированную среду разработки (Integrated Development Environment, IDE) Truffle, очень популярную среди программистов Solidity. Она проста в установке и удобна на практике. Вначале установите необходимые пакеты: $ sudo apt install build-essential  Для установки Truffle введите команду: $ sudo npm install -g truffle После установки проверьте версию Truffle: $ truffle versionTruffle v5.4.32 (core: 5.4.32)Solidity v0.5.16 (solc-js)Node v16.13.2Web3.js v1.5.3 На консоли появится версия Truffle, а также версия компилятора Solidity solc-js, версия Node.js и пакета Web3.js. Подробная информация об установке и использовании Truffle есть на сайте http://truffleframework.com/.  В нашем курсе мы будем использовать не только Geth, но и программу Ganache CLI, очень удобную для создания тестового узла Ethereum. С помощью Ganache CLI  можно очень легко создать персональный блокчейн, удобный для отладки смарт-контрактов, в том числе с помощью такого инструмента, как Truffle. Установить Ganache CLI очень просто: $ sudo npm install -g ganache-cli После установки запустите Ganache CLI в консольном окне при помощи такой команды: $ ganache-cli Программа создаст при запуске 10 аккаунтов, причем у каждого аккаунта на счету уже будет 100 Ether. Информацию об аккаунтах и вашей приватной сети она выведет на консоль:Ganache CLI v6.12.2 (ganache-core: 2.13.2) Available Accounts ================== (0) 0x7068e1737ACb237361c27CdD2fc07D360c6E7fb1 (100 ETH) (1) 0x8208f2E5Ac0C05925Ba0f78B01ED17f0ee766d3D (100 ETH) (2) 0x915b48A6DfA293c75D925F6d2A2F2F78c8B392EB (100 ETH) (3) 0x7FEFFD1959c47ed2d1b28Cbbabe1a6450029afa8 (100 ETH) (4) 0xeD11B63a6E06a8deA81E844FA490eB3af4858506 (100 ETH) (5) 0xC04cEf12b37138C6DBfA22B57D15FF91543507A4 (100 ETH) (6) 0x0b56E6D8d72300066B4349dcF1b687eBa1B1Ceb5 (100 ETH) (7) 0x17EF124e61b2cc14B1c5df9385Cd3c38B66EBA3b (100 ETH) (8) 0xCacFcbBC9db0eDB04f2DA4a525D23d7373593a49 (100 ETH) (9) 0xF101d652AE265dF03a7fb276da021eCBC22D3408 (100 ETH)  Private Keys ================== (0) 0x5712b6f3f2cc9a0a65aa4aee6312c03b44d0f79287a285a56e7133ee81afcb75 (1) 0x31ba88967f3c568e2f800916a1691dd5026eb137f2671ed095de4a6f2d4f5b58 (2) 0x2b822789e8670fc9302eb4f734c4e1b9ff75039fa14a3cefefa38bc39609084f (3) 0x7fca0a698c7a39af2d06a35f7a230403c550f76f352d976a28e8e9f74a1b6c3d (4) 0x490f3556f258b1fb2ab86ee249ce31c8cd1108e497b6f192866d78d30d08ca9b (5) 0x4cf5a21253198710362a80bf0f43a058075b5a9ec443531023d9531b7f4b1869 (6) 0x8f5579e651697162856dd08618d7efd152cd5e51715445d558d3e78c9a85afad (7) 0x26a9bdea6620c42b405903301624f6ba5eed9878ee7f443cb500ce02b57b0e86 (8) 0x94ace2c51779e337ddb5411a4b3b6ebbc88d2fd137be419c723f18c9efdc4297 (9) 0x57212b11f4a3b80206f11f3f4939166765626dafee541b5554b733a09317d327  HD Wallet ================== Mnemonic:      enough like enjoy where such they sword matrix birth water orange amateur Base HD Path:  m/44'/60'/0'/0/{account_index}  Gas Price ================== 20000000000 Gas Limit ================== 6721975  Call Gas Limit ================== 9007199254740991 Listening on 127.0.0.1:8545 Нам будут интересны адреса созданных аккаунтов, а также тот факт, что вы можете создать соединение с вашим локальным узлом на порту 8545, как и в случае использования Geth. Для подключения к узлу Ganache CLI запустите в отдельном консольном окне команду:$ geth attach http://127.0.0.1:8545 После этого посмотрите список аккаунтов: > web3.eth.accounts  > Как видите, уже есть 10 аккаунтов, готовых для работы. Вы можете убедиться, что на этих аккаунтах уже есть средства в размене 100 Ether: > web3.fromWei( eth.getBalance("0x3b9067d86ee5bd2a8ea814ea337fe8c68589b819") )100 Запустите в первом консольном окне узел Geth:$ bash ~/sol01/les03/start_node.sh Далее для установки пакета web3.js, представляющего собой API Ethereum для JavaScript, используйте команду: npm install web3 Для проверки результатов установки запустите консоль Node.js командой node: $ node> Убедитесь, что у вас запущен узел вашей локальной сети Ethereum на базе Ether или Ganache CLI. Далее в консольном приглашении Node.js введите следующие команды: > var Web3 = require('web3')undefined > Web3.version'1.7.0' Далее нужно подключиться к узлу Ethereum нашей приватной сети. Это можно сделать с помощью одного из так называемых провайдеров. Узел на базе Geth доступен с применением протокола IPC. Здесь нам потребуется провайдер Web3.providers.IpcProvider. Введите в приглашении node следующие команды:> const net = require('net');undefined> const Web3 = require('web3');undefined> const web3 = new Web3(new Web3.providers.IpcProvider("/home/developer/node1/geth.ipc", net));undefined > await web3.eth.getAccounts();[  '0x9EB9b6147BE101260597a0E011156355ebfF9A81',  '0x651895A7f98F34bFe3FC544C001e0373EadfF136']> В результате на консоли появится список аккаунтов, созданных при помощи Geth. Для получения списка аккаунтов, созданных при запуске Ganache CLI, потребуется провайдер Web3.providers.HttpProvider (с использованием протокола HTTP). Введите в приглашении node такие команды: >  var Web3 = require('web3') undefined > var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); undefined > await web3.eth.getAccounts(); [   '0xC45cb6355FE0AcdA9d0b6b6750e689b082f3743f',   '0xd56B6c181Dad6ea9a455813065bf56EaFb12D582',   '0x9D6351707Ef4910214605d331b2ecA9764f82542',   '0xF8DAC793B4aFF4F7c82F81Ea4E3EF51b6422CB50',   '0xC5A7aeD0b0Dcc460F2267F4248C055aB70c0035b',   '0xFf7bfa85784820E574b77dbE401056784b92D4fb',   '0x20D365eA672c9BFfE4baaA800D3c6C56B23C063F',   '0xE0840AD4d6733D986083c3b64dDDBe5A30E5db8E',   '0x2132417287567e5D7D5DC2194f96bb6Aca808a9D',   '0x9E994E8616c2765524f6bb859C860c0D53Fe12d7' ] Если в консоли Node.js появился список аккаунтов, значит, все было установлено правильно. С помощью следующей команды можно посмотреть баланс заданного аккаунта в единицах wei и Ether:> await web3.eth.getBalance("0xEa0C5394d72be6623d0ee8bAFfBdd332C70955ac").then(function (balance) { console.log('balance: ', balance, 'wei, ', web3.utils.fromWei(balance, 'ether'), 'ether'); }) balance:  100000000000000000000 wei,  100 ether Для того чтобы компилировать контракты Solidity в командной строке или из ваших скриптов, можно использовать пакетный компилятор solc.  Для установки solc в Ubuntu введите следующие команды: sudo add-apt-repository ppa:ethereum/ethereumsudo apt-get updatesudo apt-get install solc Затем проверьте версию установленного компилятора solc: $ solc --version solc, the solidity compiler commandline interface Version: 0.8.10+commit.fc410830.Linux.g++ Документация по компилятору solc находится здесь. Страница загрузки программы Geth и ее исходных кодов Предложения по улучшению Ethereum Текущий размер файла DAG Описание процедуры установки Node.js Работа с Truffle Репозиторий Ganache Документация по компилятору solc Репозиторий моих исходников на Github Вы подготовили рабочую среду, необходимую для дальнейшего изучения Ethereum и смарт-контрактов Solidity. Вы создали сервер с ОС Ubuntu, установили программы Geth, Node.js, Truffle, Ganache-cli, пакет Web3, а также компилятор solc. Вы также загрузили из репозитория GitHub исходные файлы, необходимые для работы с нашим курсом. Далее вы создали приватный блокчейн, состоящий из одного узла, выполнили инициализацию этого узла и убедились, что в вашем блокчейне работает майнинг. Вы научились запускать свой узел Ethereum на базе Geth и Ganache, а также подключаться к ним в консоли JavaScript. Вы также научились выдавать простейшие консольные команды и теперь готовы для первых экспериментов с вашим приватным блокчейном. Управляющий директор