Чтобы поддерживать одноранговую сеть Биткойн, необходим источник адресов, к которым узлы могут подключаться при их входе и выходе. Протокол Биткойн обеспечивает getaddr
и addr
Сообщения позволяют узлам передавать друг другу известные адреса. Однако должен быть механизм для хранения этих результатов и выбора узлов из них. Также важно отметить, что удаленным узлам нельзя доверять в отправке действительных узлов, и при этом они не гарантируют, что они не попытаются предоставить вам только те узлы, которые они контролируют, для злонамеренных целей.
принимая это во внимание,addrmgr
Пакет предоставляет диспетчер адресов, безопасный для параллелизма.,Используется для кэширования и выбора узлов недетерминированным образом. Общая идея заключается в том, что вызывающий абонент добавляет адрес в диспетчер адресов.,И существуют, уведомляют его, когда адрес подключен, заведомо исправен и опробован. При необходимости вызывающий абонент также может запросить адрес.
addrmgr
Адреса группируются внутри, и группы выбираются недетерминированным криптографически случайным образом. Это снижает вероятность выбора нескольких адресов из одной сети, что в целом помогает обеспечить большее разнообразие узлов и, что более важно, значительно снижает способность злоумышленника заставить ваши узлы подключаться только к тем узлам, которые они контролируют.
addrmgr
Также уметь понимать маршрутизируемость Tor адреса и попытайтесь вернуть только маршрутизируемые адреса. Кроме того, он использует информацию, предоставленную вызывающей стороной, включая подключенные, заведомо исправные и проверенные адреса, для периодического отсеивания узлов, которые больше не ведут себя так хорошо, в то время как существование при выборе отдает предпочтение заведомо исправным узлам. Общая идея состоит в том, чтобы сделать все возможное, чтобы предоставить только доступные адреса.
btcd
это использование Go Реализация полного узла Биткойн, написанная на языке, который включает в себя инструмент под названием addrmgr
сумка,Для управления сетью Биткойнсерединаодноранговый узел(peer)адресная информация。addrmgr
Отвечает за обнаружение, отслеживание и поддержание адресов активных узлов в сети, чтобы гарантировать, что узлы могут эффективно подключаться и обмениваться данными. Далее идет пара btcd
середина addrmgr
подробное введение.
addrmgr
Пакет основной Для управления сетью Биткойнсерединаадрес узла。Он обеспечивает добавление、удалить、выбиратьи Функция обновления адреса узла,Убедитесь, что узлы могут обнаруживать другие узлы и подключаться к ним.,Это поддерживает подключение к сети. И предоставляет следующие функции:
существовать btcd
середина,addrmgr
Основная структура AddrManager
,Он управляет всемадрес узлаинформация。Ниже приводится AddrManager
Определение структуры:
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
Структура определяет одновременно безопасный менеджер адресов для кэширования потенциальных существующих узлов сети Биткойн-середина. Ниже приводится описание функций каждого поля:
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
}
KnownAddress
Структура для быстрого поиска и доступа ко всем известным адресам.AddrManager
Оно началось?AddrManager
Он был закрыт?localAddresses
одновременного доступа.AddrManager
версия.func New(dataDir string, lookupFunc func(string) ([]net.IP, error)) *AddrManager
:Загрузить информацию об адресе узла по указанному пути,и создайте новый менеджер адресов.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
метод добавления адресаfunc (a *AddrManager) NumAddresses() int
:Возвращает количество известных адресов。func (a *AddrManager) GetAddress() *KnownAddress
:Возвращает адрес, который должен быть маршрутизируемым。этовыбиратьвозможный адрес изсерединаслучайныйвыбиратьодин,Отдавайте предпочтение тем, которые в последнее время не использовались.func (a *AddrManager) Connected(addr *wire.NetAddressV2)
func (a *AddrManager) Good(addr *wire.NetAddressV2)