노드 간의 원활한 상호 작용을 보장하려면 블록체인에 효율적인 통신 도구가 필요합니다. 그리고 libp2p는 지점 간 통신에서 개발자에게 없어서는 안될 프레임워크입니다. 강력한 모듈식 기능을 제공하여 분산 네트워크의 메시징을 더욱 유연하고 안전하게 만듭니다. Substrate에서 libp2p의 통합은 개발자가 다양한 맞춤형 프로토콜을 쉽게 구현하고, 블록체인 노드 간의 통신 프로세스를 단순화하며, 복잡한 네트워크 상호 작용을 보다 직관적이고 효율적으로 만드는 데 도움이 됩니다.
이 기사는 PaperMoon의 후원으로 작성되었습니다 kaichao 선생님이 작성한 Substrate 고급 과정의 6개 기술 기사는 P2P 통신의 장점, libp2p의 아키텍처 설계, Substrate가 분산형 블록체인 구축에 이러한 기술을 적용하는 방법에 대한 심층적인 이해를 제공합니다. 맞춤형 블록 체인 애플리케이션을 개발할 때 복잡한 네트워크 환경에 쉽게 대처할 수 있도록 도와드립니다.
지점 간 통신 모델의 등장과 중요성
Web2.0 시대의 대다수 인터넷 애플리케이션은 TCP/IP 기반의 "클라이언트-서버" 통신 아키텍처를 채택합니다. 클라이언트는 데이터를 수집하여 서버로 전송하고, 클라이언트는 데이터를 저장합니다. 그런 다음 처리된 데이터를 획득하고 사용합니다. 이 모델은 지난 30년 동안 인터넷의 활발한 발전을 뒷받침해 왔지만 일반 사용자에게 편의를 제공하는 동시에 다음과 같은 다양한 문제를 야기했습니다.
사용자 개인정보 공개
사용자 데이터 판매
서비스 제공업체는 끝없는 광고를 게시하여 진실을 모르는 사용자에게 돌이킬 수 없는 손실을 초래합니다.
이용자가 게시한 내용을 협의 없이 임의로 삭제하는 행위
독점 시장 및 가격 책정;
사용자 심리를 과도하게 이용하고 사용자의 시간을 통제할 수 없을 정도로 차지합니다.
…
클라이언트-서버 통신 모델은 다음과 같습니다.
위의 문제에 대한 해결책을 찾을 때 지점 간(피어 투 피어) 통신 메커니즘이 점차 기술 개척자의 비전에 들어갔습니다. 인터넷 초기에는 음악 공유 서비스인 Napster나 스트리밍 미디어 다운로드 서비스인 BitTorrent 등 파일 공유를 위해 P2P 통신이 주로 사용되었습니다. 지점 간 서비스를 더 광범위하게 적용하려면 리소스 저작권 문제와 실제 감독을 처리하기 위한 특정 거버넌스 메커니즘이 필요합니다. 이는 이 기사의 초점이 아니며 너무 많이 소개되지 않습니다.
지점 간 통신 모델은 다음과 같습니다.
지점 간 네트워크에서는 모든 노드가 동일합니다. 즉, 모든 노드는 데이터를 저장하고 처리할 수 있습니다(서버로서). 처리할 데이터를 네트워크의 다른 노드로 보내고 처리된 데이터를 얻을 수도 있습니다. 네트워크. 이러한 통신 메커니즘을 통해 다음이 보장될 수 있습니다.
네트워크는 열려 있고 노드는 자유롭게 가입하고 나갈 수 있습니다.
단일 서비스 노드에 의존하지 않고도 네트워크 서비스의 안정성과 효율성이 향상됩니다.
노드에서 실행되는 프로그램 코드는 공개적으로 표시되며 규칙은 더욱 투명해집니다.
네트워크에서 전송되는 데이터와 제공되는 서비스에 따라 파일 저장 및 읽기, 데이터 계산, 콘텐츠 공유, 데이터 트랜잭션 및 기타 서비스를 포함한 지점 간 애플리케이션에 대한 다양한 애플리케이션 시나리오가 등장했습니다. 이러한 애플리케이션을 개발하는 과정에서 포함될 수 있는 기술적 사항은 다음과 같습니다.
노드 ID는 네트워크의 노드와 주소 형식을 고유하게 식별합니다.
검색 메커니즘, 중앙 집중식 조정 서비스 없이 새 노드를 검색하는 방법
라우팅 , 로컬 노드는 네트워크의 모든 노드 정보를 저장할 수 없으며 라우팅 알고리즘을 사용하여 필요한 노드를 찾습니다.
TCP, UDP, WebSocket, QUIC 등과 같은 다중 통신 프로토콜
암호화 및 인증은 메시지의 신뢰성과 보안을 보장합니다.
NAT 침투는 NAT 뒤의 내부 IP에 접근할 수 없는 문제를 해결합니다.
자원을 절약하기 위한 다중화;
네트워크에 부담을 주지 않고 효율적으로 업데이트를 받기 위한 메시지 구독
릴레이(Relay ), 통신을 설정해야 하는 두 노드에 직접 액세스할 수 없는 경우, 예를 들어 두 노드가 모두 NAT 네트워크에 있고 정보가 릴레이 노드를 통해 전송되어야 합니다.
…
위에 나열된 기술 사항/요구 사항은 모든 P2P 응용 프로그램에 나타나지 않습니다. 그러나 대부분은 기능의 일부만 사용하지만 여전히 휠을 재발명하는 심각한 현상이 있습니다. 반복적인 개발을 피하기 위해 일부 애플리케이션은 기존 오픈 소스 애플리케이션의 기능 코드를 포크하는 방식을 선택합니다. 이 방법은 원래 애플리케이션의 기술적 부채를 도입하고 사용자 정의 및 확장이 어렵습니다.
복잡하고 끊임없이 변화하는 네트워크 토폴로지와 확장되는 애플리케이션 상태로 인해 지점 간 애플리케이션을 개발, 홍보 및 대중화하는 것이 극도로 어려워졌습니다. 고도로 모듈화된 지점 간 통신 개발 프레임워크가 등장한 것은 놀라운 일이 아닙니다. 다음에 소개할 libp2p입니다.
모듈식 지점간 통신, 프레임워크의 탄생 —— libp2p
Libp2p는 P2P 애플리케이션 개발을 위한 프레임워크로 원래 분산형 파일 공유 서비스인 IPFS에서 파생되었습니다. 현재 libp2p를 구성하기 위해 네트워크 통신 관련 콘텐츠를 추출하고 재설계했습니다. 현재 js-libp2p가 포함되어 있습니다. , go-libp2p, Rust-libp2p 및 참조 사양 세트를 정의합니다. 서로 다른 언어의 구현 버전이 이 사양을 준수하는 한 상호 통신이 가능합니다.
Libp2p가 제공하는 핵심 기능은 다음과 같습니다.
노드 간에 안전하고 재사용 가능한 네트워크 연결을 설정합니다.
검증 가능한 노드 ID 및 연결 가능한 주소.
안전하고 재사용 가능한 연결
Libp2p가 지원하는 기본(전송 계층) 프로토콜에는 TCP/IP, UDP, WebSocket, QUIC 등이 포함됩니다. 다양한 언어 버전의 구현 완료는 다양합니다. 전송된 콘텐츠를 암호화하여 연결의 보안이 보장되고 그에 따라 노드의 신원이 확인됩니다.
연결 활용도를 높이고 다양한 형태의 방화벽 및 NAT와 같은 복잡한 네트워크 시나리오에 대처하려면 설정된 기본 연결을 다중화해야 합니다. s 스트림은 다중화를 달성할 수 있는 상위 계층 연결 형태일 수 있습니다. - 편도 또는 단방향.
QUIC 프로토콜에는 보안 및 재사용 가능한 구성요소가 내장되어 있습니다. 이러한 기능이 없는 프로토콜의 경우 libp2p를 사용하여 원래 연결을 업그레이드하고 재사용 가능한 보안 패키지 와 재사용 가능한 패키지 를 추가할 수 있습니다 . 패키지는 yamux 및 mplex 입니다 .
업그레이드 프로토콜의 프로세스는 다음과 같습니다.
다양한 libp2p 내장 또는 사용자 정의 애플리케이션 계층 프로토콜이 스트림에서 전송될 수 있습니다. 이러한 프로토콜은 다음과 같이 노드 간 정보 교환 방법과 내용을 정의합니다.
ping , 노드가 온라인인지 정기적으로 확인하는 데 사용됩니다.
노드의 공개 키와 네트워크의 주소와 같은 노드 간 정보를 교환하는 데 사용되는 신원
kad-dht - 노드 간 라우팅에 사용되는 Kademlia 알고리즘 기반 분산 해시 테이블
…
ID 프로토콜을 예로 들면 해당 프로토콜 ID(경로 형식의 문자열)는 /ipfs/id/1.0.0
입니다. 메시지 표현 및 직렬화는 프로토콜 버퍼를 사용합니다.
노드 아이덴티티
노드가 시작될 때 개인 키를 제공해야 합니다(임의로 생성될 수도 있음) . 주로 다음 용도로 사용됩니다.
두 노드의 공개 키를 사용하여 Diffie-Helman 키 교환을 통해 메시지를 암호화하고 해독합니다.
노드의 공개 키를 해시하여 노드 ID인 PeerId를 생성합니다.
Libp2p에서 지원하는 공개 키 암호화 알고리즘 에는 RSA, Ed25519, Secp256k1 등이 포함됩니다. PeerId는 다중 해시 알고리즘을 지원하는 다중 해시 형식으로 생성됩니다. 기본 58 인코딩 이후의 형식은 QmYyQSo1c1Ym7orWxLYvCrM2EmxFTANf8wXmmE7DWjhx5N
입니다.
PeerId와 multiaddr을 결합하면 네트워크에서 노드를 찾고 신원을 확인하는 데 사용할 수 있습니다. 예를 들어 IP 주소가 7.7.7.7이고 포트 4242에서 수신 대기하며 위의 PeerId를 갖는 노드의 multiaddr(다중 레벨 주소)은 다음과 같습니다. :
위에는 libp2p에서 제공하는 기능 중 일부만 나열되어 있습니다. 메시지 구독, 릴레이, NAT 침투 등과 같은 자세한 내용은 libp2p를 사용하여 지점 간 애플리케이션을 개발하면 대부분의 문제를 해결할 수 있습니다 . 그리고 위에서 언급한 기술적 사항을 통해 개발 시간이 많이 절약되고 시스템의 유지 관리 및 확장성이 향상됩니다. 다음으로 Rust-libp2p를 사용하여 간단한 사용자 정의 애플리케이션 프로토콜을 구현하는 방법을 살펴보겠습니다.
간단한 신청
여기 에서는 echo 기능을 완성할 수 있는 Rust-libp2p 기반의 간단한 지점 간 애플리케이션을 작성합니다. 즉, 한 노드가 문자열을 보내고 다른 노드는 문자열을 수신하여 동일한 문자로 응답합니다. 애플리케이션 계층 프로토콜인 EchoProtocol
libp2p에서 제공하는 UpgradeInfo
인터페이스를 구현해야 합니다.
여기서 protocol_info
메소드는 프로토콜의 이름과 형식을 반환합니다. 그런 다음 InboundUpgrade
및 OutboundUpgrade
구현하면 두 인터페이스 모두 UpgradeInfo。
NegotiatedSubstream
협상된 프로토콜에서 사용되는 I/O 스트림을 나타냅니다. 원격 노드가 현재 프로토콜을 지원하는 경우 upgrade_inbound
및 upgrade_outbound
호출하여 리스너 측과 다이얼러 측에서 각각 핸드셰이크 신호를 활성화합니다.
그런 다음 연결 요청을 처리하는 처리기를 정의합니다. 처리 중에 사용되는 상태 정보를 저장하는 EchoHandler
구조입니다.
사용자 정의 열거 이벤트 열거 유형도 필요합니다.
그런 다음 libp2p::swarm에 제공된 ProtocolsHandler
인터페이스를 구현할 수 있습니다.
노드가 다이얼러이고 핸들러가 폴링하는 경우 ( ProtocolsHandler::poll()
) 연결에 사용되는 프로토콜을 시작하고 협상하는 데 사용되는 EchoProtocol
인스턴스가 포함된 ProtocolsHandlerEvent::OutboundSubstreamRequest
반환해야 합니다. 협상이 성공하면 ProtocolsHandler::inject_fully_negotiated_outbound
호출합니다. 여기서 핸들러에 의해 저장된 아웃바운드 상태를 None에서 Some(send_echo(stream).boxed())
로 업데이트합니다. 여기서 send_echo
협상된 IO 스트림을 수신하고 오류가 없을 때 이를 반환합니다. 스트림이 발생합니다.
다음으로 Pr
otocolsHandler::poll
의 구현을 살펴보겠습니다. outbound가 Some이고 send_echo가 반환한 향후 폴링 결과가 Poll::Pending
아웃바운드를 self.outbound = Some(send_echo_future)
로 업데이트하여 다음 폴링이 여전히 유효한지 확인하세요. 결과가 Poll::Ready
이면 해당 이벤트 정보가 반환됩니다.
노드가 리스너이고 새 요청 스트림이 연결에 나타나면 ProtocolsHandler::listen_protocol
자동으로 호출되어 스트림에서 사용되는 프로토콜을 협상하기 위한 InboundUpgrade
인스턴스를 반환합니다. 협상이 성공하면 inject_fully_negotiated_inbound
호출되며, 이 메서드 내에서 핸들러의 인바운드 속성 상태는 Some(recv_echo(stream).boxed())
로 업데이트되고, recv_echo
구현은 매개변수 중 하나입니다. 방법은.
여기서 일반 S
futures_io 에서 제공하는 AsyncRead
및 AsyncWrite
제약 조건을 충족해야 합니다.
P2P 네트워크는 떼와 같으며 , 떼의 전반적인 행동은 단일 개인의 행동으로 구성됩니다. 이러한 규칙은 조합하여 사용될 수 있습니다. Rust에서는 libp2p에서 지정된 정의가 NetworkBehaviour
인터페이스를 구현해야 합니다. 여기서는 먼저 규칙 상태를 저장하는 구조를 정의합니다.
이 구조에는 Swarm과 통신되는 메시지 events
와 행동 정의에 필요한 초기 구성이 포함되어 있습니다. 그런 다음 NetworkBehaviour
인터페이스를 구현할 수 있습니다.
연결이 설정되거나 노드 호출을 시도하면 new_handler
가 호출되고 앞서 정의한 핸들러인 EchoHandler
가 호출되며 연결의 백그라운드 처리 스레드로서 동작과 핸들러가 메시지 전달을 통해 통신합니다. 메커니즘 inject_event
핸들러의 메시지를 동작에 전달할 수 있으며, 동작은 메시지를 핸들러에 전달하기 위해 폴링할 때 SendEvent
반환합니다. 지금까지 간단한 echo point-to-point 통신 프로토콜을 완성했습니다. 이제 main 함수에서 어떻게 사용하는지 살펴보겠습니다.
코드에 대한 간략한 설명은 다음과 같습니다.
Keypair::generate_ed25519
통해 노드 간 통신 암호화를 위한 키를 생성합니다. 여기서 공개 키는 노드의PeerId
파생할 수 있습니다.libp2p::build_development_transport
개발에 일반적으로 사용되는 전송 계층을 구축하여 TCP/IP, WebSocket을 지원하고 노이즈 프로토콜을 암호화 계층으로 사용하며 yamux 및 다중 다중화 프로토콜을 사용합니다.수신 매개변수를 분석하여 호출의 노드 정보가 포함된 경우 다이얼러(클라이언트)이고 구성된 동작의 초기 매개변수
init_echo
true로 설정합니다.위에서 구성한 전송 계층, 동작 및 노드 ID를 사용하여
Swarm::new(transport, behaviour, peer_id)
호출하여 네트워크를 시뮬레이션하는 Swarm을 구성합니다.노드가 다이얼러인 경우 수신 원격 노드
Swarm::dial_addr(&mut swarm, remote)?
호출하여 노드를 Swarm 노드 풀에 추가합니다.swarm.poll_next_unpin(cx)
으로 Swarm을 폴링합니다. 동작에 의해 트리거된 메시지가 있으면 해당 메시지를 처리합니다.
요약하면 libp2p는 지점 간 통신을 위한 높은 수준의 추상화를 제공합니다. 이러한 개념을 처음 접하면 혼동되기 쉽고 분할된 수준과 일반적으로 사용되는 프로토콜에 지속적으로 익숙해져야 합니다. Rust-libp2p의 구현은 libp2p에 의해 정의된 레벨과 프로토콜을 기반으로 합니다. 사용자 정의 프로토콜을 개발하는 동안 이러한 추상 인터페이스와 인터페이스 간의 통신 방법을 깊이 이해해야 합니다. 일반적으로 지점 간 통신 개발은 기존 클라이언트-서버 통신보다 훨씬 어렵습니다. libp2p는 이러한 문제점 중 일부를 해결하도록 설계되었지만 애플리케이션 개발자가 Only에 대해 더 많이 배워야 합니다. 기본 메커니즘을 이해함으로써 애플리케이션 프로토콜을 더 잘 개발할 수 있습니다. 현재 libp2p를 사용하는 애플리케이션에는 IPFS, Substrate/Polkadot, Libra, Ethereum 2.0 등이 있습니다. 다음으로 Substrate가 libp2p를 어떻게 사용하는지 알아보겠습니다.
기판 네트워크 계층 아키텍처, 다중 프로토콜 지원 및 노드 검색 메커니즘 구현
블록체인 네트워크는 분산형(또는 지점 간) 노드로 구성되며, 네트워크 연결을 통해 노드 간에 메시지가 전송됩니다. Substrate는 일반적인 블록체인 개발 프레임워크로, 쉽게 사용하고 사용할 수 있는 Rust-libp2p를 사용합니다. 다음과 같은 다양한 통신 프로토콜을 확장합니다 .
전송 계층은 TCP/IP(주소 형식:
/ip4/1.2.3.4/tcp/5
), WebSocket(주소 형식:/ip4/1.2.3.4/tcp/5/ws
), DNS(주소 형식:/dns/
를 지원합니다.example.com/tcp/5
또는/dns/
example.com/tcp/5/ws
) 및 해당 IPv6 형식암호화 프로토콜 Noise 는 전송 계층 위에 적용됩니다.
다중화 프로토콜 Yamux 및 Mplex를 지원하며 Mplex는 점차적으로 폐기될 예정입니다.
libp2p 표준 ping 프로토콜 (
/ipfs/ping/1.0.0
)을 사용하여 노드 간 네트워크 연결이 아직 살아 있는지 주기적으로 확인합니다. 확인에 실패하면 연결이 끊어집니다.libp2p 표준 ID 프로토콜 (
/ipfs/id/1.0.0
)을 사용하여 노드는 이 프로토콜을 통해 주기적으로 노드 정보를 교환합니다.libp2p 표준 Kademlia 프로토콜 (
/<protocol_id>/kad
)은 Kademlia 랜덤 워크 쿼리를 실행합니다. 여기서 protocol_id는 서로 다른 체인을 구별하는 데 사용될 수 있으며 Substrate 체인 사양에 정의되어 있습니다.블록 정보를 동기화하는 데 사용되는 사용자 정의된 동기화 프로토콜 (
/<protocol-id>/sync/2
) 요청 및 반환 결과의 데이터 형식은 api.v1.proto 파일에 정의됩니다.사용자 정의된 라이트 프로토콜 (
/<protocol-id>/light/2
) 라이트 클라이언트는 이 프로토콜을 사용하여 체인의 상태 정보를 동기화합니다. light.v1.proto 파일에 정의되어 있습니다.맞춤형 트랜잭션 프로토콜 (
/<protocol-id>/transactions/1
) 은 노드가 수신한 트랜잭션 정보를 브로드캐스트하는 데 사용됩니다 . 해당 형식은 트랜잭션 컬렉션의 SCALE 인코딩 결과입니다.맞춤형 블록 브로드캐스트 프로토콜 (
/<protocol-id>/block-announces/1
)은 노드가 블록을 생성하거나 수신할 때 해당 블록을 다른 노드에 브로드캐스트합니다.사용자 정의 가십 프로토콜 (
/paritytech/grandpa/1
), GRANDPA는 관련 투표 정보를 다른 노드에 알리는 데 사용됩니다.사용자 정의 Substrate 레거시 프로토콜 (
/substrate/<protocol-id>/<version>
)은 곧 더 이상 사용되지 않을 프로토콜입니다. 또한 블록 정보를 동기화 및 브로드캐스트하고, 라이트 클라이언트 요청을 처리하고, 가십(GRANDPA 사용으로 수신)도 가능합니다. 등.
위의 기본 및 애플리케이션 계층 통신 프로토콜과 결합하여 기판 노드 간의 연결은 세 가지 검색 메커니즘을 통해 설정될 수 있습니다.
주소와 PeerId가 고정되어 있는 부트스트랩 노드(부트스트랩 노드)는 네트워크의 콜드 스타트에 적합하며, 노드가 방금 네트워크에 합류하면 부트 노드를 통해 네트워크에 들어갑니다.
mDNS 는 로컬 네트워크에서 UDP 패킷을 브로드캐스팅하여 노드가 응답하면 연결이 설정될 수 있습니다.
Kademlia 랜덤 워크는 연결이 설정되면 현재 노드가
FIND_NODE
통해 원격 노드에 요청하여 현재 네트워크의 노드 구성에 대한 원격 노드의 관점을 얻을 수 있습니다.
위의 프로토콜은 함께 Substrate의 범용 네트워크 계층을 구성하며 이 네트워크 계층의 사용은 NetworkWorker
및 NetworkService
구조를 통해 구현됩니다. 노드 템플릿 노드 프로그램의 사용 예는 다음과 같습니다.
분산형 통신 모델은 인터넷 애플리케이션에 대한 새로운 패러다임을 열었고 libp2p 사양의 출현으로 P2P 애플리케이션을 개발할 때 개발자가 겪는 어려움이 점차 완화되었습니다. Substrate는 libp2p의 탁월한 기능을 활용하며 블록체인의 분산 애플리케이션 분야에서 일반 개발자가 기본 통신 메커니즘에 너무 많은 관심을 기울이지 않고도 복잡한 맞춤형 블록체인을 쉽게 완성할 수 있도록 해줍니다.
카운트다운이 시작되었습니다! Polkadot Hackathon Bangkok Station이 곧 마지막 스프린트를 선보일 예정입니다.
개발자들이 Polkadot 생태계와 Web3에 대해 깊이 탐구할 수 있도록 장려하기 위해 2024년 7월 11일부터 OneBlock+ 커뮤니티가 주최하는 Polkadot Hackathon 대회가 이제 마지막 단계에 진입했습니다. 11월 16일 방콕역에서 데모데이가 진행될 예정이며, 코드 제출 마감일 (10월 23일 정오 UTC+8 12:00)이 얼마 남지 않았습니다! 이번 대회의 두 번째 행사인 방콕에서는 많은 혁신적인 팀들이 모여 총 상금 630,000달러 의 푸짐한 상금을 놓고 경쟁했습니다. 마지막 기회를 잡고 Polkadot 생태계에 참여하여 무대에서 프로젝트를 빛나게 하세요!
🏄♂️ 지금 가입하기: https://forms.gle/4pNpmp92pnX2wWSZ8
🧺 참가 안내:
방콕역: https://dorahacks.io/zh/hackathon/polkadot-2024-bangkok/detail
🛠️ Github 코드 베이스: https://github.com/OneBlockPlus/polkadot-hackathon-2024
🗳️ 기술 리소스 라이브러리: https://github.com/OneBlockPlus/Technical-docs/blob/main/Substrate-technical-docs.md
여덟 번째 기판개발 심화과정, 심층분석과 프로젝트 실습으로 블록체인을 선도해 보세요.
블록체인 기술의 핵심을 빠르게 익히고 자신만의 애플리케이션을 구축하고 싶으십니까? OneBlock+와 Polkadot은 업계의 고위 전문가인 Wang Dachui, Zhou Jun 및 Sun Kaichao를 초청하여 학생들에게 전문적인 지도를 제공 하는 여덟 번째 "기판 개발 고급 및 프로젝트 실습" 과정을 개설했습니다 . Substrate의 핵심 기술을 종합적으로 분석하고, 최첨단 개발 기술을 습득하며, 실제 프로젝트 실습을 통해 실습 능력을 향상시킵니다. 블록체인 업계에서 자신의 이름을 알리고 싶거나 경력의 혁신을 이루기를 기대하고 있다면 이 과정이 여러분에게 성공의 길을 열어줄 것입니다.
🪅지금 참여하세요: https://wj.qq.com/s2/14825200/0zv4/
자세한 내용은 보조 엠마(🆔 oneblockEmma)를 추가하세요!