diff --git a/docker-compose.yml b/docker-compose.yml index 449a1830ab78..05392fc3bb08 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -49,10 +49,8 @@ services: FEE_JUICE_CONTRACT_ADDRESS: "0x73c43b919973711e096bfc04c9d4b3be511ffc0b" FEE_JUICE_PORTAL_CONTRACT_ADDRESS: "0xdf25b0a34dbee9f25518f7a4d63bab8b3bb3e496" ETHEREUM_HOSTS: - P2P_TCP_LISTEN_ADDR: "0.0.0.0:9000" - P2P_UDP_LISTEN_ADDR: "0.0.0.0:9001" - P2P_TCP_ANNOUNCE_ADDR: ":9000" - P2P_UDP_ANNOUNCE_ADDR: ":9001" + P2P_IP: "127.0.0.1" + P2P_PORT: 9000 P2P_QUERY_FOR_IP: true P2P_ENABLED: true PEER_ID_PRIVATE_KEY: diff --git a/iac/network/scripts/bootnode_startup.sh b/iac/network/scripts/bootnode_startup.sh index 927654e198b5..0f961f55776a 100644 --- a/iac/network/scripts/bootnode_startup.sh +++ b/iac/network/scripts/bootnode_startup.sh @@ -123,8 +123,8 @@ docker run \ --publish $P2P_PORT:$P2P_PORT/udp \ --env DATA_DIRECTORY \ --env DATA_STORE_MAP_SIZE_KB \ - --env P2P_UDP_ANNOUNCE_ADDR \ - --env P2P_UDP_LISTEN_ADDR \ + --env P2P_IP \ + --env P2P_PORT \ --env PEER_ID_PRIVATE_KEY \ --env L1_CHAIN_ID \ --env AZTEC_PORT \ @@ -137,8 +137,7 @@ chmod +x /home/$SSH_USER/start.sh DATA_DIRECTORY=/home/$SSH_USER/data -P2P_UDP_ANNOUNCE_ADDR="$PUBLIC_IP:$P2P_PORT" -P2P_UDP_LISTEN_ADDR="0.0.0.0:$P2P_PORT" +P2P_IP="$PUBLIC_IP" mkdir -p $DATA_DIRECTORY @@ -157,12 +156,11 @@ WorkingDirectory=/home/$SSH_USER Environment="PEER_ID_PRIVATE_KEY=$PEER_ID_PRIVATE_KEY" Environment="DATA_STORE_MAP_SIZE_KB=$DATA_STORE_MAP_SIZE_KB" Environment="DATA_DIRECTORY=$DATA_DIRECTORY" -Environment="P2P_UDP_ANNOUNCE_ADDR=$P2P_UDP_ANNOUNCE_ADDR" -Environment="P2P_UDP_LISTEN_ADDR=$P2P_UDP_LISTEN_ADDR" +Environment="P2P_IP=$P2P_IP" +Environment="P2P_PORT=$P2P_PORT" Environment="L1_CHAIN_ID=$L1_CHAIN_ID" Environment="AZTEC_PORT=80" Environment="LOG_LEVEL=$LOG_LEVEL" -Environment="P2P_PORT=$P2P_PORT" Environment="NETWORK_NAME=$NETWORK_NAME" Environment="REPO=$REPO" Environment="IMAGE=$IMAGE" diff --git a/iac/network/scripts/deploy_bootnodes.sh b/iac/network/scripts/deploy_bootnodes.sh index e05da10fecf0..10fd5a39c746 100755 --- a/iac/network/scripts/deploy_bootnodes.sh +++ b/iac/network/scripts/deploy_bootnodes.sh @@ -136,8 +136,7 @@ while read -r REGION IP; do PRIVATE_KEY=$(gcloud secrets versions access latest --secret="${SECRET_NAME}") # Now we can generate the enr - UDP_ANNOUNCE="$IP:$P2P_UDP_PORT" - ENR=$(cd scripts && ./generate_encoded_enr.sh "$PRIVATE_KEY" "$UDP_ANNOUNCE" "$L1_CHAIN_ID" $TAG) + ENR=$(cd scripts && ./generate_encoded_enr.sh "$PRIVATE_KEY" "$IP" "$P2P_UDP_PORT" "$L1_CHAIN_ID" $TAG) echo "ENR: $ENR" diff --git a/iac/network/scripts/generate_encoded_enr.sh b/iac/network/scripts/generate_encoded_enr.sh index 2fab6ec7b2f0..c2d2b78c5312 100755 --- a/iac/network/scripts/generate_encoded_enr.sh +++ b/iac/network/scripts/generate_encoded_enr.sh @@ -1,12 +1,13 @@ #!/usr/bin/env bash PRIVATE_KEY=${1:-} -UDP_ADDRESS=${2:-} -L1_CHAIN_ID=${3:-} -TAG=${4:-"latest"} +P2P_IP=${2:-} +P2P_PORT=${3:-} +L1_CHAIN_ID=${4:-} +TAG=${5:-"latest"} function get_enr { - docker run --rm aztecprotocol/aztec:$TAG node --no-warnings /usr/src/yarn-project/aztec/dest/bin/index.js generate-bootnode-enr $PRIVATE_KEY $UDP_ADDRESS -c $L1_CHAIN_ID + docker run --rm aztecprotocol/aztec:$TAG node --no-warnings /usr/src/yarn-project/aztec/dest/bin/index.js generate-bootnode-enr $PRIVATE_KEY $P2P_IP $P2P_PORT -c $L1_CHAIN_ID } OUTPUT="$(get_enr)" diff --git a/spartan/aztec-network/files/config/setup-p2p-addresses.sh b/spartan/aztec-network/files/config/setup-p2p-addresses.sh index 9a50a091304b..791b37a25237 100644 --- a/spartan/aztec-network/files/config/setup-p2p-addresses.sh +++ b/spartan/aztec-network/files/config/setup-p2p-addresses.sh @@ -19,21 +19,15 @@ if [ "${NETWORK_PUBLIC}" = "true" ]; then EXTERNAL_IP=$(kubectl get node $NODE_NAME -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}') fi - TCP_ADDR="${EXTERNAL_IP}:${P2P_TCP_PORT}" - UDP_ADDR="${EXTERNAL_IP}:${P2P_UDP_PORT}" - + IP=${EXTERNAL_IP} else # Get pod IP for non-public networks - POD_IP=$(hostname -i) - TCP_ADDR="${POD_IP}:${P2P_TCP_PORT}" - UDP_ADDR="${POD_IP}:${P2P_UDP_PORT}" + IP=$(hostname -i) fi # Write addresses to file for sourcing -echo "export P2P_TCP_ANNOUNCE_ADDR=${TCP_ADDR}" > /shared/config/p2p-addresses -echo "export P2P_TCP_LISTEN_ADDR=0.0.0.0:${P2P_TCP_PORT}" >> /shared/config/p2p-addresses -echo "export P2P_UDP_ANNOUNCE_ADDR=${UDP_ADDR}" >> /shared/config/p2p-addresses -echo "export P2P_UDP_LISTEN_ADDR=0.0.0.0:${P2P_UDP_PORT}" >> /shared/config/p2p-addresses +echo "export P2P_IP=${IP}" > /shared/config/p2p-addresses +echo "export P2P_PORT=${P2P_PORT}" >> /shared/config/p2p-addresses echo "P2P addresses configured:" cat /shared/config/p2p-addresses diff --git a/spartan/aztec-network/templates/_helpers.tpl b/spartan/aztec-network/templates/_helpers.tpl index 7c3aaf65a0be..7ea1a700460e 100644 --- a/spartan/aztec-network/templates/_helpers.tpl +++ b/spartan/aztec-network/templates/_helpers.tpl @@ -311,10 +311,8 @@ Combined P2P, and Service Address Setup Container value: "{{ .Values.network.public }}" - name: NAMESPACE value: {{ .Release.Namespace }} - - name: P2P_TCP_PORT - value: "{{ .Values.validator.service.p2pTcpPort }}" - - name: P2P_UDP_PORT - value: "{{ .Values.validator.service.p2pUdpPort }}" + - name: P2P_PORT + value: "{{ .Values.validator.service.p2pPort }}" - name: TELEMETRY value: "{{ .Values.telemetry.enabled }}" - name: OTEL_COLLECTOR_ENDPOINT diff --git a/spartan/aztec-network/templates/boot-node.yaml b/spartan/aztec-network/templates/boot-node.yaml index 39ff87d3e44f..4fd9f058c870 100644 --- a/spartan/aztec-network/templates/boot-node.yaml +++ b/spartan/aztec-network/templates/boot-node.yaml @@ -235,8 +235,8 @@ spec: {{- end }} ports: - containerPort: {{ .Values.bootNode.service.nodePort }} - - containerPort: {{ .Values.bootNode.service.p2pTcpPort }} - - containerPort: {{ .Values.bootNode.service.p2pUdpPort }} + - containerPort: {{ .Values.bootNode.service.p2pPort }} + - containerPort: {{ .Values.bootNode.service.p2pPort }} protocol: UDP resources: {{- toYaml .Values.bootNode.resources | nindent 12 }} @@ -283,9 +283,9 @@ spec: ports: # External load balancers cannot handle mixed TCP/UDP ports, so we only expose the node port {{- if not .Values.network.public }} - - port: {{ .Values.bootNode.service.p2pTcpPort }} + - port: {{ .Values.bootNode.service.p2pPort }} name: p2p-tcp - - port: {{ .Values.bootNode.service.p2pUdpPort }} + - port: {{ .Values.bootNode.service.p2pPort }} name: p2p-udp protocol: UDP {{- end }} diff --git a/spartan/aztec-network/templates/full-node.yaml b/spartan/aztec-network/templates/full-node.yaml index 9c5de221b857..57b81cf513c0 100644 --- a/spartan/aztec-network/templates/full-node.yaml +++ b/spartan/aztec-network/templates/full-node.yaml @@ -160,8 +160,8 @@ spec: {{- end }} ports: - containerPort: {{ .Values.fullNode.service.nodePort }} - - containerPort: {{ .Values.fullNode.service.p2pTcpPort }} - - containerPort: {{ .Values.fullNode.service.p2pUdpPort }} + - containerPort: {{ .Values.fullNode.service.p2pPort }} + - containerPort: {{ .Values.fullNode.service.p2pPort }} protocol: UDP resources: {{- toYaml .Values.fullNode.resources | nindent 12 }} @@ -212,9 +212,9 @@ spec: ports: # External load balancers cannot handle mixed TCP/UDP ports, so we only expose the node port {{- if not .Values.network.public }} - - port: {{ .Values.fullNode.service.p2pTcpPort }} + - port: {{ .Values.fullNode.service.p2pPort }} name: p2p-tpc - - port: {{ .Values.fullNode.service.p2pUdpPort }} + - port: {{ .Values.fullNode.service.p2pPort }} name: p2p-udp protocol: UDP {{- end }} diff --git a/spartan/aztec-network/templates/prover-node.yaml b/spartan/aztec-network/templates/prover-node.yaml index 674661fa94c1..283c7a4b6539 100644 --- a/spartan/aztec-network/templates/prover-node.yaml +++ b/spartan/aztec-network/templates/prover-node.yaml @@ -210,10 +210,8 @@ spec: value: "{{ .Values.proverNode.p2p.enabled }}" - name: P2P_GOSSIPSUB_FLOOD_PUBLISH value: "{{ .Values.proverNode.p2p.floodPublish }}" - - name: P2P_TCP_LISTEN_ADDR - value: "0.0.0.0:{{ .Values.proverNode.service.p2pTcpPort }}" - - name: P2P_UDP_LISTEN_ADDR - value: "0.0.0.0:{{ .Values.proverNode.service.p2pUdpPort }}" + - name: P2P_PORT + value: "{{ .Values.proverNode.service.p2pPort }}" - name: ETHEREUM_SLOT_DURATION value: "{{ .Values.ethereum.blockTime }}" - name: AZTEC_SLOT_DURATION @@ -244,8 +242,8 @@ spec: value: "{{ .Values.network.p2pBootstrapNodesAsFullPeers }}" ports: - containerPort: {{ .Values.proverNode.service.nodePort }} - - containerPort: {{ .Values.proverNode.service.p2pTcpPort }} - - containerPort: {{ .Values.proverNode.service.p2pUdpPort }} + - containerPort: {{ .Values.proverNode.service.p2pPort }} + - containerPort: {{ .Values.proverNode.service.p2pPort }} protocol: UDP resources: {{- toYaml .Values.proverNode.resources | nindent 12 }} @@ -283,9 +281,9 @@ spec: ports: - port: {{ .Values.proverNode.service.nodePort }} name: node - - port: {{ .Values.proverNode.service.p2pTcpPort }} + - port: {{ .Values.proverNode.service.p2pPort }} name: p2p-tcp - - port: {{ .Values.proverNode.service.p2pUdpPort }} + - port: {{ .Values.proverNode.service.p2pPort }} name: p2p-udp protocol: UDP {{ end }} diff --git a/spartan/aztec-network/templates/validator.yaml b/spartan/aztec-network/templates/validator.yaml index 8e06f66ded9a..32494b889358 100644 --- a/spartan/aztec-network/templates/validator.yaml +++ b/spartan/aztec-network/templates/validator.yaml @@ -195,8 +195,8 @@ spec: {{- end }} ports: - containerPort: {{ .Values.validator.service.nodePort }} - - containerPort: {{ .Values.validator.service.p2pTcpPort }} - - containerPort: {{ .Values.validator.service.p2pUdpPort }} + - containerPort: {{ .Values.validator.service.p2pPort }} + - containerPort: {{ .Values.validator.service.p2pPort }} protocol: UDP resources: {{- toYaml .Values.validator.resources | nindent 12 }} @@ -235,10 +235,10 @@ spec: {{- include "aztec-network.selectorLabels" . | nindent 4 }} app: validator ports: - - port: {{ .Values.validator.service.p2pTcpPort }} + - port: {{ .Values.validator.service.p2pPort }} name: p2p-tcp protocol: TCP - - port: {{ .Values.validator.service.p2pUdpPort }} + - port: {{ .Values.validator.service.p2pPort }} name: p2p-udp protocol: UDP - port: {{ .Values.validator.service.nodePort }} diff --git a/spartan/aztec-network/values.yaml b/spartan/aztec-network/values.yaml index fba758d4c757..17753ccf61bd 100644 --- a/spartan/aztec-network/values.yaml +++ b/spartan/aztec-network/values.yaml @@ -77,8 +77,7 @@ bootNode: externalHost: "" replicas: 1 service: - p2pTcpPort: 40400 - p2pUdpPort: 40400 + p2pPort: 40400 nodePort: 8080 logLevel: "debug; info: aztec:simulator, json-rpc" p2p: @@ -113,8 +112,7 @@ fullNode: externalHost: "" replicas: 1 service: - p2pTcpPort: 40400 - p2pUdpPort: 40400 + p2pPort: 40400 nodePort: 8080 logLevel: "debug; info: aztec:simulator, json-rpc" p2p: @@ -151,8 +149,7 @@ validator: dynamicBootNode: false replicas: 1 service: - p2pTcpPort: 40400 - p2pUdpPort: 40400 + p2pPort: 40400 nodePort: 8080 logLevel: "debug; info: aztec:simulator, json-rpc" sequencer: @@ -192,8 +189,7 @@ proverNode: enabled: true floodPublish: true service: - p2pTcpPort: 40400 - p2pUdpPort: 40400 + p2pPort: 40400 nodePort: 8080 logLevel: "debug; info: aztec:simulator, json-rpc" proverAgent: diff --git a/yarn-project/aztec/src/cli/cmds/start_p2p_bootstrap.ts b/yarn-project/aztec/src/cli/cmds/start_p2p_bootstrap.ts index aa8bef9fa174..8c51fc454d86 100644 --- a/yarn-project/aztec/src/cli/cmds/start_p2p_bootstrap.ts +++ b/yarn-project/aztec/src/cli/cmds/start_p2p_bootstrap.ts @@ -24,6 +24,6 @@ export async function startP2PBootstrap( await node.start(config); signalHandlers.push(() => node.stop()); services.bootstrap = [node, P2PBootstrapApiSchema]; - userLog(`P2P bootstrap node started on ${config.udpListenAddress}`); + userLog(`P2P bootstrap node started on ${config.p2pIp}:${config.p2pPort}`); return { config: emptyChainConfig }; } diff --git a/yarn-project/aztec/terraform/prover-node/main.tf b/yarn-project/aztec/terraform/prover-node/main.tf index d64e045c58ef..06ff7a538aeb 100644 --- a/yarn-project/aztec/terraform/prover-node/main.tf +++ b/yarn-project/aztec/terraform/prover-node/main.tf @@ -281,10 +281,8 @@ resource "aws_ecs_task_definition" "aztec-prover-node" { { name = "P2P_ENABLED", value = tostring(var.P2P_ENABLED) }, { name = "BOOTSTRAP_NODES", value = var.BOOTSTRAP_NODES }, { name = "PEER_ID_PRIVATE_KEY", value = local.node_p2p_private_keys[count.index] }, - { name = "P2P_TCP_LISTEN_ADDR", value = "0.0.0.0:${var.NODE_P2P_TCP_PORT + count.index}" }, - { name = "P2P_UDP_LISTEN_ADDR", value = "0.0.0.0:${var.NODE_P2P_UDP_PORT + count.index}" }, - { name = "P2P_TCP_ANNOUNCE_ADDR", value = ":${var.NODE_P2P_TCP_PORT + count.index}" }, - { name = "P2P_UDP_ANNOUNCE_ADDR", value = ":${var.NODE_P2P_UDP_PORT + count.index}" }, + { name = "P2P_IP", value = "0.0.0.0" }, + { name = "P2P_PORT", value = "${var.NODE_P2P_TCP_PORT + count.index}" }, { name = "P2P_QUERY_FOR_IP", value = "true" }, { name = "P2P_MAX_PEERS", value = var.P2P_MAX_PEERS }, { name = "P2P_BLOCK_CHECK_INTERVAL_MS", value = "1000" }, diff --git a/yarn-project/cli/src/cmds/misc/generate_bootnode_enr.ts b/yarn-project/cli/src/cmds/misc/generate_bootnode_enr.ts index 326fed37c04c..1f75e27f0b6d 100644 --- a/yarn-project/cli/src/cmds/misc/generate_bootnode_enr.ts +++ b/yarn-project/cli/src/cmds/misc/generate_bootnode_enr.ts @@ -3,10 +3,11 @@ import { createBootnodeENRandPeerId } from '@aztec/p2p/enr'; export async function generateEncodedBootnodeENR( privateKey: string, - udpAnnounceAddress: string, + p2pIp: string, + p2pPort: number, l1ChainId: number, log: LogFn, ) { - const { enr } = await createBootnodeENRandPeerId(privateKey, udpAnnounceAddress, l1ChainId); + const { enr } = await createBootnodeENRandPeerId(privateKey, p2pIp, p2pPort, l1ChainId); log(`ENR: ${enr.encodeTxt()}`); } diff --git a/yarn-project/cli/src/cmds/misc/index.ts b/yarn-project/cli/src/cmds/misc/index.ts index 86bf3d0826fd..1d37ad3fb7cb 100644 --- a/yarn-project/cli/src/cmds/misc/index.ts +++ b/yarn-project/cli/src/cmds/misc/index.ts @@ -35,11 +35,12 @@ export function injectCommands(program: Command, log: LogFn) { .summary('Generates the encoded ENR record for a bootnode.') .description('Generates the encoded ENR record for a bootnode.') .argument('', 'The peer id private key of the bootnode') - .argument('', 'The bootnode UDP announce address') + .argument('', 'The bootnode P2P IP address') + .argument('', 'The bootnode P2P port') .addOption(l1ChainIdOption) - .action(async (privateKey: string, udpAnnounceAddress: string, options) => { + .action(async (privateKey: string, p2pIp: string, p2pPort: number, options) => { const { generateEncodedBootnodeENR } = await import('./generate_bootnode_enr.js'); - await generateEncodedBootnodeENR(privateKey, udpAnnounceAddress, options.l1ChainId, log); + await generateEncodedBootnodeENR(privateKey, p2pIp, p2pPort, options.l1ChainId, log); }); program diff --git a/yarn-project/end-to-end/scripts/docker-compose-p2p.yml b/yarn-project/end-to-end/scripts/docker-compose-p2p.yml index e697ec3d7a8d..d176f79d37ba 100644 --- a/yarn-project/end-to-end/scripts/docker-compose-p2p.yml +++ b/yarn-project/end-to-end/scripts/docker-compose-p2p.yml @@ -16,9 +16,8 @@ services: environment: LOG_LEVEL: ${LOG_LEVEL:-verbose} DEBUG: ${DEBUG:-""} - P2P_TCP_LISTEN_ADDR: '0.0.0.0:40400' - P2P_TCP_ANNOUNCE_ADDR: 'p2p-bootstrap:40400' - P2P_UDP_ANNOUNCE_ADDR: 'p2p-bootstrap:40400' + P2P_PORT: '40400' + P2P_IP: 'p2p-bootstrap' PEER_ID_PRIVATE_KEY: '0a260024080112205ea53185db2e52dae74d0d4d6cadc494174810d0a713cd09b0ac517c38bc781e1224080112205ea53185db2e52dae74d0d4d6cadc494174810d0a713cd09b0ac517c38bc781e1a44080112402df8b977f356c6e34fa021c9647973234dff4df706c185794405aafb556723cf5ea53185db2e52dae74d0d4d6cadc494174810d0a713cd09b0ac517c38bc781e' end-to-end: @@ -38,7 +37,7 @@ services: SEQ_MIN_TX_PER_BLOCK: 1 SEQ_MAX_SECONDS_BETWEEN_BLOCKS: 0 SEQ_MIN_SECONDS_BETWEEN_BLOCKS: 0 - P2P_TCP_LISTEN_ADDR: '0.0.0.0:40400' + P2P_PORT: '40400' P2P_NAT_ENABLED: 'false' P2P_ENABLED: 'true' BOOTSTRAP_NODES: '/ip4/p2p-bootstrap/tcp/40400/p2p/12D3KooWGBpbC6qQFkaCYphjNeY6sV99o4SnEWyTeBigoVriDn4D' diff --git a/yarn-project/end-to-end/scripts/native-network/boot-node.sh b/yarn-project/end-to-end/scripts/native-network/boot-node.sh index 0336db694b5f..b4e620aacf0b 100755 --- a/yarn-project/end-to-end/scripts/native-network/boot-node.sh +++ b/yarn-project/end-to-end/scripts/native-network/boot-node.sh @@ -22,10 +22,8 @@ export VALIDATOR_DISABLED="true" export BLOB_SINK_URL="http://127.0.0.1:${BLOB_SINK_PORT:-5053}" export SEQ_MAX_SECONDS_BETWEEN_BLOCKS="0" export SEQ_MIN_TX_PER_BLOCK="1" -export P2P_TCP_ANNOUNCE_ADDR="127.0.0.1:40400" -export P2P_UDP_ANNOUNCE_ADDR="127.0.0.1:40400" -export P2P_TCP_LISTEN_ADDR="0.0.0.0:40400" -export P2P_UDP_LISTEN_ADDR="0.0.0.0:40400" +export P2P_IP="127.0.0.1" +export P2P_PORT="40400" export OTEL_EXPORTER_OTLP_METRICS_ENDPOINT="${OTEL_EXPORTER_OTLP_METRICS_ENDPOINT:-}" export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="${OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:-}" export OTEL_EXPORTER_OTLP_LOGS_ENDPOINT="${OTEL_EXPORTER_OTLP_LOGS_ENDPOINT:-}" diff --git a/yarn-project/end-to-end/scripts/native-network/validator.sh b/yarn-project/end-to-end/scripts/native-network/validator.sh index ea91c1d50d4f..be7aaa40d786 100755 --- a/yarn-project/end-to-end/scripts/native-network/validator.sh +++ b/yarn-project/end-to-end/scripts/native-network/validator.sh @@ -64,10 +64,8 @@ export P2P_ENABLED="true" export VALIDATOR_DISABLED="false" export SEQ_MAX_SECONDS_BETWEEN_BLOCKS="0" export SEQ_MIN_TX_PER_BLOCK="1" -export P2P_TCP_ANNOUNCE_ADDR="127.0.0.1:$P2P_PORT" -export P2P_UDP_ANNOUNCE_ADDR="127.0.0.1:$P2P_PORT" -export P2P_TCP_LISTEN_ADDR="0.0.0.0:$P2P_PORT" -export P2P_UDP_LISTEN_ADDR="0.0.0.0:$P2P_PORT" +export P2P_IP="127.0.0.1" +export P2P_PORT="$P2P_PORT" export BLOB_SINK_URL="http://127.0.0.1:${BLOB_SINK_PORT:-5053}" export L1_CHAIN_ID=${L1_CHAIN_ID:-31337} export OTEL_RESOURCE_ATTRIBUTES="service.name=validator-node-${PORT}" diff --git a/yarn-project/end-to-end/scripts/start_p2p_e2e.sh b/yarn-project/end-to-end/scripts/start_p2p_e2e.sh index d407b5623b70..db013551b4ff 100755 --- a/yarn-project/end-to-end/scripts/start_p2p_e2e.sh +++ b/yarn-project/end-to-end/scripts/start_p2p_e2e.sh @@ -11,7 +11,7 @@ export SEQ_MIN_TX_PER_BLOCK=32 export SEQ_MAX_SECONDS_BETWEEN_BLOCKS=0 export SEQ_MIN_SECONDS_BETWEEN_BLOCKS=0 export BOOTSTRAP_NODES='/ip4/127.0.0.1/tcp/40400/p2p/12D3KooWGBpbC6qQFkaCYphjNeY6sV99o4SnEWyTeBigoVriDn4D' -export P2P_TCP_LISTEN_ADDR='0.0.0.0:40400' +export P2P_PORT='40400' export P2P_NAT_ENABLED='false' export P2P_ENABLED='true' diff --git a/yarn-project/end-to-end/src/fixtures/setup_p2p_test.ts b/yarn-project/end-to-end/src/fixtures/setup_p2p_test.ts index abe39cc01008..d0b98831ac73 100644 --- a/yarn-project/end-to-end/src/fixtures/setup_p2p_test.ts +++ b/yarn-project/end-to-end/src/fixtures/setup_p2p_test.ts @@ -115,10 +115,8 @@ export async function createValidatorConfig( const nodeConfig: AztecNodeConfig = { ...config, - udpListenAddress: `0.0.0.0:${port}`, - tcpListenAddress: `0.0.0.0:${port}`, - tcpAnnounceAddress: `127.0.0.1:${port}`, - udpAnnounceAddress: `127.0.0.1:${port}`, + p2pIp: `127.0.0.1`, + p2pPort: port, p2pEnabled: true, peerCheckIntervalMS: TEST_PEER_CHECK_INTERVAL_MS, blockCheckIntervalMS: 1000, diff --git a/yarn-project/foundation/src/config/env_var.ts b/yarn-project/foundation/src/config/env_var.ts index 938db59142da..c9a4213d02b2 100644 --- a/yarn-project/foundation/src/config/env_var.ts +++ b/yarn-project/foundation/src/config/env_var.ts @@ -102,12 +102,11 @@ export type EnvVar = | 'P2P_REQRESP_INDIVIDUAL_REQUEST_TIMEOUT_MS' | 'P2P_REQRESP_OVERALL_REQUEST_TIMEOUT_MS' | 'P2P_DOUBLE_SPEND_SEVERE_PEER_PENALTY_WINDOW' - | 'P2P_TCP_LISTEN_ADDR' - | 'P2P_TCP_ANNOUNCE_ADDR' + | 'P2P_LISTEN_ADDR' + | 'P2P_PORT' + | 'P2P_IP' | 'P2P_TX_POOL_KEEP_PROVEN_FOR' | 'P2P_ATTESTATION_POOL_KEEP_FOR' - | 'P2P_UDP_ANNOUNCE_ADDR' - | 'P2P_UDP_LISTEN_ADDR' | 'P2P_ARCHIVED_TX_LIMIT' | 'PEER_ID_PRIVATE_KEY' | 'PROVER_AGENT_CONCURRENCY' diff --git a/yarn-project/p2p-bootstrap/README.md b/yarn-project/p2p-bootstrap/README.md index 5d83d393bd89..423268adf519 100644 --- a/yarn-project/p2p-bootstrap/README.md +++ b/yarn-project/p2p-bootstrap/README.md @@ -6,6 +6,6 @@ To build the package simply type `yarn build`, to start the boot node, simply ty The node will require a number of environment variables: -P2P_UDP_LISTEN_ADDR - The address on which to listen for connections. +P2P_IP - The IP address on which to listen for connections. +P2P_PORT - The port on which to listen for connections. PEER_ID_PRIVATE_KEY - The private key to be used by the peer for secure communications with other peers. This key will also be used to derive the Peer ID. -P2P_UDP_ANNOUNCE_ADDR - The address that other peers should use to connect to this node, this may be different to P2P_TCP_LISTEN_ADDR if e.g. the node is behind a NAT. diff --git a/yarn-project/p2p-bootstrap/scripts/docker-compose-bootstrap.yml b/yarn-project/p2p-bootstrap/scripts/docker-compose-bootstrap.yml index 508bbf6918fe..fc3c5b97cae0 100644 --- a/yarn-project/p2p-bootstrap/scripts/docker-compose-bootstrap.yml +++ b/yarn-project/p2p-bootstrap/scripts/docker-compose-bootstrap.yml @@ -7,5 +7,6 @@ services: - '40400:40400' environment: LOG_LEVEL: 'verbose' - P2P_TCP_LISTEN_ADDR: '0.0.0.0:40400' + P2P_IP: '0.0.0.0' + P2P_PORT: '40400' PEER_ID: '0a260024080112205ea53185db2e52dae74d0d4d6cadc494174810d0a713cd09b0ac517c38bc781e1224080112205ea53185db2e52dae74d0d4d6cadc494174810d0a713cd09b0ac517c38bc781e1a44080112402df8b977f356c6e34fa021c9647973234dff4df706c185794405aafb556723cf5ea53185db2e52dae74d0d4d6cadc494174810d0a713cd09b0ac517c38bc781e' diff --git a/yarn-project/p2p-bootstrap/scripts/start_bootnode.sh b/yarn-project/p2p-bootstrap/scripts/start_bootnode.sh deleted file mode 100755 index d9aed46e2731..000000000000 --- a/yarn-project/p2p-bootstrap/scripts/start_bootnode.sh +++ /dev/null @@ -1,10 +0,0 @@ -#! /bin/bash -set -eu - -cd .. -export P2P_UDP_LISTEN_ADDR='0.0.0.0:40400' -export PEER_ID='0a260024080112205ea53185db2e52dae74d0d4d6cadc494174810d0a713cd09b0ac517c38bc781e1224080112205ea53185db2e52dae74d0d4d6cadc494174810d0a713cd09b0ac517c38bc781e1a44080112402df8b977f356c6e34fa021c9647973234dff4df706c185794405aafb556723cf5ea53185db2e52dae74d0d4d6cadc494174810d0a713cd09b0ac517c38bc781e' -echo "Building..." -yarn build -echo "Starting with Peer ID $PEER_ID" -yarn start diff --git a/yarn-project/p2p-bootstrap/terraform/main.tf b/yarn-project/p2p-bootstrap/terraform/main.tf index 4e4762a9629f..ead0e0c645e4 100644 --- a/yarn-project/p2p-bootstrap/terraform/main.tf +++ b/yarn-project/p2p-bootstrap/terraform/main.tf @@ -124,12 +124,12 @@ resource "aws_ecs_task_definition" "p2p-bootstrap" { "value": "production" }, { - "name": "P2P_UDP_LISTEN_ADDR", - "value": "0.0.0.0:${var.BOOTNODE_LISTEN_PORT + count.index}" + "name": "P2P_IP", + "value": "${data.terraform_remote_state.aztec-network_iac.outputs.p2p_eip}" }, { - "name": "P2P_UDP_ANNOUNCE_ADDR", - "value": "${data.terraform_remote_state.aztec-network_iac.outputs.p2p_eip}:${var.BOOTNODE_LISTEN_PORT + count.index}" + "name": "P2P_PORT", + "value": "${var.BOOTNODE_LISTEN_PORT + count.index}" }, { "name": "PEER_ID_PRIVATE_KEY", diff --git a/yarn-project/p2p/src/bootstrap/bootstrap.ts b/yarn-project/p2p/src/bootstrap/bootstrap.ts index 05a26f69adb1..b209e0840e3a 100644 --- a/yarn-project/p2p/src/bootstrap/bootstrap.ts +++ b/yarn-project/p2p/src/bootstrap/bootstrap.ts @@ -31,18 +31,19 @@ export class BootstrapNode implements P2PBootstrapApi { * @returns An empty promise. */ public async start(config: BootnodeConfig) { - const { udpListenAddress, udpAnnounceAddress } = config; - const listenAddrUdp = multiaddr(convertToMultiaddr(udpListenAddress, 'udp')); + const { p2pIp, p2pPort, listenAddress } = config; + const listenAddrUdp = multiaddr(convertToMultiaddr(listenAddress, p2pPort, 'udp')); - if (!udpAnnounceAddress) { - throw new Error('You need to provide a UDP announce address.'); + if (!p2pIp) { + throw new Error('You need to provide a P2P IP address.'); } const peerIdPrivateKey = await getPeerIdPrivateKey(config, this.store); const { enr: ourEnr, peerId } = await createBootnodeENRandPeerId( peerIdPrivateKey, - udpAnnounceAddress, + p2pIp, + p2pPort, config.l1ChainId, ); this.peerId = peerId; diff --git a/yarn-project/p2p/src/config.ts b/yarn-project/p2p/src/config.ts index 9714ba788262..fe2995653aa7 100644 --- a/yarn-project/p2p/src/config.ts +++ b/yarn-project/p2p/src/config.ts @@ -46,24 +46,19 @@ export interface P2PConfig extends P2PReqRespConfig, ChainConfig { l2QueueSize: number; /** - * The announce address for TCP. + * The port for the P2P service. */ - tcpAnnounceAddress?: string; + p2pPort: number; /** - * The announce address for UDP. + * The IP address for the P2P service. */ - udpAnnounceAddress?: string; + p2pIp?: string; /** - * The listen address for TCP. + * The listen address. */ - tcpListenAddress: string; - - /** - * The listen address for UDP. - */ - udpListenAddress: string; + listenAddress: string; /** * An optional peer id private key. If blank, will generate a random key. @@ -197,25 +192,19 @@ export const p2pConfigMappings: ConfigMappingsType = { description: 'Size of queue of L2 blocks to store.', ...numberConfigHelper(1_000), }, - tcpListenAddress: { - env: 'P2P_TCP_LISTEN_ADDR', - defaultValue: '0.0.0.0:40400', - description: 'The listen address for TCP. Format: :.', + listenAddress: { + env: 'P2P_LISTEN_ADDR', + defaultValue: '0.0.0.0', + description: 'The listen address. ipv4 address.', }, - udpListenAddress: { - env: 'P2P_UDP_LISTEN_ADDR', - defaultValue: '0.0.0.0:40400', - description: 'The listen address for UDP. Format: :.', + p2pPort: { + env: 'P2P_PORT', + description: 'The port for the P2P service.', + ...numberConfigHelper(40400), }, - tcpAnnounceAddress: { - env: 'P2P_TCP_ANNOUNCE_ADDR', - description: - 'The announce address for TCP. Format: :. Leave IP_ADDRESS blank to query for public IP.', - }, - udpAnnounceAddress: { - env: 'P2P_UDP_ANNOUNCE_ADDR', - description: - 'The announce address for UDP. Format: :. Leave IP_ADDRESS blank to query for public IP.', + p2pIp: { + env: 'P2P_IP', + description: 'The IP address for the P2P service. ipv4 address.', }, peerIdPrivateKey: { env: 'PEER_ID_PRIVATE_KEY', @@ -361,15 +350,18 @@ export function getP2PDefaultConfig(): P2PConfig { /** * Required P2P config values for a bootstrap node. */ -export type BootnodeConfig = Pick & - Required> & +export type BootnodeConfig = Pick< + P2PConfig, + 'p2pIp' | 'p2pPort' | 'peerIdPrivateKey' | 'bootstrapNodes' | 'listenAddress' +> & + Required> & Pick & Pick; const bootnodeConfigKeys: (keyof BootnodeConfig)[] = [ - 'udpAnnounceAddress', + 'p2pIp', + 'p2pPort', 'peerIdPrivateKey', - 'udpListenAddress', 'dataDirectory', 'dataStoreMapSizeKB', 'bootstrapNodes', diff --git a/yarn-project/p2p/src/enr/generate-enr.ts b/yarn-project/p2p/src/enr/generate-enr.ts index 34c99033b780..8b7e7c6851ba 100644 --- a/yarn-project/p2p/src/enr/generate-enr.ts +++ b/yarn-project/p2p/src/enr/generate-enr.ts @@ -11,12 +11,13 @@ import { setAztecEnrKey } from '../versioning.js'; export async function createBootnodeENRandPeerId( privateKey: string, - udpAnnounceAddress: string, + p2pIp: string, + p2pPort: number, l1ChainId: number, ): Promise<{ enr: SignableENR; peerId: PeerId }> { const peerId = await createLibP2PPeerIdFromPrivateKey(privateKey); const enr = SignableENR.createFromPeerId(peerId); - const publicAddr = multiaddr(convertToMultiaddr(udpAnnounceAddress, 'udp')); + const publicAddr = multiaddr(convertToMultiaddr(p2pIp, p2pPort, 'udp')); enr.setLocationMultiaddr(publicAddr); const config: ChainConfig = { diff --git a/yarn-project/p2p/src/services/discv5/discV5_service.ts b/yarn-project/p2p/src/services/discv5/discV5_service.ts index 54eb7d62a8e5..f1febe70ea19 100644 --- a/yarn-project/p2p/src/services/discv5/discV5_service.ts +++ b/yarn-project/p2p/src/services/discv5/discV5_service.ts @@ -3,7 +3,7 @@ import { sleep } from '@aztec/foundation/sleep'; import { type ComponentsVersions, checkCompressedComponentVersion } from '@aztec/stdlib/versioning'; import { OtelMetricsAdapter, type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client'; -import { Discv5, type Discv5EventEmitter } from '@chainsafe/discv5'; +import { Discv5, type Discv5EventEmitter, type IDiscv5CreateOptions } from '@chainsafe/discv5'; import { ENR, SignableENR } from '@chainsafe/enr'; import type { PeerId } from '@libp2p/interface'; import { type Multiaddr, multiaddr } from '@multiformats/multiaddr'; @@ -30,9 +30,6 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService /** Version identifiers. */ private versions: ComponentsVersions; - /** UDP listen addr */ - private listenMultiAddrUdp: Multiaddr; - private currentState = PeerDiscoveryState.STOPPED; public readonly bootstrapNodes: string[] = []; @@ -41,14 +38,21 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService private startTime = 0; + private handlers = { + onMultiaddrUpdated: this.onMultiaddrUpdated.bind(this), + onDiscovered: this.onDiscovered.bind(this), + onEnrAdded: this.onEnrAdded.bind(this), + }; + constructor( private peerId: PeerId, private config: P2PConfig, telemetry: TelemetryClient = getTelemetryClient(), private logger = createLogger('p2p:discv5_service'), + configOverrides: Partial = {}, ) { super(); - const { tcpAnnounceAddress, udpAnnounceAddress, udpListenAddress, bootstrapNodes } = config; + const { p2pIp, p2pPort, bootstrapNodes } = config; this.bootstrapNodes = bootstrapNodes ?? []; this.bootstrapNodeEnrs = this.bootstrapNodes.map(x => ENR.decodeTxt(x)); // create ENR from PeerId @@ -56,31 +60,31 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService // Add aztec identification to ENR this.versions = setAztecEnrKey(this.enr, config); - if (!tcpAnnounceAddress) { - throw new Error('You need to provide at least a TCP announce address.'); - } - - const multiAddrTcp = multiaddr(`${convertToMultiaddr(tcpAnnounceAddress, 'tcp')}/p2p/${peerId.toString()}`); - // if no udp announce address is provided, use the tcp announce address - const multiAddrUdp = multiaddr( - `${convertToMultiaddr(udpAnnounceAddress || tcpAnnounceAddress, 'udp')}/p2p/${peerId.toString()}`, - ); + const bindAddrs: any = { + ip4: multiaddr(convertToMultiaddr(config.listenAddress, p2pPort, 'udp')), + }; - this.listenMultiAddrUdp = multiaddr(convertToMultiaddr(udpListenAddress, 'udp')); + if (p2pIp) { + const multiAddrTcp = multiaddr(`${convertToMultiaddr(p2pIp!, p2pPort, 'tcp')}/p2p/${peerId.toString()}`); + // if no udp announce address is provided, use the tcp announce address + const multiAddrUdp = multiaddr(`${convertToMultiaddr(p2pIp!, p2pPort, 'udp')}/p2p/${peerId.toString()}`); - // set location multiaddr in ENR record - this.enr.setLocationMultiaddr(multiAddrUdp); - this.enr.setLocationMultiaddr(multiAddrTcp); + // set location multiaddr in ENR record + this.enr.setLocationMultiaddr(multiAddrUdp); + this.enr.setLocationMultiaddr(multiAddrTcp); + } const metricsRegistry = new OtelMetricsAdapter(telemetry); this.discv5 = Discv5.create({ enr: this.enr, peerId, - bindAddrs: { ip4: this.listenMultiAddrUdp }, + bindAddrs, config: { lookupTimeout: 2000, requestTimeout: 2000, allowUnverifiedSessions: true, + enrUpdate: !p2pIp ? true : false, // If no p2p IP is set, enrUpdate can automatically resolve it + ...configOverrides.config, }, metricsRegistry, }); @@ -104,8 +108,16 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService } }; - this.discv5.on(Discv5Event.DISCOVERED, this.onDiscovered.bind(this)); - this.discv5.on(Discv5Event.ENR_ADDED, this.onEnrAdded.bind(this)); + this.discv5.on(Discv5Event.DISCOVERED, this.handlers.onDiscovered); + this.discv5.on(Discv5Event.ENR_ADDED, this.handlers.onEnrAdded); + this.discv5.on(Discv5Event.MULTIADDR_UPDATED, this.handlers.onMultiaddrUpdated); + } + + private onMultiaddrUpdated(m: Multiaddr) { + // We want to update our tcp port to match the udp port + const multiAddrTcp = multiaddr(convertToMultiaddr(m.nodeAddress().address, this.config.p2pPort, 'tcp')); + this.enr.setLocationMultiaddr(multiAddrTcp); + this.logger.info('Multiaddr updated', { multiaddr: multiaddr.toString() }); } public async start(): Promise { @@ -187,8 +199,9 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService } public async stop(): Promise { - await this.discv5.off(Discv5Event.DISCOVERED, this.onDiscovered); - await this.discv5.off(Discv5Event.ENR_ADDED, this.onEnrAdded); + await this.discv5.off(Discv5Event.DISCOVERED, this.handlers.onDiscovered); + await this.discv5.off(Discv5Event.ENR_ADDED, this.handlers.onEnrAdded); + await this.discv5.off(Discv5Event.MULTIADDR_UPDATED, this.handlers.onMultiaddrUpdated); await this.discv5.stop(); diff --git a/yarn-project/p2p/src/services/discv5/discv5_service.test.ts b/yarn-project/p2p/src/services/discv5/discv5_service.test.ts index 4188a89903dd..f2b945cea8ca 100644 --- a/yarn-project/p2p/src/services/discv5/discv5_service.test.ts +++ b/yarn-project/p2p/src/services/discv5/discv5_service.test.ts @@ -5,6 +5,7 @@ import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; import { emptyChainConfig } from '@aztec/stdlib/config'; import { getTelemetryClient } from '@aztec/telemetry-client'; +import type { IDiscv5CreateOptions } from '@chainsafe/discv5'; import { jest } from '@jest/globals'; import type { PeerId } from '@libp2p/interface'; import { createSecp256k1PeerId } from '@libp2p/peer-id-factory'; @@ -14,8 +15,7 @@ import { type BootnodeConfig, type P2PConfig, getP2PDefaultConfig } from '../../ import { PeerDiscoveryState } from '../service.js'; import { DiscV5Service } from './discV5_service.js'; -const waitForPeers = (node: DiscV5Service, expectedCount: number): Promise => { - const timeout = 7_000; +const waitForPeers = (node: DiscV5Service, expectedCount: number, timeout = 7_000): Promise => { return new Promise((resolve, reject) => { const timeoutId = setTimeout(() => { reject(new Error(`Timeout: Failed to connect to ${expectedCount} peers within ${timeout} ms`)); @@ -39,8 +39,9 @@ describe('Discv5Service', () => { let basePort = 7890; const baseConfig: BootnodeConfig = { - udpAnnounceAddress: `127.0.0.1:${basePort + 100}`, - udpListenAddress: `0.0.0.0:${basePort + 100}`, + p2pIp: '127.0.0.1', + p2pPort: basePort + 100, + listenAddress: '0.0.0.0', dataDirectory: undefined, dataStoreMapSizeKB: 0, bootstrapNodes: [], @@ -112,6 +113,50 @@ describe('Discv5Service', () => { await stopNodes(node1, node2); }); + it('should automatically resolve p2p ip if not set', async () => { + const extraNodes = 3; + const nodes: DiscV5Service[] = []; + + // Create a node with no p2pIp + const node = await createNode({ p2pIp: undefined, config: { addrVotesToUpdateEnr: 1, pingInterval: 200 } }); + await node.start(); + nodes.push(node); + + // Create a number of normal nodes + for (let i = 1; i < extraNodes; i++) { + const node = await createNode({ config: { pingInterval: 200 } }); + await node.start(); + nodes.push(node); + } + + expect(node.getStatus()).toEqual(PeerDiscoveryState.RUNNING); + for (const n of nodes) { + expect(n.getStatus()).toEqual(PeerDiscoveryState.RUNNING); + } + + expect(node.getEnr().ip).toEqual(undefined); + await Promise.all([ + waitForPeers(node, extraNodes), + (async () => { + await sleep(2000); // wait for peer discovery to be able to start + for (let i = 0; i < extraNodes; i++) { + await node.runRandomNodesQuery(); + for (const n of nodes) { + await n.runRandomNodesQuery(); + } + await sleep(100); + } + })(), + ]); + + // Expect it's IP has been updated, and that the tcp and udp ports are the same + expect(node.getEnr().ip).not.toEqual(undefined); + expect(node.getEnr().tcp).not.toEqual(undefined); + expect(node.getEnr().tcp).toEqual(node.getEnr().udp); + + await stopNodes(...nodes); + }); + it('should refuse to connect to a bootstrap node with wrong chain id', async () => { const node1 = await createNode({ l1ChainId: 13, bootstrapNodeEnrVersionCheck: true }); const node2 = await createNode({ l1ChainId: 14, bootstrapNodeEnrVersionCheck: false }); @@ -181,17 +226,15 @@ describe('Discv5Service', () => { await node2.stop(); }); - const createNode = async (overrides: Partial = {}) => { + const createNode = async (overrides: Partial = {}) => { const port = ++basePort; const bootnodeAddr = bootNode.getENR().encodeTxt(); const peerId = await createSecp256k1PeerId(); const config: P2PConfig = { ...getP2PDefaultConfig(), ...baseConfig, - tcpListenAddress: `0.0.0.0:${port}`, - udpListenAddress: `0.0.0.0:${port + 100}`, - tcpAnnounceAddress: `127.0.0.1:${port}`, - udpAnnounceAddress: `127.0.0.1:${port + 100}`, + p2pIp: `127.0.0.1`, + p2pPort: port, bootstrapNodes: [bootnodeAddr], blockCheckIntervalMS: 50, peerCheckIntervalMS: 50, @@ -200,6 +243,6 @@ describe('Discv5Service', () => { keepProvenTxsInPoolFor: 0, ...overrides, }; - return new DiscV5Service(peerId, config); + return new DiscV5Service(peerId, config, undefined, undefined, overrides); }; }); diff --git a/yarn-project/p2p/src/services/libp2p/libp2p_service.ts b/yarn-project/p2p/src/services/libp2p/libp2p_service.ts index 3ae728ef871e..51cc415a7d72 100644 --- a/yarn-project/p2p/src/services/libp2p/libp2p_service.ts +++ b/yarn-project/p2p/src/services/libp2p/libp2p_service.ts @@ -168,10 +168,8 @@ export class LibP2PService extends WithTracer implement telemetry: TelemetryClient, logger = createLogger('p2p:libp2p_service'), ) { - const { tcpListenAddress, tcpAnnounceAddress, maxPeerCount } = config; - const bindAddrTcp = convertToMultiaddr(tcpListenAddress, 'tcp'); - // We know tcpAnnounceAddress cannot be null here because we set it or throw when setting up the service. - const announceAddrTcp = convertToMultiaddr(tcpAnnounceAddress!, 'tcp'); + const { p2pIp, p2pPort, maxPeerCount } = config; + const bindAddrTcp = convertToMultiaddr(p2pIp!, p2pPort, 'tcp'); const datastore = new AztecDatastore(store); @@ -193,7 +191,7 @@ export class LibP2PService extends WithTracer implement peerId, addresses: { listen: [bindAddrTcp], - announce: [announceAddrTcp], + announce: [], // announce is handled by the peer discovery service }, transports: [ tcp({ @@ -299,11 +297,11 @@ export class LibP2PService extends WithTracer implement } // Get listen & announce addresses for logging - const { tcpListenAddress, tcpAnnounceAddress } = this.config; - if (!tcpAnnounceAddress) { + const { p2pIp, p2pPort } = this.config; + if (!p2pIp) { throw new Error('Announce address not provided.'); } - const announceTcpMultiaddr = convertToMultiaddr(tcpAnnounceAddress, 'tcp'); + const announceTcpMultiaddr = convertToMultiaddr(p2pIp, p2pPort, 'tcp'); // Start job queue, peer discovery service and libp2p node this.jobQueue.start(); @@ -349,7 +347,8 @@ export class LibP2PService extends WithTracer implement }; await this.reqresp.start(requestResponseHandlers, reqrespSubProtocolValidators); this.logger.info(`Started P2P service`, { - listen: tcpListenAddress, + listen: this.config.listenAddress, + port: this.config.p2pPort, announce: announceTcpMultiaddr, peerId: this.node.peerId.toString(), }); diff --git a/yarn-project/p2p/src/test-helpers/make-enrs.ts b/yarn-project/p2p/src/test-helpers/make-enrs.ts index 3871f766a352..685f8ac2cf1d 100644 --- a/yarn-project/p2p/src/test-helpers/make-enrs.ts +++ b/yarn-project/p2p/src/test-helpers/make-enrs.ts @@ -30,10 +30,9 @@ export async function makeEnr(p2pPrivateKey: string, port: number, config: Chain const peerId = await createLibP2PPeerIdFromPrivateKey(p2pPrivateKey); const enr = SignableENR.createFromPeerId(peerId); - const udpAnnounceAddress = `127.0.0.1:${port}`; - const tcpAnnounceAddress = `127.0.0.1:${port}`; - const udpPublicAddr = multiaddr(convertToMultiaddr(udpAnnounceAddress, 'udp')); - const tcpPublicAddr = multiaddr(convertToMultiaddr(tcpAnnounceAddress, 'tcp')); + const p2pIp = `127.0.0.1`; + const udpPublicAddr = multiaddr(convertToMultiaddr(p2pIp, port, 'udp')); + const tcpPublicAddr = multiaddr(convertToMultiaddr(p2pIp, port, 'tcp')); // ENRS must include the network and a discoverable address (udp for discv5) setAztecEnrKey(enr, config); diff --git a/yarn-project/p2p/src/test-helpers/make-test-p2p-clients.ts b/yarn-project/p2p/src/test-helpers/make-test-p2p-clients.ts index 0f54447140c2..1c369c49ba8e 100644 --- a/yarn-project/p2p/src/test-helpers/make-test-p2p-clients.ts +++ b/yarn-project/p2p/src/test-helpers/make-test-p2p-clients.ts @@ -50,19 +50,14 @@ export async function makeTestP2PClient( logger = createLogger('p2p-test-client'), }: MakeTestP2PClientOptions, ) { - const addr = `127.0.0.1:${port}`; - const listenAddr = `0.0.0.0:${port}`; - // Filter nodes so that we only dial active peers const config: P2PConfig & DataStoreConfig = { ...p2pBaseConfig, p2pEnabled: true, peerIdPrivateKey, - tcpListenAddress: listenAddr, // run on port 0 - udpListenAddress: listenAddr, - tcpAnnounceAddress: addr, - udpAnnounceAddress: addr, + p2pIp: `127.0.0.1`, + p2pPort: port, bootstrapNodes: peers, peerCheckIntervalMS: 1000, maxPeerCount: 10, diff --git a/yarn-project/p2p/src/test-helpers/reqresp-nodes.ts b/yarn-project/p2p/src/test-helpers/reqresp-nodes.ts index 74199b1f3940..fe2967cc7e67 100644 --- a/yarn-project/p2p/src/test-helpers/reqresp-nodes.ts +++ b/yarn-project/p2p/src/test-helpers/reqresp-nodes.ts @@ -109,10 +109,8 @@ export async function createTestLibP2PService( ) { peerId = peerId ?? (await createSecp256k1PeerId()); const config = { - tcpAnnounceAddress: `127.0.0.1:${port}`, - udpAnnounceAddress: `127.0.0.1:${port}`, - tcpListenAddress: `0.0.0.0:${port}`, - udpListenAddress: `0.0.0.0:${port}`, + p2pIp: `127.0.0.1`, + p2pPort: port, bootstrapNodes: boostrapAddrs, peerCheckIntervalMS: 1000, maxPeerCount: 5, @@ -235,12 +233,13 @@ export class AlwaysFalseCircuitVerifier implements ClientProtocolCircuitVerifier export function createBootstrapNodeConfig(privateKey: string, port: number, chainConfig: ChainConfig): BootnodeConfig { return { l1ChainId: chainConfig.l1ChainId, - udpListenAddress: `0.0.0.0:${port}`, - udpAnnounceAddress: `127.0.0.1:${port}`, + p2pIp: '127.0.0.1', + p2pPort: port, peerIdPrivateKey: privateKey, dataDirectory: undefined, dataStoreMapSizeKB: 0, bootstrapNodes: [], + listenAddress: '0.0.0.0', }; } @@ -263,7 +262,7 @@ export function createBootstrapNodeFromPrivateKey( export async function getBootstrapNodeEnr(privateKey: string, port: number) { const peerId = await createLibP2PPeerIdFromPrivateKey(privateKey); const enr = SignableENR.createFromPeerId(peerId); - const listenAddrUdp = multiaddr(convertToMultiaddr(`127.0.0.1:${port}`, 'udp')); + const listenAddrUdp = multiaddr(convertToMultiaddr('127.0.0.1', port, 'udp')); enr.setLocationMultiaddr(listenAddrUdp); return enr; diff --git a/yarn-project/p2p/src/testbench/worker_client_manager.ts b/yarn-project/p2p/src/testbench/worker_client_manager.ts index 86703b781a40..f05bc71d8a47 100644 --- a/yarn-project/p2p/src/testbench/worker_client_manager.ts +++ b/yarn-project/p2p/src/testbench/worker_client_manager.ts @@ -44,30 +44,21 @@ class WorkerClientManager { }); } - /** - * Creates address strings from a port - */ - private getAddresses(port: number) { - return { - addr: `127.0.0.1:${port}`, - listenAddr: `0.0.0.0:${port}`, - }; - } - /** * Creates a client configuration object */ - private createClientConfig(clientIndex: number, port: number, otherNodes: string[]) { - const { addr, listenAddr } = this.getAddresses(port); - + private createClientConfig( + clientIndex: number, + port: number, + otherNodes: string[], + ): P2PConfig & Partial { return { ...getP2PDefaultConfig(), p2pEnabled: true, peerIdPrivateKey: this.peerIdPrivateKeys[clientIndex], - tcpListenAddress: listenAddr, - udpListenAddress: listenAddr, - tcpAnnounceAddress: addr, - udpAnnounceAddress: addr, + listenAddress: '127.0.0.1', + p2pIp: '127.0.0.1', + p2pPort: port, bootstrapNodes: [...otherNodes], ...this.p2pConfig, }; diff --git a/yarn-project/p2p/src/types/index.ts b/yarn-project/p2p/src/types/index.ts index 72462ea3b9c2..cf6027829e8b 100644 --- a/yarn-project/p2p/src/types/index.ts +++ b/yarn-project/p2p/src/types/index.ts @@ -17,6 +17,7 @@ export enum PeerEvent { export enum Discv5Event { DISCOVERED = 'discovered', ENR_ADDED = 'enrAdded', + MULTIADDR_UPDATED = 'multiaddrUpdated', } /** diff --git a/yarn-project/p2p/src/util.ts b/yarn-project/p2p/src/util.ts index 9f8f21d0140e..499d6b4c449c 100644 --- a/yarn-project/p2p/src/util.ts +++ b/yarn-project/p2p/src/util.ts @@ -28,41 +28,13 @@ export interface PubSubLibp2p extends Libp2p { * @param address - The address string to convert. Has to be in the format :. * @param protocol - The protocol to use in the multiaddr string. * @returns A multiaddr compliant string. */ -export function convertToMultiaddr(address: string, protocol: 'tcp' | 'udp'): string { - const [addr, port] = splitAddressPort(address, false); - - const multiaddrPrefix = addressToMultiAddressType(addr); +export function convertToMultiaddr(address: string, port: number, protocol: 'tcp' | 'udp'): string { + const multiaddrPrefix = addressToMultiAddressType(address); if (multiaddrPrefix === 'dns') { throw new Error('Invalid address format. Expected an IPv4 or IPv6 address.'); } - return `/${multiaddrPrefix}/${addr}/${protocol}/${port}`; -} - -/** - * Splits an
: string into its components. - * @returns The ip6 or ip4 address & port separately - */ -export function splitAddressPort(address: string, allowEmptyAddress: boolean): [string, string] { - let addr: string; - let port: string; - - if (address.startsWith('[')) { - // IPv6 address enclosed in square brackets - const match = address.match(/^\[([^\]]+)\]:(\d+)$/); - if (!match) { - throw new Error(`Invalid IPv6 address format:${address}. Expected format: []:`); - } - [, addr, port] = match; - } else { - // IPv4 address - [addr, port] = address.split(':'); - if ((!addr && !allowEmptyAddress) || !port) { - throw new Error(`Invalid address format: ${address}. Expected format: :`); - } - } - - return [addr, port]; + return `/${multiaddrPrefix}/${address}/${protocol}/${port}`; } /** @@ -74,13 +46,12 @@ export async function getPublicIp(): Promise { return text.trim(); } -export async function resolveAddressIfNecessary(address: string): Promise { - const [addr, port] = splitAddressPort(address, false); - const multiaddrPrefix = addressToMultiAddressType(addr); +export async function resolveAddressIfNecessary(address: string, port: string): Promise { + const multiaddrPrefix = addressToMultiAddressType(address); if (multiaddrPrefix === 'dns') { - const resolvedAddresses = await resolve(addr); + const resolvedAddresses = await resolve(address); if (resolvedAddresses.length === 0) { - throw new Error(`Could not resolve address: ${addr}`); + throw new Error(`Could not resolve address: ${address}`); } return `${resolvedAddresses[0]}:${port}`; } else { @@ -104,47 +75,16 @@ export async function configureP2PClientAddresses( _config: P2PConfig & DataStoreConfig, ): Promise { const config = { ..._config }; - const { - tcpAnnounceAddress: configTcpAnnounceAddress, - udpAnnounceAddress: configUdpAnnounceAddress, - queryForIp, - } = config; - - config.tcpAnnounceAddress = configTcpAnnounceAddress - ? await resolveAddressIfNecessary(configTcpAnnounceAddress) - : undefined; - config.udpAnnounceAddress = configUdpAnnounceAddress - ? await resolveAddressIfNecessary(configUdpAnnounceAddress) - : undefined; - - // create variable for re-use if needed - let publicIp; + const { p2pIp, queryForIp } = config; // check if no announce IP was provided - const splitTcpAnnounceAddress = splitAddressPort(configTcpAnnounceAddress || '', true); - if (splitTcpAnnounceAddress.length == 2 && splitTcpAnnounceAddress[0] === '') { + if (!p2pIp) { if (queryForIp) { - publicIp = await getPublicIp(); - const tcpAnnounceAddress = `${publicIp}:${splitTcpAnnounceAddress[1]}`; - config.tcpAnnounceAddress = tcpAnnounceAddress; - } else { - throw new Error( - `Invalid announceTcpAddress provided: ${configTcpAnnounceAddress}. Expected format: :`, - ); - } - } - - const splitUdpAnnounceAddress = splitAddressPort(configUdpAnnounceAddress || '', true); - if (splitUdpAnnounceAddress.length == 2 && splitUdpAnnounceAddress[0] === '') { - // If announceUdpAddress is not provided, use announceTcpAddress - if (!queryForIp && config.tcpAnnounceAddress) { - config.udpAnnounceAddress = config.tcpAnnounceAddress; - } else if (queryForIp) { - const udpPublicIp = publicIp || (await getPublicIp()); - const udpAnnounceAddress = `${udpPublicIp}:${splitUdpAnnounceAddress[1]}`; - config.udpAnnounceAddress = udpAnnounceAddress; + const publicIp = await getPublicIp(); + config.p2pIp = publicIp; } } + // TODO(md): guard against setting a local ip address as the announce ip return config; }