IBC协议之 ics-024-host-requirements
Posted mutourend
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IBC协议之 ics-024-host-requirements相关的知识,希望对你有一定的参考价值。
1. 引言
ics-024-host-requirements 中,定义了实现IBC的host状态机所需实现的最小接口集合属性。
2. 动机
IBC设计为不同区块链和状态机之间的通用标准,因此必须明确定义host的要求。
IBC应设计为对底层状态机来说是尽可能简单的接口,以使正确实现最大化。
3. 技术说明
3.1 module system
host状态机必须支持module system,通过这种方式,自包含的、可能相互不信任的代码包可安全地运行在同一ledger上,控制它们如何以及何时允许其他模块与其通讯,并由a “master module” 或 execution environment来识别和操作。
IBC/TAO说明书中定义了2种module实现:
- 核心的"IBC handler" module
- “IBC relayer” module
IBC/APP说明书中进一步定义了处理应用逻辑的特定packet的module。
IBC要求“master module” 或 execution environment可用于 批准该host状态机上的其它module来访问 IBC handler module 和(或)IBC routing module,但除此之外,不会对可能位于状态机上的任何其他模块的功能或通信能力施加要求。
3.2 paths, identifiers, separators
“Indentifier”:为a bytestring,作为存储在state中object的key,如connection、channel 或 light client。
identifier必须为非空值(长度为正数)。
identifier必须包含以下字符类型中的一种:
- 字母
.
,_
,+
,-
,#
[
,]
,<
,>
“path”:为a bytestring,作为存储在state中object的key。paths中仅包含identifiers,constant strings以及分隔符“/”。
identifier并不打算成为有价值的资源-为了防止名称占用,可以实现最小长度要求或伪随机生成,但本规范不施加特殊限制。
分隔符“/”用于分隔和连接2个identifiers,或一个identifier + 1个constant bytestring。identifiers中不能包含“/”字符,以避免混淆。
插入的变量以大括号包围,作为定义path格式的简写,如client/clientIdentifier/consensusState
。
本规范中的所有identifier以及所有string,都应以ASCII编码。
默认,identifier中的字符具有最小最大长度限制:
Port identifier | Client identifier | Connection identifier | Channel identifier |
---|---|---|---|
2 - 128 | 9 - 64 | 10 - 64 | 10 - 64 |
3.3 key/value store
host 状态机必须提供key/value store接口,至少有以下三个函数:
- get:
type get = (path: Path) => Value | void
- set
type set = (path: Path, value: Value) => void
- delete
type delete = (path: Path) => void
其中的Pathd定义见3.2节。Value为任意bytestring encoding of a particular data structure。
以上三个函数必须仅对IBC handler module许可授权,因此,仅IBC handler module可set
或delete
其通过get
读到的path。可实现为a sub-store (prefixed key-space) of a larger key/value store used by the entire state machine。
host状态机必须为该接口实现2个实例:
- 1)
provableStore
:for storage read by (i.e. proven to) other chains。- MUST write to a key/value store whose data can be externally proved with a vector commitment as defined in ICS 23.
- MUST use canonical data structure encodings provided in these specifications as proto3 files
- 2)
privateStore
: for storage local to the host, upon whichget
,set
, anddelete
can be called, e.g.provableStore.set('some/path', 'value')
。- MAY support external proofs, but is not required to - the IBC handler will never write data to it which needs to be proved.
- MAY use canonical proto3 data structures, but is not required to - it can use whatever format is preferred by the application environment.
注意:任意实现了以上方法和属性的key/value store接口对于IBC就足够了。
3.4 path-space
当前,IBC/TAO中为provableStore
和privateStore
推荐了如下path前缀:【注意下一client-related paths反应了ICS7中定义的Tendermint client,若为其它client,相关定义可能不同。】
Store | Path format | Value type | Defined in |
---|---|---|---|
provableStore | “clients/identifier/clientType” | ClientType | ICS 2 |
privateStore | “clients/identifier/clientState” | ClientState | ICS 2 |
provableStore | “clients/identifier/consensusStates/height” | ConsensusState | ICS 7 |
privateStore | "clients/identifier/connections | []Identifier | ICS 3 |
provableStore | “connections/identifier” | ConnectionEnd | ICS 3 |
privateStore | “ports/identifier” | CapabilityKey | ICS 5 |
provableStore | “channelEnds/ports/identifier/channels/identifier” | ChannelEnd | ICS 4 |
provableStore | “nextSequenceSend/ports/identifier/channels/identifier” | uint64 | ICS 4 |
provableStore | “nextSequenceRecv/ports/identifier/channels/identifier” | uint64 | ICS 4 |
provableStore | “nextSequenceAck/ports/identifier/channels/identifier” | uint64 | ICS 4 |
provableStore | “commitments/ports/identifier/channels/identifier/sequences/sequence” | bytes | ICS 4 |
provableStore | “receipts/ports/identifier/channels/identifier/sequences/sequence” | bytes | ICS 4 |
provableStore | “acks/ports/identifier/channels/identifier/sequences/sequence” | bytes | ICS 4 |
3.5 module布局
host状态机上modules布局为:(Aardvark、Betazoid 和 Cephalopod 为任意modules)
+----------------------------------------------------------------------------------+
| |
| Host State Machine |
| |
| +-------------------+ +--------------------+ +----------------------+ |
| | Module Aardvark | <--> | IBC Routing Module | | IBC Handler Module | |
| +-------------------+ | | | | |
| | Implements ICS 26. | | Implements ICS 2, 3, | |
| | | | 4, 5 internally. | |
| +-------------------+ | | | | |
| | Module Betazoid | <--> | | --> | Exposes interface | |
| +-------------------+ | | | defined in ICS 25. | |
| | | | | |
| +-------------------+ | | | | |
| | Module Cephalopod | <--> | | | | |
| +-------------------+ +--------------------+ +----------------------+ |
| |
+----------------------------------------------------------------------------------+
3.6 consensus state introspection
host 状态机:
- 必须提供
getCurrentHeight
函数获取其当前height。 - 必须定义唯一的
ConsensusState
类型,实现ICS2要求,并可进行binary序列化。 - 必须提供
getConsensusState
函数获取其当前共识状态。getConsensusState
MUST return the consensus state for at least some numbern
of contiguous recent heights, wheren
is constant for the host state machine. Heights older thann
MAY be safely pruned (causing future calls to fail for those heights). - 必须提供
getStoredRecentConsensusStateCount
返回最近存储的n
个共识状态。
3.7 commitment path introspection
host 链:
- 必须提供
getCommitmentPrefix
函数返回commitment path。返回的CommitmentPrefix
(必须为常量)会作为host状态机key-value store的前缀。
type getCommitmentPrefix = () => CommitmentPrefix
与CommitmentRoot root
和 CommitmentState state
一起,满足如下属性:
if provableStore.get(path) === value
prefixedPath = applyPrefix(getCommitmentPrefix(), path)
if value !== nil
proof = createMembershipProof(state, prefixedPath, value)
assert(verifyMembership(root, proof, prefixedPath, value))
else
proof = createNonMembershipProof(state, prefixedPath)
assert(verifyNonMembership(root, proof, prefixedPath))
3.8 timestamp access
host 链 :
- 必须提供
currentTimestamp()
函数返回当前Unix timestamp。
为了在timeout中安全使用timestamp,后续headers的timestamp必须为非递减的。
参考资料
以上是关于IBC协议之 ics-024-host-requirements的主要内容,如果未能解决你的问题,请参考以下文章