@@ -46,122 +46,123 @@ import (
4646
4747//export RegisterObservationCallback
4848func RegisterObservationCallback (f C.callback_t ) {
49- go func () {
50- ctx := context .Background ()
51-
52- // Setup base network configuration.
53- networkID := "/wormhole/mainnet/2"
54- priv , _ , err := crypto .GenerateKeyPair (crypto .Ed25519 , - 1 )
55- bootstrapPeers := []string {
56- "/dns4/wormhole-mainnet-v2-bootstrap.certus.one/udp/8999/quic/p2p/12D3KooWQp644DK27fd3d4Km3jr7gHiuJJ5ZGmy8hH4py7fP4FP7" ,
57- }
58-
59- // Setup libp2p Connection Manager.
60- mgr , err := connmgr .NewConnManager (
61- 100 ,
62- 400 ,
63- connmgr .WithGracePeriod (0 ),
64- )
65-
66- if err != nil {
67- err := fmt .Errorf ("Failed to create connection manager: %w" , err )
68- fmt .Println (err )
69- return
70- }
71-
72- // Setup libp2p Reactor.
73- h , err := libp2p .New (
74- libp2p .Identity (priv ),
75- libp2p .ListenAddrStrings (
76- "/ip4/0.0.0.0/udp/30910/quic" ,
77- "/ip6/::/udp/30910/quic" ,
78- ),
79- libp2p .Security (libp2ptls .ID , libp2ptls .New ),
80- libp2p .Transport (libp2pquic .NewTransport ),
81- libp2p .ConnectionManager (mgr ),
82- libp2p .Routing (func (h host.Host ) (routing.PeerRouting , error ) {
83- bootstrappers := make ([]peer.AddrInfo , 0 )
84- for _ , addr := range bootstrapPeers {
85- ma , err := multiaddr .NewMultiaddr (addr )
86- if err != nil {
87- continue
88- }
89-
90- pi , err := peer .AddrInfoFromP2pAddr (ma )
91- if err != nil || pi .ID == h .ID () {
92- continue
93- }
94-
95- bootstrappers = append (bootstrappers , * pi )
96- }
97- idht , err := dht .New (ctx , h , dht .Mode (dht .ModeServer ),
98- dht .ProtocolPrefix (protocol .ID ("/" + networkID )),
99- dht .BootstrapPeers (bootstrappers ... ),
100- )
101- return idht , err
102- }),
103- )
104-
105- if err != nil {
106- err := fmt .Errorf ("Failed to create libp2p host: %w" , err )
107- fmt .Println (err )
108- return
109- }
110-
111- topic := fmt .Sprintf ("%s/%s" , networkID , "broadcast" )
112- ps , err := pubsub .NewGossipSub (ctx , h )
113- if err != nil {
114- err := fmt .Errorf ("Failed to create Pubsub: %w" , err )
115- fmt .Println (err )
116- return
117- }
118-
119- th , err := ps .Join (topic )
120- if err != nil {
121- err := fmt .Errorf ("Failed to join topic: %w" , err )
122- fmt .Println (err )
123- return
124- }
125-
126- sub , err := th .Subscribe ()
127- if err != nil {
128- err := fmt .Errorf ("Failed to subscribe topic: %w" , err )
129- fmt .Println (err )
130- return
131- }
132-
133- for {
134- for {
135- select {
136- case <- ctx .Done ():
137- return
138- default :
139- envelope , err := sub .Next (ctx )
140- if err != nil {
141- err := fmt .Errorf ("Failed to receive Pubsub message: %w" , err )
142- fmt .Println (err )
143- return
144- }
145-
146- // Definition for GossipMessage is generated by Protobuf, see `p2p.proto`.
147- var msg GossipMessage
148- err = proto .Unmarshal (envelope .Data , & msg )
149-
150- switch msg .Message .(type ) {
151- case * GossipMessage_SignedObservation :
152- case * GossipMessage_SignedVaaWithQuorum :
153- vaaBytes := msg .GetSignedVaaWithQuorum ().GetVaa ()
154- cBytes := C .CBytes (vaaBytes )
155- defer C .free (cBytes )
156- C .invoke (f , C.observation_t {
157- vaa : (* C .char )(cBytes ),
158- vaa_len : C .size_t (len (vaaBytes )),
159- })
160- }
161- }
162- }
163- }
164- }()
49+ go func () {
50+ ctx := context .Background ()
51+
52+ // Setup base network configuration.
53+ networkID := "/wormhole/testnet/2/1"
54+ priv , _ , err := crypto .GenerateKeyPair (crypto .Ed25519 , - 1 )
55+ bootstrapPeers := []string {
56+ //"/dns4/wormhole-mainnet-v2-bootstrap.certus.one/udp/8999/quic/p2p/12D3KooWQp644DK27fd3d4Km3jr7gHiuJJ5ZGmy8hH4py7fP4FP7",
57+ "/dns4/wormhole-testnet-v2-bootstrap.certus.one/udp/8999/quic/p2p/12D3KooWAkB9ynDur1Jtoa97LBUp8RXdhzS5uHgAfdTquJbrbN7i" ,
58+ }
59+
60+ // Setup libp2p Connection Manager.
61+ mgr , err := connmgr .NewConnManager (
62+ 100 ,
63+ 400 ,
64+ connmgr .WithGracePeriod (0 ),
65+ )
66+
67+ if err != nil {
68+ err := fmt .Errorf ("Failed to create connection manager: %w" , err )
69+ fmt .Println (err )
70+ return
71+ }
72+
73+ // Setup libp2p Reactor.
74+ h , err := libp2p .New (
75+ libp2p .Identity (priv ),
76+ libp2p .ListenAddrStrings (
77+ "/ip4/0.0.0.0/udp/30910/quic" ,
78+ "/ip6/::/udp/30910/quic" ,
79+ ),
80+ libp2p .Security (libp2ptls .ID , libp2ptls .New ),
81+ libp2p .Transport (libp2pquic .NewTransport ),
82+ libp2p .ConnectionManager (mgr ),
83+ libp2p .Routing (func (h host.Host ) (routing.PeerRouting , error ) {
84+ bootstrappers := make ([]peer.AddrInfo , 0 )
85+ for _ , addr := range bootstrapPeers {
86+ ma , err := multiaddr .NewMultiaddr (addr )
87+ if err != nil {
88+ continue
89+ }
90+
91+ pi , err := peer .AddrInfoFromP2pAddr (ma )
92+ if err != nil || pi .ID == h .ID () {
93+ continue
94+ }
95+
96+ bootstrappers = append (bootstrappers , * pi )
97+ }
98+ idht , err := dht .New (ctx , h , dht .Mode (dht .ModeServer ),
99+ dht .ProtocolPrefix (protocol .ID ("/" + networkID )),
100+ dht .BootstrapPeers (bootstrappers ... ),
101+ )
102+ return idht , err
103+ }),
104+ )
105+
106+ if err != nil {
107+ err := fmt .Errorf ("Failed to create libp2p host: %w" , err )
108+ fmt .Println (err )
109+ return
110+ }
111+
112+ topic := fmt .Sprintf ("%s/%s" , networkID , "broadcast" )
113+ ps , err := pubsub .NewGossipSub (ctx , h )
114+ if err != nil {
115+ err := fmt .Errorf ("Failed to create Pubsub: %w" , err )
116+ fmt .Println (err )
117+ return
118+ }
119+
120+ th , err := ps .Join (topic )
121+ if err != nil {
122+ err := fmt .Errorf ("Failed to join topic: %w" , err )
123+ fmt .Println (err )
124+ return
125+ }
126+
127+ sub , err := th .Subscribe ()
128+ if err != nil {
129+ err := fmt .Errorf ("Failed to subscribe topic: %w" , err )
130+ fmt .Println (err )
131+ return
132+ }
133+
134+ for {
135+ for {
136+ select {
137+ case <- ctx .Done ():
138+ return
139+ default :
140+ envelope , err := sub .Next (ctx )
141+ if err != nil {
142+ err := fmt .Errorf ("Failed to receive Pubsub message: %w" , err )
143+ fmt .Println (err )
144+ return
145+ }
146+
147+ // Definition for GossipMessage is generated by Protobuf, see `p2p.proto`.
148+ var msg GossipMessage
149+ err = proto .Unmarshal (envelope .Data , & msg )
150+
151+ switch msg .Message .(type ) {
152+ case * GossipMessage_SignedObservation :
153+ case * GossipMessage_SignedVaaWithQuorum :
154+ vaaBytes := msg .GetSignedVaaWithQuorum ().GetVaa ()
155+ cBytes := C .CBytes (vaaBytes )
156+ defer C .free (cBytes )
157+ C .invoke (f , C.observation_t {
158+ vaa : (* C .char )(cBytes ),
159+ vaa_len : C .size_t (len (vaaBytes )),
160+ })
161+ }
162+ }
163+ }
164+ }
165+ }()
165166}
166167
167168func main () {
0 commit comments