golang分离关注点与可用性

时间:2017-05-30 08:55:45

标签: inheritance go module architecture structure

我总是努力保持模块整齐分离并避免循环依赖。

现在我有这样的代码:

    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)或从其他任何地方获取块时,我不仅可以访问块,还可以访问有关此状态的信息挡住了。

另一方面,我希望保留仅与特定共识算法相关的数据与基本块数据分开 - 甚至可能在单独的包中。

我应该如何设计我的程序?我应该在哪里保留与特定共识算法相关的数据?

一些背景信息:

我正在尝试从头开始构建一个块链应用程序。我有一个负责存储数据块的“链”模块和一个“共识”模块,负责在运行我的程序实例的多个对等体之间建立关于该数据的共识。

2 个答案:

答案 0 :(得分:3)

consensus.Blockchain.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建议的那样。