问:golang分离关注点与可用性
10LK
我一直在努力使go模块整齐地分开,并避免循环依赖。
现在我有这样的代码:
package chaintype Block struct{ Content []byte Number int}var Chain []Block = make([]Block, 10)func AddBlockToChain(block Block){ // do some checks //... // add to chain Chain[block.Number] = block}func GetBlock(number int) Block { // do some checks // ... // get from chain return Chain[number]}
为了达成共识,我需要一些额外的信息。信息可能会有所不同,具体取决于我使用的共识算法。我希望共识算法可以互换(例如通过启动时的标志)。
将信息存储为块中的字段会很方便,这样,当我调用GetBlock(3)或从其他任何地方获取块时,我不仅可以访问该块,而且还可以获取有关该块处于何种共识状态的信息在这一刻。
另一方面,我想将仅与某种共识算法相关的数据与基本块数据分开,甚至可能放在单独的程序包中。
我应该如何设计我的程序?我应该在什么地方保留与某个共识算法相关的数据?
一些背景信息:
我正在尝试从头开始构建一个区块链应用程序。我有一个“链”模块负责存储数据块,还有一个“共识”模块负责在运行我的程序实例的多个同级之间就该数据是什么达成共识。
请先登陆或注册
consensus.Block
和chain.Block
是两种不同的类型,但是由于您是嵌入chain.Block
在中的consensus.Block
,因此可以从另一种类型访问。
只是通过consensus.Block
在AddBlockToChain()
:
`func AddBlockToChain(block consensus.Block)`
然后通过以下方式访问它: block.Block
例:
package mainimport "fmt"type ChainBlock struct { id int}type ConsensusBlock struct { ChainBlock idCons int}func printChainBlockId(consBlock ConsensusBlock) { fmt.Println(consBlock.ChainBlock.id)}func main() { test := ConsensusBlock{ ChainBlock: ChainBlock{ id: 42, }, idCons: 44, } printChainBlockId(admin)}



1条回答
