Filecoin的地址

发布时间:2019年03月11日 价值:20000.00 / 共识:24

Filecoin的地址

Filecoin地址是引用Filecoin状态的actor的标识符。所有角色(矿工角色,存储市场角色,帐户角色)都有一个地址。该地址对关于角色所属的网络的信息,地址编码的特定类型,地址有效载荷本身和校验和进行编码。这种格式的目标是提供一种易于使用且容错性高的鲁棒性地址格式。

设计标准
  • 可识别:地址必须易于识别为Filecoin地址。
  • 可靠:地址必须提供一种机制,以便在可能在网络外部传输时进行错误检测。
  • 可升级:必须对地址进行版本控制,以允许引入新的地址格式。
  • 紧凑:鉴于上述限制,地址必须尽可能短。

规格

有两种方式可以表示Filecoin地址。出现在链上的地址将始终格式化为原始字节。地址也可以编码为字符串,该编码包括校验和和网络前缀。编码为字符串的地址永远不会出现在链中,此格式用于人类之间的共享。

字节

当表示为字节时,filecoin地址包含以下内容:

  • 标识此地址的类型和版本的协议指示符字节。
  • 用于根据协议唯一标识actor 的有效负载。

字节

  1. |----------|---------|
  2. | protocol | payload |
  3. |----------|---------|
  4. | 1 byte | n bytes |

当编码为字符串时,filecoin地址包含以下内容:

  • 一个网络前缀字符,用于标识该地址所属的网络。
  • 标识此地址的类型和版本的协议指示符字节。
  • 用于根据协议唯一标识参与者的有效负载。
  • 用于验证地址的校验和。

  1. |------------|----------|---------|----------|
  2. | network | protocol | payload | checksum |
  3. |------------|----------|---------|----------|
  4. | 'f' or 't' | 1 byte | n bytes | 4 bytes |

golang中的Filecoin地址示例:

  1. type Address struct {
  2. // 0: Mainnet
  3. // 1: Testnet
  4. Network byte
  5. // 0: ID
  6. // 1: Blake2b160-Hash of secp256k1 Public Key
  7. // 2: Blake2b160-Hash of Actor creation data
  8. // 3: BLS Public Key
  9. Protocol byte
  10. // raw bytes containing the data associated with protocol
  11. Payload []byte
  12. }

网络前缀

在编码为字符串时,网络前缀会附加到地址。网络前缀表示地址所属的网络。网络前缀可以是ffilecoin主网,也可以是filecoin testnet。值得注意的是,网络前缀永远不会出现在链上,仅在将地址编码为人类可读格式时使用。

协议标识符

该协议指示符字节描述了一种方法应如何解释在一个地址的有效载荷字段中的信息。必须为协议指定的算法和数据类型的任何偏差分配新的协议编号。通过这种方式,协议也可以作为版本。

  • 0 : ID
  • 1 :SECP256K1公钥
  • 2 :Actor
  • 3 :BLS公钥

golang中的示例描述:

  1. // Protocol byte
  2. type Protocol = byte
  3. const (
  4. ID Protocol = iota
  5. SECP256K1
  6. Actor
  7. BLS
  8. )
Protocol 0: IDs

协议0地址是简单的ID。所有角色都有一个数字ID,即使他们没有公钥。ID地址的有效负载是base10编码的。ID没有哈希值,也没有校验和。

字节

  1. |----------|---------------|
  2. | protocol | payload |
  3. |----------|---------------|
  4. | 0 | leb128-varint |

  1. |------------|----------|---------------|
  2. | network | protocol | payload |
  3. |------------|----------|---------------|
  4. | 'f' or 't' | '0' | leb128-varint |
  5. base10[...............]
Protocol 1: libsecpk1 Elliptic Curve Public Keys

协议1地址表示secp256k1公共加密密钥。有效负载字段包含公钥的Blake2b 160哈希。

字节

  1. |----------|---------------------|
  2. | protocol | payload |
  3. |----------|---------------------|
  4. | 1 | blake2b-160(PubKey) |

  1. |------------|----------|---------------------|----------|
  2. | network | protocol | payload | checksum |
  3. |------------|----------|---------------------|----------|
  4. | 'f' or 't' | '1' | blake2b-160(PubKey) | 4 bytes |
  5. base32[................................]
Protocol 2: Actor

协议2地址代表一个Actor。有效载荷字段包含由于创建actor而产生的有意义数据的Blake2b 160散列。

字节

  1. |----------|---------------------|
  2. | protocol | payload |
  3. |----------|---------------------|
  4. | 1 | blake2b-160(Random) |

  1. |------------|----------|-----------------------|----------|
  2. | network | protocol | payload | checksum |
  3. |------------|----------|-----------------------|----------|
  4. | 'f' or 't' | '2' | blake2b-160(Random) | 4 bytes |
  5. base32[..................................]
Protocol 3: BLS

协议3地址表示BLS公共加密密钥。有效载荷字段包含BLS公钥。

字节

  1. |----------|---------------------|
  2. | protocol | payload |
  3. |----------|---------------------|
  4. | 1 | 48 byte BLS PubKey |

  1. |------------|----------|---------------------|----------|
  2. | network | protocol | payload | checksum |
  3. |------------|----------|---------------------|----------|
  4. | 'f' or 't' | '3' | 48 byte BLS PubKey | 4 bytes |
  5. base32[................................]

有效负载

有效负载表示协议指定的数据。除了ID协议的有效载荷之外的所有有效载荷在被分类为其人类可读格式时使用小写字母进行base32编码。

校验和

使用blake2b-4通过地址协议和有效负载计算文件币校验和。校验和是base32编码的,只在编码为字符串时才添加到地址中。ID协议后面的地址没有校验和。

预计方法

除了校验和创建和验证之外,Filecoin中的所有实现都必须具有用于创建,编码和解码地址的方法。以下是地址接口的golang版本:

  1. func New(protocol byte, payload []byte) Address
  2. type Address interface {
  3. Encode(network Network, a Adress) string
  4. Decode(s string) Address
  5. Checksum(a Address) []byte
  6. ValidateChecksum(a Address) bool
  7. }

New()

New返回封装相应有效负载的指定协议的地址。未知协议的新功能失败。

  1. func New(protocol byte, payload []byte) Address {
  2. if protocol < SECP256K1 || protocol > BLS {
  3. Fatal(ErrUnknownType)
  4. }
  5. return Address{
  6. Protocol: protocol,
  7. Payload: payload,
  8. }
  9. }

Encode()
编码Filecoin地址的软件必须:

  • 产生编码到已知网络的地址
  • 产生编码为已知协议的地址
  • 生成一个有效校验和的地址(如果适用)

将地址编码为字符串,预先添加网络前缀,计算校验和,并将有效负载和校验和编码为base32。

  1. func Encode(network string, a Address) string {
  2. if network != "f" && network != "t" {
  3. Fatal("Invalid Network")
  4. }
  5. switch a.Protocol {
  6. case SECP256K1, Actor, BLS:
  7. cksm := Checksum(a)
  8. return network + a.Protocol + base32.Encode(a.Payload + cksm)
  9. case ID:
  10. return network + a.Protocol + base10.Encode(leb128.Decode(a.Payload))
  11. default:
  12. Fatal("invalid address protocol")
  13. }
  14. }

Decode()

解码Filecoin地址的软件必须:

  • 验证网络是否是已知网络。
  • 验证协议是一个已知协议的数量。
  • 验证校验和是否有效

通过删除网络前缀,验证地址是已知协议,解码有效负载和校验和以及验证校验和来解码字符串中的地址。

  1. func Decode(a string) Address {
  2. if len(a) < 3 {
  3. Fatal(ErrInvalidLength)
  4. }
  5. if a[0] != "f" && a[0] != "t" {
  6. Fatal(ErrUnknownNetwork)
  7. }
  8. protocol := a[1]
  9. raw := a[2:]
  10. if protocol == ID {
  11. return Address{
  12. Protocol: protocol,
  13. Payload: base10.Decode(raw),
  14. }
  15. }
  16. raw = base32.Decode(raw)
  17. payload = raw[:len(raw)-CksmLen]
  18. if protocol == SECP256K1 || protocol == Actor {
  19. if len(payload) != 20 {
  20. Fatal(ErrInvalidBytes)
  21. }
  22. }
  23. cksm := payload[len(payload)-CksmLen:]
  24. if !ValidateChecksum(a, cksm) {
  25. Fatal(ErrInvalidChecksum)
  26. }
  27. return Address{
  28. Protocol: protocol,
  29. Payload: payload,
  30. }
  31. }

Checksum()
校验和通过获取地址协议和有效负载的blake2b-4哈希来生成字节数组。

  1. func Checksum(a Address) [4]byte {
  2. blake2b4(a.Protocol + a.Payload)
  3. }

ValidateChecksum()
如果数据的校验和与预期的校验和匹配,则ValidateChecksum返回true。

  1. func ValidateChecksum(data, expected []byte) bool {
  2. digest := Checksum(data)
  3. return digest == expected
  4. }
  • 分享 收藏
0 条评论
  • 这篇文章暂无评论,赶紧评论一下吧~