TODO Syncmode
Как запустить light node с помощью Geth¶
Как скачать, установить и запустить Geth. Охватывает режимы синхронизации, консоль Javascript и многое другое.
Один из самых простых способов сделать это - загрузить, установить и запустить Geth. С Geth мы можем настроить и запустить легкий узел за считанные минуты. Во-первых, вам нужно Установить Geth.
После установки Geth запустить полный узел Ethereum так же просто, как ввести
$ geth
в командную строку (без знака доллара). Пока не делайте этого! Когда вы запустите geth
, Geth:
- Инициализировать локальную копию EVM с пустым состоянием
- Начните загрузку всех блоков в истории Ethereum, начиная с блока 0.
- Воспроизвести все транзакции во всех блоках по порядку, обновляя состояние EVM с каждой транзакцией, пока она не достигнет текущего состояния.
Этот процесс может занять от нескольких часов до дней и требует нескольких сотен ГБ свободного места. А пока мы просто запустим легкий узел в тестовой сети, чтобы познакомиться с тем, как использовать Geth. Для этого нам нужно пройти через несколько важных параметров и инструментов командной строки.
Mainnet и Testnet¶
По умолчанию Geth запускает узел основной сети. Вы можете запустить geth --testnet для запуска полного узла тестовой сети Ropsten. Вы можете запустить узел на Rinkeby, заменив testnet на rinkeby.
Syncmode¶
У Geth есть три syncmode
s.
$ geth --syncmode "full"
$ geth --syncmode "fast"
$ geth --syncmode "light"
"full" запускает полный узел точно так, как вы ожидаете - ваша машина инициализирует локальную копию EVM в исходном чистом состоянии, загружает каждый блок с начала цепочки блоков и выполняет каждую транзакцию в каждом блоке, обновляя состояние EVM, пока не достигнет текущего состояния EVM.
"fast" загружает все блоки, но также загружает недавний снимок состояния EVM от однорангового узла (в настоящее время состояние блоков EVM 64 в прошлом), выполняя транзакции только в самых последних блоках, пока не достигнет текущего состояния EVM . Преимущество "быстрого" состоит в том, что для синхронизации с текущим состоянием требуется гораздо меньше времени; тем не менее, он полагается на однорангового узла полного архивирования для моментального снимка состояния, поэтому он не проверяет все самостоятельно.
Наконец, "light" запускает light node, о котором мы говорили выше.
Подробное объяснение различий между тремя режимами синхронизации см. В этом Ответ на обмен стеками.
Документация и другие параметры командной строки¶
Запуск light node¶
Мы запустим легкий узел тестовой сети, чтобы познакомиться с тем, как управлять узлом и взаимодействовать с ним. Для этого просто запустите
$ geth --testnet --syncmode "light"
Подождите несколько секунд, и, надеюсь, вы получите примерно такой результат:
$ geth --testnet --syncmode "light"
INFO [11-18|14:04:47] Maximum peer count ETH=0 LES=100 total=25
INFO [11-18|14:04:47] Starting peer-to-peer node instance=Geth/v1.8.11-stable/darwin-amd64/go1.10.3
INFO [11-18|14:04:47] Allocated cache and file handles database=/Users/bgu/Library/Ethereum/testnet/geth/lightchaindata cache=768 handles=128
INFO [11-18|14:04:47] Persisted trie from memory database nodes=355 size=51.89kB time=561.839µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [11-18|14:04:47] Initialised chain configuration config="{ChainID: 3 Homestead: 0 DAO: <nil> DAOSupport: true EIP150: 0 EIP155: 10 EIP158: 10 Byzantium: 1700000 Constantinople: <nil> Engine: ethash}"
INFO [11-18|14:04:47] Disk storage enabled for ethash caches dir=/Users/bgu/Library/Ethereum/testnet/geth/ethash count=3
INFO [11-18|14:04:47] Disk storage enabled for ethash DAGs dir=/Users/bgu/.ethash count=2
INFO [11-18|14:04:47] Added trusted checkpoint chain=ropsten block=3375103 hash=9017ab…249e89
INFO [11-18|14:04:47] Loaded most recent local header number=0 hash=419410…ca4a2d td=1048576
INFO [11-18|14:04:47] Starting P2P networking
INFO [11-18|14:04:49] UDP listener up net=enode://3ef47be442520e4708b5ff25e6e213c496046f443f8393ff5e7ec55f1cf27c374e2e93e78235bde651a5734a012a40eacfc16deab762ee0f380b95d117ac530c@[::]:30303
WARN [11-18|14:04:49] Light client mode is an experimental feature
INFO [11-18|14:04:49] RLPx listener up self="enode://3ef47be442520e4708b5ff25e6e213c496046f443f8393ff5e7ec55f1cf27c374e2e93e78235bde651a5734a012a40eacfc16deab762ee0f380b95d117ac530c@[::]:30303?discport=0"
INFO [11-18|14:04:49] IPC endpoint opened url=/Users/bgu/Library/Ethereum/testnet/geth.ipc
INFO [11-18|14:04:51] Mapped network port proto=udp extport=30303 intport=30303 interface="UPNP IGDv1-IP1"
INFO [11-18|14:04:51] Mapped network port proto=tcp extport=30303 intport=30303 interface="UPNP IGDv1-IP1"
INFO [11-18|14:08:55] Block synchronisation started
INFO [11-18|14:08:58] Imported new block headers count=192 elapsed=1.574s number=3375295 hash=62f6b1…95c47f ignored=0
INFO [11-18|14:08:58] Imported new block headers count=192 elapsed=127.088ms number=3375487 hash=ae759b…453ac5 ignored=0
INFO [11-18|14:08:59] Imported new block headers count=960 elapsed=582.125ms number=3376447 hash=4cab62…445b82 ignored=0
INFO [11-18|14:08:59] Imported new block headers count=192 elapsed=169.936ms number=3376639 hash=470614…85ce15 ignored=0
INFO [11-18|14:08:59] Imported new block headers count=384 elapsed=245.745ms number=3377023 hash=dad8ee…2862d2 ignored=0
INFO [11-18|14:08:59] Imported new block headers count=192 elapsed=128.514ms number=3377215 hash=ebcd84…ea26cb ignored=0
INFO [11-18|14:09:00] Imported new block headers count=192 elapsed=125.427ms number=3377407 hash=fca10c…8ed04d ignored=0
INFO [11-18|14:09:00] Imported new block headers count=192 elapsed=109.536ms number=3377599 hash=9aa141…f34080 ignored=0
INFO [11-18|14:09:00] Imported new block headers count=192 elapsed=109.849ms number=3377791 hash=499f2d…e0c713 ignored=0
Примечание. Вы можете не видеть сообщения «Синхронизация блока запущена» и следующие сообщения «Импортированы новые заголовки блоков» в течение нескольких минут или даже часов, если вам особенно не повезло. В это время ваш клиент пытается найти полнофункциональных узлов, готовых обслуживать легких клиентов. В приведенном выше примере по временным меткам мы можем сказать, что моей машине пришлось ждать около четырех минут между началом поиска одноранговых узлов и фактическим поиском однорангового узла для загрузки блоков. В настоящее время это открытый вопрос в сообществе Ethereum - как мы мотивируем людей запускать полные узлы, которые обслуживают легких клиентов?
Когда начнется синхронизация блоков, вашему компьютеру потребуется несколько минут, чтобы догнать последние блоки в цепочке блоков. В этот момент ваш результат будет выглядеть так:
INFO [11-18|16:06:04.025] Imported new block headers count=2 elapsed=6.253ms number=4456862 hash=ce0a0b…6ab128
INFO [11-18|16:06:27.819] Imported new block headers count=2 elapsed=5.982ms number=4456864 hash=04a054…b4f661
INFO [11-18|16:06:34.080] Imported new block headers count=2 elapsed=4.774ms number=4456866 hash=15a43c…efc782
INFO [11-18|16:06:45.464] Imported new block headers count=2 elapsed=5.213ms number=4456868 hash=eb02d5…227564
INFO [11-18|16:07:11.630] Imported new block headers count=2 elapsed=5.835ms number=4456870 hash=67daa7…66892d
На этом этапе сообщения будут приходить только каждые 10-30 секунд, а значение «count» будет выражаться в виде отдельных цифр для каждого сообщения.
Где хранятся данные блокчейна и EVM?¶
После запуска Geth найдите сообщение, которое выглядит как
INFO [11-18|14:04:47] Allocated cache and file handles database=/Users/bgu/Library/Ethereum/testnet/geth/lightchaindata cache=768 handles=128
Путь, следующий за «database =» «, должен сообщить вам, где на вашем компьютере хранятся данные блокчейна. Если вы запускаете полный узел, этот каталог будет содержать все данные о каждом блоке, который когда-либо был зафиксирован в цепочке блоков. Поскольку у нас запущен легкий узел, этот каталог содержит только заголовки блоков.
Здесь стоит подчеркнуть, что на самом низком уровне именно здесь живет блокчейн. Полное содержимое блокчейна и состояние EVM хранятся на каждом полном узле сети Ethereum в каталогах, которые очень похожи на каталог на вашем компьютере.
Присоединение к консоли Javascript¶
Запуск узла бесполезен, если мы действительно не можем с ним взаимодействовать. Например, мы можем захотеть транслировать запросы транзакций или искать данные EVM / блокчейн (например, баланс учетной записи). Geth имеет встроенную консоль Javascript и API Javascript под названием web3js который вы можете использовать для взаимодействия с вашим узлом.
Чтобы использовать консоль Javascript:
- Запустите узел в окне терминала (подойдут как полный, так и light node)
- Найдите сообщение следующего вида:
INFO [11-18|14:04:49] IPC endpoint opened url=/Users/bgu/Library/Ethereum/testnet/geth.ipc
Это сообщение должно появиться в журнале до начала синхронизации блоков.
- Это сообщение указывает путь к конечной точке IPC (межпроцессного взаимодействия). Скопируйте этот путь (в приведенном выше примере это
/Users/bgu/Library/Ethereum/testnet/geth.ipc
). - Откройте новое окно или вкладку терминала и выполните следующую команду:
$ geth attach [your IPC endpoint path]
Это должно открыть консоль Javascript. Теперь мы можем использовать web3js для взаимодействия с узлом.
Вот несколько полезных объектов, предоставляемых этим API. Вы получаете доступ к ним, вводя их в консоль Javascript.
eth.syncing
возвращает объект, если ваш узел был запущен, но не завершил синхронизацию блока, или значениеfalse
, если он либо завершил синхронизацию, либо не был запущен. Если узел все еще синхронизируется, eth.syncing сообщит вам номер последнего блока, данные которого вы получили, а также общее количество блоков в текущей цепочке блоков.net.peerCount
возвращает количество пиров, к которым вы подключены. Если это 0, вам, вероятно, придется либо подождать несколько минут, либо начать поиск решений в Google (это может быть проблема с брандмауэром, сетью или что-то еще).admin.peers
предоставит вам список всех пиров, к которым подключен ваш узел. Если он пуст, значит, ваш узел не подключен ни к каким другим узлам.
Мы также можем использовать web3js для инициализации учетных записей, записи и трансляции запросов транзакций в сеть, поиска остатков на счетах и метаданных и т. Д. Мы рассмотрим эти операции в следующем разделе; А пока попробуйте выполнить следующее, чтобы узнать баланс одной из моих учетных записей в тестовой сети Ropsten:
eth.getBalance('0x85d918c2B7F172d033D190152AEc58709Fb6D048')
# returns 1059286000000000000 as of 11-18-2018. This value is reported in "Wei".
# One Wei is a denomination which is equivalent to 10^-18 ether.
# The balance of this account in ether is about 1.059eth.
Остановка и перезапуск вашего узла¶
Вы можете остановить свой узел в любой момент. Если вы хотите перезапустить узел, Geth потребуется несколько секунд или минут для повторной синхронизации (загрузка блоков и / или заголовков блоков с того места, где он остановился, когда узел в последний раз прекратил работу). Если какие-либо из приведенных выше инструкций не работают, первое, что вам следует сделать, это попробовать перезапустить узел.