我总是努力保持模块整齐分离并避免循环依赖。
现在我有这样的代码:
package chain
type 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)或从其他任何地方获取块时,我不仅可以访问块,还可以访问有关此状态的信息挡住了。
另一方面,我希望保留仅与特定共识算法相关的数据与基本块数据分开 - 甚至可能在单独的包中。
我应该如何设计我的程序?我应该在哪里保留与特定共识算法相关的数据?
一些背景信息:
我正在尝试从头开始构建一个块链应用程序。我有一个负责存储数据块的“链”模块和一个“共识”模块,负责在运行我的程序实例的多个对等体之间建立关于该数据的共识。
答案 0 :(得分:3)
consensus.Block
和chain.Block
是两种不同的类型,但由于您在chain.Block
中嵌入consensus.Block
,因此您可以访问另一种类型。
只需在consensus.Block
中传递AddBlockToChain()
:
`func AddBlockToChain(block consensus.Block)`
然后通过以下方式访问它:block.Block
示例:
package main
import "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 :(得分:-1)
为了完整性,我想添加一个解决方案,将协商一致算法的代码和数据保存在与块和链代码不同的包中:
在块中添加一个额外的字段,如下所示:
Extra []byte
然后将结果算法所需的额外数据保存在结构中的算法包中,并将其编码为json或其他格式,以将其存储在额外字段中。
此解决方案将单独的问题分开。没有一致性算法,链条就没有意义,但它们看起来非常不同,可能需要不同的数据。这样,不同的算法可以存储不同的数据。
但是我没有使用这个解决方案,因为将所有代码保存在一个包中似乎更简单,就像@syntagma建议的那样。