syntax = "proto3";

package com.hedera.hapi.node.state.addressbook;

// SPDX-License-Identifier: Apache-2.0
import "services_basic_types.proto";

option java_package = "com.hederahashgraph.api.proto.java";
// <<<pbj.java_package = "com.hedera.hapi.node.state.addressbook">>> This comment is special code for setting PBJ Compiler java package
option java_multiple_files = true;

/**
 * A single address book node in the network state.
 *
 * Each node in the network address book SHALL represent a single actual
 * consensus node that is eligible to participate in network consensus.
 *
 * Address book nodes SHALL NOT be _globally_ uniquely identified. A given node
 * is only valid within a single realm and shard combination, so the identifier
 * for a network node SHALL only be unique within a single realm and shard
 * combination.
 */
message Node {
    /**
     * A consensus node identifier.
     * <p>
     * Node identifiers SHALL be globally unique for a given ledger.
     */
    uint64 node_id = 1;

    /**
     * An account identifier.
     * <p>
     * This account SHALL be owned by the entity responsible for the node.<br/>
     * This account SHALL be charged transaction fees for any transactions
     * that are submitted to the network by this node and
     * fail due diligence checks.<br/>
     * This account SHALL be paid the node portion of transaction fees
     * for transactions submitted by this node.
     */
    proto.AccountID account_id = 2;

    /**
     * A short description of the node.
     * <p>
     * This value, if set, MUST NOT exceed `transaction.maxMemoUtf8Bytes`
     * (default 100) bytes when encoded as UTF-8.
     */
    string description = 3;

    /**
     * A list of service endpoints for gossip.
     * <p>
     * These endpoints SHALL represent the published endpoints to which other
     * consensus nodes may _gossip_ transactions.<br/>
     * If the network configuration value `gossipFqdnRestricted` is set, then
     * all endpoints in this list SHALL supply only IP address.<br/>
     * If the network configuration value `gossipFqdnRestricted` is _not_ set,
     * then endpoints in this list MAY supply either IP address or FQDN, but
     * SHALL NOT supply both values for the same endpoint.<br/>
     * This list SHALL NOT be empty.<br/>
     * This list SHALL NOT contain more than `10` entries.<br/>
     * The first two entries in this list SHALL be the endpoints published to
     * all consensus nodes.<br/>
     * All other entries SHALL be reserved for future use.
     */
    repeated proto.ServiceEndpoint gossip_endpoint = 4;

    /**
     * A list of service endpoints for client calls.
     * <p>
     * These endpoints SHALL represent the published endpoints to which clients
     * may submit transactions.<br/>
     * These endpoints SHALL specify a port.<br/>
     * Endpoints in this list MAY supply either IP address or FQDN, but SHALL
     * NOT supply both values for the same endpoint.<br/>
     * This list SHALL NOT be empty.<br/>
     * This list SHALL NOT contain more than `8` entries.
     */
    repeated proto.ServiceEndpoint service_endpoint = 5;

    /**
     * A certificate used to sign gossip events.
     * <p>
     * This value SHALL be a certificate of a type permitted for gossip
     * signatures.<br/>
     * This value SHALL be the DER encoding of the certificate presented.<br/>
     * This field is REQUIRED and MUST NOT be empty.
     */
    bytes gossip_ca_certificate = 6;

    /**
     * A hash of the node gRPC certificate.
     * <p>
     * This value MAY be used to verify the certificate presented by the node
     * during TLS negotiation for gRPC.<br/>
     * This value SHALL be a SHA-384 hash.<br/>
     * The TLS certificate to be hashed SHALL first be in PEM format and SHALL
     * be encoded with UTF-8 NFKD encoding to a stream of bytes provided to
     * the hash algorithm.<br/>
     * This field is OPTIONAL.
     */
    bytes grpc_certificate_hash = 7;

    /**
     * A consensus weight.
     * <p>
     * Each node SHALL have a weight in consensus calculations.<br/>
     * The consensus weight of a node SHALL be calculated based on the amount
     * of HBAR staked to that node.<br/>
     * Consensus SHALL be calculated based on agreement of greater than `2/3`
     * of the total `weight` value of all nodes on the network.
     * <p>
     * This field is deprecated and SHALL NOT be used when RosterLifecycle
     * is enabled.
     */
    uint64 weight = 8 [deprecated = true];

    /**
     * A flag indicating this node is deleted.
     * <p>
     * If this field is set, then this node SHALL NOT be included in the next
     * update of the network address book.<br/>
     * If this field is set, then this node SHALL be immutable and SHALL NOT
     * be modified.<br/>
     * If this field is set, then any `nodeUpdate` transaction to modify this
     * node SHALL fail.
     */
    bool deleted = 9;

    /**
     * An administrative key controlled by the node operator.
     * <p>
     * This key MUST sign each transaction to update this node.<br/>
     * This field MUST contain a valid `Key` value.<br/>
     * This field is REQUIRED and MUST NOT be set to an empty `KeyList`.
     */
    proto.Key admin_key = 10;

    /**
     * A flag indicating this node declines node rewards distributed at
     * the end of staking period.
     * <p>
     * If this field is set, then this node SHALL NOT receive any node rewards
     * distributed at the end of the staking period.
     */
    bool decline_reward = 11;

    /**
     * A web proxy for gRPC from non-gRPC clients.
     * <p>
     * This endpoint SHALL be a Fully Qualified Domain Name (FQDN) using the HTTPS
     * protocol, and SHALL support gRPC-Web for use by browser-based clients.<br/>
     * This endpoint MUST be signed by a trusted certificate authority.<br/>
     * This endpoint MUST use a valid port and SHALL be reachable over TLS.<br/>
     * This field MAY be omitted if the node does not support gRPC-Web access.<br/>
     * This field MUST be updated if the gRPC-Web endpoint changes.<br/>
     * This field SHALL enable frontend clients to avoid hard-coded proxy endpoints.
     */
    proto.ServiceEndpoint grpc_proxy_endpoint = 12;
}
