Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "crypto/sha256"
- "encoding/binary"
- "fmt"
- "net"
- "sync/atomic"
- "time"
- )
- const (
- Magic uint32 = 0xD9B4BEF9
- ProtocolVersion uint32 = 70017
- ServerAddress = "127.0.0.1:8333"
- )
- var (
- handshakeAttempts uint64
- )
- func main() {
- var numGoroutines int
- fmt.Print("Enter the number of goroutines: ")
- fmt.Scanln(&numGoroutines)
- versionPayload := createVersionPayload() // Create the version payload once
- for i := 0; i < numGoroutines; i++ {
- go sendRapidHandshakes(versionPayload)
- }
- select {}
- }
- func sendRapidHandshakes(versionPayload []byte) {
- for {
- conn, err := net.Dial("tcp", ServerAddress)
- if err != nil {
- fmt.Println("Error connecting:", err)
- continue
- }
- if err := sendVersionMessage(conn, versionPayload); err != nil {
- fmt.Println("Error sending version message:", err)
- } else {
- atomic.AddUint64(&handshakeAttempts, 1)
- fmt.Printf("Handshake attempts: %d\n", atomic.LoadUint64(&handshakeAttempts))
- }
- conn.Close() // Close immediately after sending
- }
- }
- func sendVersionMessage(conn net.Conn, versionPayload []byte) error {
- _, err := conn.Write(packCommand("version", versionPayload))
- return err
- }
- func packCommand(command string, payload []byte) []byte {
- var cmd [12]byte
- copy(cmd[:], command)
- firstSHA := sha256.Sum256(payload)
- checksum := sha256.Sum256(firstSHA[:])
- packet := make([]byte, 24+len(payload))
- binary.LittleEndian.PutUint32(packet[0:4], Magic)
- copy(packet[4:16], cmd[:])
- binary.LittleEndian.PutUint32(packet[16:20], uint32(len(payload)))
- copy(packet[20:24], checksum[:4])
- copy(packet[24:], payload)
- return packet
- }
- func createVersionPayload() []byte {
- var addr [26]byte
- binary.LittleEndian.PutUint64(addr[:8], 1) // services
- payload := make([]byte, 85)
- binary.LittleEndian.PutUint32(payload, ProtocolVersion)
- binary.LittleEndian.PutUint64(payload[4:12], uint64(time.Now().Unix()))
- copy(payload[12:38], addr[:])
- copy(payload[38:64], addr[:])
- binary.LittleEndian.PutUint64(payload[64:72], 0) // nonce
- copy(payload[72:80], []byte("/x.com/123456/"))
- binary.LittleEndian.PutUint32(payload[80:84], 0) // start_height
- payload[84] = 0 // relay
- return payload
- }
Advertisement
Add Comment
Please, Sign In to add comment