менеджер адресов btcd: addrmgr
менеджер адресов btcd: addrmgr

Обзор

Чтобы поддерживать одноранговую сеть Биткойн, необходим источник адресов, к которым узлы могут подключаться при их входе и выходе. Протокол Биткойн обеспечивает getaddr и addr Сообщения позволяют узлам передавать друг другу известные адреса. Однако должен быть механизм для хранения этих результатов и выбора узлов из них. Также важно отметить, что удаленным узлам нельзя доверять в отправке действительных узлов, и при этом они не гарантируют, что они не попытаются предоставить вам только те узлы, которые они контролируют, для злонамеренных целей.

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

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

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

btcd это использование Go Реализация полного узла Биткойн, написанная на языке, который включает в себя инструмент под названием addrmgr сумка,Для управления сетью Биткойнсерединаодноранговый узел(peer)адресная информация。addrmgr Отвечает за обнаружение, отслеживание и поддержание адресов активных узлов в сети, чтобы гарантировать, что узлы могут эффективно подключаться и обмениваться данными. Далее идет пара btcd середина addrmgr подробное введение.

addrmgr Пакет основной Для управления сетью Биткойнсерединаадрес узла。Он обеспечивает добавление、удалить、выбиратьи Функция обновления адреса узла,Убедитесь, что узлы могут обнаруживать другие узлы и подключаться к ним.,Это поддерживает подключение к сети. И предоставляет следующие функции:

  1. обнаружение адреса:проходить DNS Начальные узлы, жестко запрограммированный список начальных узлов или получение адресов от других узлов.
  2. Выбор адреса:по определенной стратегиивыбирать Подходящие узлы для подключения。
  3. Обновление адреса:В зависимости от статуса подключения узлаивремя ответа,Динамически обновляйте информацию об адресе узла.
  4. Адресное хранилище:Постоянное хранение информации об адресе узла,Чтобы существующее могло быстро восстановиться при перезапуске узла.

основная структура

существовать btcd середина,addrmgr Основная структура AddrManager,Он управляет всемадрес узлаинформация。Ниже приводится AddrManager Определение структуры:

Язык кода:go
копировать
type AddrManager struct {
	mtx            sync.RWMutex
	peersFile      string
	lookupFunc     func(string) ([]net.IP, error)
	rand           *rand.Rand
	key            [32]byte
	addrIndex      map[string]*KnownAddress // address key to ka for all addrs.
	addrNew        [newBucketCount]map[string]*KnownAddress
	addrTried      [triedBucketCount]*list.List
	started        int32
	shutdown       int32
	wg             sync.WaitGroup
	quit           chan struct{}
	nTried         int
	nNew           int
	lamtx          sync.Mutex
	localAddresses map[string]*localAddress
	version        int
}

Разбор полей

AddrManager Структура определяет одновременно безопасный менеджер адресов для кэширования потенциальных существующих узлов сети Биткойн-середина. Ниже приводится описание функций каждого поля:

Язык кода:go
копировать
type AddrManager struct {
	mtx            sync.RWMutex
	peersFile      string
	lookupFunc     func(string) ([]net.IP, error)
	rand           *rand.Rand
	key            [32]byte
	addrIndex      map[string]*KnownAddress // address key to ka for all addrs.
	addrNew        [newBucketCount]map[string]*KnownAddress
	addrTried      [triedBucketCount]*list.List
	started        int32
	shutdown       int32
	wg             sync.WaitGroup
	quit           chan struct{}
	nTried         int
	nNew           int
	lamtx          sync.Mutex
	localAddresses map[string]*localAddress
	version        int
}

Описание поля

  1. mtx (sync.RWMutex):блокировка чтения-записи,для защиты AddrManager Параллельный доступ к внутренним данным.
  2. peersFile (string):Путь к файлу для хранения адреса узла,Используется для сохранения данных узла.
  3. lookupFunc (func(string) ([]net.IP, error)):Функция разрешения доменного имени,Предлагает преобразование доменных имен в IP-адресную функцию.
  4. rand (*rand.Rand):генератор случайных чисел,Используется для случайного выбора адресов узлов.
  5. key (32byte):ключ шифрования,используется для Выбор криптографические операции с адресом.
  6. addrIndex (mapstring*KnownAddress):индекс адреса,Сопоставьте адресную строку с KnownAddress Структура для быстрого поиска и доступа ко всем известным адресам.
  7. addrNew (newBucketCountmapstring*KnownAddress):Новый массив адресов,Каждый сегмент содержит сопоставление адресов.,Используется для хранения вновь полученного адреса узла.
  8. addrTried (triedBucketCount*list.List):Массив сегментов попыток адресации,Каждый сегмент содержит связанный список адресов.,Используется для хранения адреса узла, к которому была предпринята попытка подключения.
  9. started (int32):Бит флага,выражать AddrManager Оно началось?
  10. shutdown (int32):Бит флага,выражать AddrManager Он был закрыт?
  11. wg (sync.WaitGroup):используется дляжду всех goroutine Заканчивать.
  12. quit (chan struct{}):Закрыть канал сигнала,используется дляуведомить goroutine Перестаньте бежать.
  13. nTried (int):Количество узлов, к которым пытались подключиться。
  14. nNew (int):Количество вновь приобретенных узлов。
  15. lamtx (sync.Mutex):блокировка локального адреса,для защиты localAddresses одновременного доступа.
  16. localAddresses (mapstring*localAddress):сопоставление локальных адресов,Сохраните информацию об адресе локального узла.
  17. version (int):номер версии,используется дляотслеживать AddrManager версия.

основной метод

  1. Создать диспетчер адресовfunc New(dataDir string, lookupFunc func(string) ([]net.IP, error)) *AddrManager:Загрузить информацию об адресе узла по указанному пути,и создайте новый менеджер адресов.
  2. Добавить адрес
    • func (a *AddrManager) AddAddresses(addrs []*wire.NetAddressV2, srcAddr *wire.NetAddressV2):Добавляйте несколько адресов одновременно и безопасно
    • func (a *AddrManager) AddAddress(addr, srcAddr *wire.NetAddressV2):Увеличение адресов одновременно и безопасно
    • func (a *AddrManager) AddAddressByIP(addrIP string) error:проходитьip:portметод добавления адреса
  3. Получить количество известных адресовfunc (a *AddrManager) NumAddresses() int:Возвращает количество известных адресов。
  4. Выберите адресfunc (a *AddrManager) GetAddress() *KnownAddress:Возвращает адрес, который должен быть маршрутизируемым。этовыбиратьвозможный адрес изсерединаслучайныйвыбиратьодин,Отдавайте предпочтение тем, которые в последнее время не использовались.
  5. адрес подключенияfunc (a *AddrManager) Connected(addr *wire.NetAddressV2)
  6. Адрес тега доступенfunc (a *AddrManager) Good(addr *wire.NetAddressV2)

Я участвую в последнем конкурсе эссе для специального учебного лагеря Tencent Technology Creation 2024.,Приходите и разделите со мной главный приз!

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.