;; P2P Network Contract for Clarity Bitcoin
;; Data structures
(define-map peers principal {
address: (string-ascii 256),
port: uint,
last-seen: uint,
version: uint
})
(define-map peer-messages {peer: principal, nonce: uint} {
msg-type: (string-ascii 20),
payload: (buff 1024),
timestamp: uint
})
(define-data-var message-nonce uint u0)
;; Constants
(define-constant ERR-NOT-AUTHORIZED (err u100))
(define-constant ERR-PEER-EXISTS (err u101))
(define-constant ERR-PEER-NOT-FOUND (err u102))
;; Register peer
(define-public (register-peer (address (string-ascii 256)) (port uint))
(let ((peer tx-sender))
(if (is-some (map-get? peers peer))
ERR-PEER-EXISTS
(ok (map-set peers peer {
address: address,
port: port,
last-seen: block-height,
version: u1
}))
)
)
)
;; Update peer heartbeat
(define-public (heartbeat)
(let ((peer tx-sender))
(match (map-get? peers peer)
peer-data (ok (map-set peers peer (merge peer-data {last-seen: block-height})))
ERR-PEER-NOT-FOUND
)
)
)
;; Broadcast message
(define-public (broadcast (msg-type (string-ascii 20)) (payload (buff 1024)))
(let (
(nonce (var-get message-nonce))
(peer tx-sender)
)
(map-set peer-messages {peer: peer, nonce: nonce} {
msg-type: msg-type,
payload: payload,
timestamp: block-height
})
(var-set message-nonce (+ nonce u1))
(ok nonce)
)
)
;; Get peer info
(define-read-only (get-peer (peer principal))
(map-get? peers peer)
)
;; Get message
(define-read-only (get-message (peer principal) (nonce uint))
(map-get? peer-messages {peer: peer, nonce: nonce})
)
;; Remove peer
(define-public (unregister-peer)
(ok (map-delete peers tx-sender))
)