以太坊地址和公钥_以太坊中的网络地址

本文介绍了以太坊生态中的三种网络地址类型:多地址(Multiaddr)、enode URL和ENR(以太坊节点记录)。多地址是Protocol Labs的多格式项目一部分,具有二进制和可读格式。enode URL用于表示节点ID和连接信息,而ENR结合了前两者的特点,包含更多节点信息并用签名验证。Eth2.0的P2P规范中,ENR与多地址有更深入的整合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:Dean Eigenmann 编译:Unitimes_David

本文将概述多地址,ENR 和 enode 这三类网络地址。

2982d18d393c97718ce13617f00ced21.png

在与 Felix Lange 讨论之后,我认为攥写这篇关于在以太坊生态中遇到的各类网络地址及其差异的文章是很有意义的。我自身对它们理解也存在着些误区,因而觉得对其进行阐述会很有价值。 多地址 (Multiaddr)

让我们从最早或按 commit 时间来看最早被归档的多地址 (Multiaddr[1]) 开始。多地址是 Protocol Labs 的多格式项目(multiformats project)的一部分。多格式本质上是自描述值的各种规范。由于被广泛用于libp2p,IPFS 以及其它 Protocol Labs 的项目,你可能早就听说过它们。 多地址有两种表示形式:一种是存储或传输时使用的二进制表示;另一种是提供给用户的可读格式。 /ip4/127.0.0.1/udp/1234 上面展示了一个以可读格式表示的多地址。该多地址是一种以键值对来表示地址的可递归格式。(笔者注,地址可表达为{, })。二进制表示也是相同的——有一个字节数组表示键,还有一个用于表示值。键可以通过协议表[2]从可读形式映射为代码形式。 enode

接下来就是enode[3]。enode并不是真正的网络地址格式而是 url 格式。由于 enode 是 ENR 的前身,我们仍会介绍它。一个 enode URL 如下所示: enode://6f8a80d6ad92a0@10.3.58.6:30303?discport=30301 enode体系被用于表示URL。enode://后面跟着一个十六进制编码的节点ID。接下来,@符号后面表示的是主机,其必须为一个IP地址。主机后面列出了TCP端口,在我们的例子中为30303。若UDP和TCP的端口不同,UDP端口可通过在末尾添加discport参数来指定。 ENR

最后我们来介绍 ENR[4](以太坊节点记录)。ENR很有趣,原因在于其皆使用了前两种类型(多地址和enode URL)的特性,使得它变得十分通用。ENR的主要动机是允许转发过程中携带更多的信息,因而引入了节点记录。节点记录是自证的,而且节点可通过签名来鉴别身份。这些记录被表示为一个RLP列表[5]——此处我不会进行详细介绍,但稍微提及一下,RLP是以太坊使用的一种序列化格式。

节点记录包含了一个签名,序列号与一个表明用于创建和验证签名的身份认证机制所需的字段。最后,记录的其余部分包含了任意键值对,这些键值对可包含诸如连接信息之类的东西。EIP定义了一些具有预定义含义的键,如ip,其为4字节表示的节点IPv4地址。

签名被用于通过确保传递的公钥为创建签名所使用的公钥来验证记录。

如果同一个身份签发了2个不同的记录,那么序列号可用于解决冲突:规定使用序列号较大的记录。

需要注意的是,节点记录的RLP编码版本号不能超过300字节。

该格式是面向未来的,新键即使在部分客户端不能解析的情况下仍能被添加,以及新的身份认证机制可被添加以检验签名。

Eth 2.0

现在,让我们来看看 Eth2.0。在 Eth2.0 之前,以太坊中从未使用过多地址,而其现在变得非常重要。为什么?因为 Eth2.0 使用 libp2p,而 libp2p 又使用多地址来识别节点。

那么,我们该怎么处理这种情况呢?Eth2.0 的 P2P规范[6] 展示了2种方案:

多地址可从ENR导出

由于ENR能够添加任意键,多地址能被包含在ENR中。

希望本文能够给出一个关于不同的网络地址是什么,这些地址间的区别,工作方式以及用途的精简概要。

原文链接:

https://dean.eigenmann.me/blog/2020/01/21/network-addresses-in-ethereum/[10]

参考链接:

[1]https://multiformats.io/multiaddr/

[2]https://github.com/multiformats/multiaddr/blob/master/protocols.csv

[3]https://github.com/ethereum/wiki/wiki/enode-url-format

[4]https://eips.ethereum.org/EIPS/eip-778

[5]https://github.com/ethereum/wiki/wiki/rlp

[6]https://github.com/ethereum/eth2.0-specs/blob/065b4ef856aeb7f84f1bed5c4a2cd4d6ac1edc87/specs/phase0/p2p-interface.md#what-is-the-difference-between-an-enr-and-a-multiaddr-and-why-are-we-using-enrs

以太坊地址公钥是通过椭圆曲线加密算法生成的。在以太坊中,每个账户都有一个唯一的以太坊地址公钥以太坊公钥私钥也是通过椭圆曲线加密算法生成的。私钥用于对数据进行加密,公钥用于对数据进行解密。 下面是一个简单的示例,展示如何使用以太坊公钥私钥对数据进行加解密: 1. 生成公钥私钥 在以太坊中,可以使用任何一个以太坊钱包生成公钥私钥。例如,可以使用 MetaMask 钱包生成公钥私钥。 2. 加密数据 要加密数据,可以使用以太坊公钥私钥。以下是一个示例加密函数: ```solidity function encrypt(string memory message, address publicKey) public view returns (bytes32) { bytes32 encrypted = keccak256(abi.encodePacked(message, publicKey)); return encrypted; } ``` 在这个函数中,我们使用 keccak256 哈希函数对消息公钥进行加密。 3. 解密数据 要解密数据,可以使用以太坊公钥私钥。以下是一个示例解密函数: ```solidity function decrypt(bytes32 encrypted, address privateKey) public view returns (string memory) { bytes32 decrypted = keccak256(abi.encodePacked(encrypted, privateKey)); return string(decrypted); } ``` 在这个函数中,我们使用 keccak256 哈希函数对加密后的消息私钥进行解密。 请注意,这只是一个简单的示例,实际上在以太坊中使用公钥私钥进行加解密需要更多的安全措施实现细节。建议在使用以太坊公钥私钥进行加解密时,始终遵循最佳实践安全标准。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值