// Copyright 2015 Stellar Development Foundation and contributors. Licensed // under the Apache License, Version 2.0. See the COPYING file at the root // of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 %#include "xdr/Stellar-ledger.h" namespace stellar { enum ErrorCode { ERR_MISC = 0, // Unspecific error ERR_DATA = 1, // Malformed data ERR_CONF = 2, // Misconfiguration error ERR_AUTH = 3, // Authentication failure ERR_LOAD = 4 // System overloaded }; struct Error { ErrorCode code; string msg<100>; }; struct AuthCert { Curve25519Public pubkey; uint64 expiration; Signature sig; }; struct Hello { uint32 ledgerVersion; uint32 overlayVersion; Hash networkID; string versionStr<100>; int listeningPort; NodeID peerID; AuthCert cert; uint256 nonce; }; struct Auth { // Empty message, just to confirm // establishment of MAC keys. int unused; }; enum IPAddrType { IPv4 = 0, IPv6 = 1 }; struct PeerAddress { union switch (IPAddrType type) { case IPv4: opaque ipv4[4]; case IPv6: opaque ipv6[16]; } ip; uint32 port; uint32 numFailures; }; enum MessageType { ERROR_MSG = 0, HELLO = 1, AUTH = 2, DONT_HAVE = 3, GET_PEERS = 4, // gets a list of peers this guy knows about PEERS = 5, GET_TX_SET = 6, // gets a particular txset by hash TX_SET = 7, TRANSACTION = 8, // pass on a tx you have heard about // SCP GET_SCP_QUORUMSET = 9, SCP_QUORUMSET = 10, SCP_MESSAGE = 11 }; struct DontHave { MessageType type; uint256 reqHash; }; union StellarMessage switch (MessageType type) { case ERROR_MSG: Error error; case HELLO: Hello hello; case AUTH: Auth auth; case DONT_HAVE: DontHave dontHave; case GET_PEERS: void; case PEERS: PeerAddress peers<>; case GET_TX_SET: uint256 txSetHash; case TX_SET: TransactionSet txSet; case TRANSACTION: TransactionEnvelope transaction; // SCP case GET_SCP_QUORUMSET: uint256 qSetHash; case SCP_QUORUMSET: SCPQuorumSet qSet; case SCP_MESSAGE: SCPEnvelope envelope; }; struct AuthenticatedMessage { uint64 sequence; StellarMessage message; HmacSha256Mac mac; }; }