2

Here are four Ethereum Node Records (as per EIP-778):

  - "enr:-Iu4QGuiaVXBEoi4kcLbsoPYX7GTK9ExOODTuqYBp9CyHN_PSDtnLMCIL91ydxUDRPZ-jem-o0WotK6JoZjPQWhTfEsTgmlkgnY0gmlwhDbOLfeJc2VjcDI1NmsxoQLVqNEoCVTC74VmUx25USyFe7lL0TgpXHaCX9CDy9H6boN0Y3CCIyiDdWRwgiMo"
  - "enr:-Iu4QLNTiVhgyDyvCBnewNcn9Wb7fjPoKYD2NPe-jDZ3_TqaGFK8CcWr7ai7w9X8Im_ZjQYyeoBP_luLLBB4wy39gQ4JgmlkgnY0gmlwhCOhiGqJc2VjcDI1NmsxoQMrmBYg_yR_ZKZKoLiChvlpNqdwXwodXmgw_TRow7RVwYN0Y3CCIyiDdWRwgiMo"
  - "enr:-Iu4QLpJhdfRFsuMrAsFQOSZTIW1PAf7Ndg0GB0tMByt2-n1bwVgLsnHOuujMg-YLns9g1Rw8rfcw1KCZjQrnUcUdekNgmlkgnY0gmlwhA01ZgSJc2VjcDI1NmsxoQPk2OMW7stSjbdcMgrKEdFOLsRkIuxgBFryA3tIJM0YxYN0Y3CCIyiDdWRwgiMo"
  - "enr:-Iu4QBHuAmMN5ogZP_Mwh_bADnIOS2xqj8yyJI3EbxW66WKtO_JorshNQJ1NY8zo-u3G7HQvGW3zkV6_kRx5d0R19bETgmlkgnY0gmlwhDRCMUyJc2VjcDI1NmsxoQJZ8jY1HYauxirnJkVI32FoN7_7KrE05asCkZb7nj_b-YN0Y3CCIyiDdWRwgiMo"

How to retrieve IP address and Port from the ENR? How do I know that this format is using my node's public IP address and not the local or private IP address?

What's the gain by not being easily able to verify the IP address?

4
  • 1
    The answer to your last question is allegedly in the Motivation section, pretty much at the top of the web-page that you've linked. It lists two reason: 1. Improve cryptographic agility (pretty obscure, since it is just stated, but not actually explained in any manner). 2. Allow every node to determine the actual endpoint of some other node which has changed its endpoint and publishes a new record (i.e., the protocol allows to determine which record is newer). Again, it is not explained why encrypting the IP is needed here to begin with, since a sequence number should suffice. Mar 18, 2020 at 10:35
  • Regarding your first question, I doubt that it is possible to retrieve the data contained in the ENR, because it is not encrypted, but signed. In opposed to encryption, where the private key owner can decrypt the encrypted data and obtain the original data, with signature, the private key owner (or anyone else for that matter) cannot decrypt the encrypted data and obtain the original data. Signature is designated for verification (by everyone), not for decryption. Mar 18, 2020 at 10:40
  • Of course, the private key owner probably has the original data to begin with, but that doesn't matter in the context of this question (since you're obviously not the private key owner). Mar 18, 2020 at 10:46
  • 1
    the enr is not encrypted. It is rlp encoded and signed with the private key.
    – pd176
    Mar 20, 2020 at 11:54

2 Answers 2

2

There is also a rust enr-cli library to assist with decoding ENR strings.

You can install it via cargo install enr-cli --version 0.1.0-alpha

An example of its use is:

$ enr-cli -e -Iu4QGuiaVXBEoi4kcLbsoPYX7GTK9ExOODTuqYBp9CyHN_PSDtnLMCIL91ydxUDRPZ-jem-o0WotK6JoZjPQWhTfEsTgmlkgnY0gmlwhDbOLfeJc2VjcDI1NmsxoQLVqNEoCVTC74VmUx25USyFe7lL0TgpXHaCX9CDy9H6boN0Y3CCIyiDdWRwgiMo  
ENR Read
Sequence No: 19
Node ID: 0x0fd2..5fd3
IP: 54.206.45.247
TCP Port: 9000
UDP Port: 9000
1

You can use the enr library (written in rust).

use enr::Enr;

fn main() {
    let enr_string = "-Iu4QGuiaVXBEoi4kcLbsoPYX7GTK9ExOODTuqYBp9CyHN_PSDtnLMCIL91ydxUDRPZ-jem-o0WotK6JoZjPQWhTfEsTgmlkgnY0gmlwhDbOLfeJc2VjcDI1NmsxoQLVqNEoCVTC74VmUx25USyFe7lL0TgpXHaCX9CDy9H6boN0Y3CCIyiDdWRwgiMo";

    let enr: Enr = enr_string.parse().unwrap();
    println!(
        "Enr ip: {}, tcp port: {}",
        enr.ip().unwrap(),
        enr.tcp().unwrap()
    );
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.