public static InitiatorHandshakeMessageV4 decode(final Bytes bytes, final NodeKey nodeKey) {
    final RLPInput input = new BytesValueRLPInput(bytes, true);
    input.enterList();
    final SECPSignature signature = SIGNATURE_ALGORITHM.get().decodeSignature(input.readBytes());
    final SECPPublicKey pubKey = SIGNATURE_ALGORITHM.get().createPublicKey(input.readBytes());
    final Bytes32 nonce = input.readBytes32();
    final Bytes32 staticSharedSecret = nodeKey.calculateECDHKeyAgreement(pubKey);
    final SECPPublicKey ephPubKey =
        SIGNATURE_ALGORITHM
            .get()
            .recoverPublicKeyFromSignature(staticSharedSecret.xor(nonce), signature)
            .orElseThrow(() -> new RuntimeException("Could not recover public key from signature"));

    return new InitiatorHandshakeMessageV4(pubKey, signature, ephPubKey, nonce);
  }
Decodes this message.

@param bytes The raw bytes.
@param nodeKey Abstraction of the local nodes keys and associated cryptographic operations
@return The decoded message.
ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/rlpx/handshake/ecies/InitiatorHandshakeMessageV4.java