Fabric源碼分析-生成Channel文件

Channel提供了多賬本的功能姻几,我們創(chuàng)建Channel時首先就是要配置聯(lián)盟和Channel中包含的組織敛纲,之后使用configtxgen生成Channel文件,這個文件內(nèi)部其實就是創(chuàng)建賬本所需要的配置更新。

1.使用

從fabric源碼中復(fù)制一份configtx拜鹤,對其進(jìn)行修改

cp $GOPATH/src/github.com/hyperledger/fabric/sampleconfig/configtx.yaml .

設(shè)置一個生成Channe的配置闽巩,OrdererOrg/CoreOrg/SupplierOrg/BankOrg需要進(jìn)行配置钧舌,在此省略

TestTwoOrgsChannel:
        Consortium: SampleConsortium
        Application:
            Organizations:
                - *CoreOrg
                - *SupplierOrg
                - *BankOrg

最后,使用下面的命令就可以生成創(chuàng)世塊了

configtxgen -profile TestTwoOrgsChannel -outputCreateChannelTx ./mychannel.tx -channelID mychannel

2.程序分析

configtxgen的程序在common/tools/configtxgen/main.go中涎跨,主要的功能是獲取配置文件洼冻,生成ConfigUpdate,包裝為一個ConfigUpdate的交易并寫入文件隅很。主流程是:

  1. factory.InitFactories(nil) 初始化BCCSP撞牢,用來為加密提供服務(wù)。
  2. 獲取指定profile的配置叔营,將其序列化為Profile類型屋彪。
  3. 我們設(shè)置了outputChannelCreateTx,因此會執(zhí)行doOutputChannelCreateTx方法绒尊。
  4. 創(chuàng)建一個用來創(chuàng)建Channel的交易畜挥,將其寫入文件。

2.1 創(chuàng)建Channel的交易文件

有了Profile配置婴谱,首先創(chuàng)建一個ConfigUpdate蟹但,將其包裝到ConfigUpdateEnvelope中,之后序列化作為Data勘究,添加Header后形成Payload矮湘,最后添加簽名,封裝為Envelope并返回口糕。


channeltx的內(nèi)容

因此缅阳,我們需要將主要邏輯聚焦于ConfigUpdate的內(nèi)容。

2.2 ConfigGroup

NewChannelCreateConfigUpdate方法會生成一個ConfigUpdate,ConfigUpdate會被發(fā)送到orderer來創(chuàng)建一個新的Channel十办,該方法根據(jù)指定的profile的配置中的Application秀撇,創(chuàng)建Application的ConfigGroup,ConfigGroup可以理解為一個配置樹型向族,Application中包含了Organizations呵燕,Organizations中是三個Org,因此件相,最終會形成一個Application的配置樹再扭。ConfigGroup的結(jié)構(gòu)可以參考ConfigGroup,Application的Groups中是組織的配置夜矗,在NewApplicationOrgGroup中泛范,會對Org的配置組裝,讀取并驗證MSP的相關(guān)證書紊撕。

2.3 ConfigUpdate

上面只是將配置轉(zhuǎn)化為ConfigGroup組成的配置樹罢荡,接下來就是計算ConfigUpdate了,也就是計算配置有那些更新对扶。計算的程序如下区赵,首先會創(chuàng)建一個新的ConfigGroup,其Groups子配置有一個Application浪南,對應(yīng)這我們之前生成的Application的Config笼才,這是因為在TestTwoOrgsChannel中,Application是作為一個子級逞泄,需要將其放在一個Root配置下患整。

newChannelGroup = &cb.ConfigGroup{
  Groups: map[string]*cb.ConfigGroup{
    channelconfig.ApplicationGroupKey: ag,
  },
}

template = proto.Clone(newChannelGroup).(*cb.ConfigGroup)
template.Groups[channelconfig.ApplicationGroupKey].Values = nil
template.Groups[channelconfig.ApplicationGroupKey].Policies = nil

之后,克隆了一份新創(chuàng)建的ConfigGroup喷众,將其Application的子ConfigGroup的Value和Policy設(shè)置為nil各谚,之前我們在2.2節(jié)構(gòu)造ConfigGroup時,ConfigGroup會設(shè)置默認(rèn)的一些Ploicy到千,如果配置了Capabilities昌渤,已經(jīng)設(shè)置Value

addImplicitMetaPolicyDefaults(applicationGroup)

if len(conf.Capabilities) > 0 {
  addValue(applicationGroup, channelconfig.CapabilitiesValue(conf.Capabilities), channelconfig.AdminsPolicyKey)
}

template的修改勢必會造成配置發(fā)生變化,因此下一步就是計算兩個ConfigGroup的更新了憔四,我們以template作為原來的配置膀息,newChannelGroup最為更新之后的配置,計算哪些配置發(fā)生了更新了赵。雖然這里我們還容易看出來發(fā)生了那些變化潜支,但是為了統(tǒng)一處理,還是進(jìn)行了計算(如果設(shè)置了orderingSystemChannelGroup的話柿汛,template的方式就不是這么簡單的克隆后修改了)冗酿。

計算方法

主要是遍歷原ConfigGroup的Policy,Value和ConfigGroup,將未發(fā)生變化的部分保存到sameSet裁替,發(fā)送變化后的配置保存到writeSet中且版本號加1项玛。最后,如果未發(fā)生變化弱判,返回的ConfigUpdate的ReadSet和WriteSet均為nil襟沮,如果發(fā)生了變化,將sameSet分別賦值給ReadSet和WriteSet昌腰,保證未發(fā)生變化的部分在兩個Set中都存在开伏。這樣我們就知道了發(fā)生變化前后的配置。
根據(jù)之前template的生成方式遭商,我們可以查看最后的讀寫集合


ConfigUpdate

在上圖中硅则,ReadSet的Application的version為0,WriteSet中version為1,說明發(fā)生了變化,通過觀察株婴,我們看到ConfigGroup的Policies發(fā)生了變化,這與template的修改相符合暑认。其實最終的ConfigUpdate就是要通知困介,Application的Policy發(fā)生了變化,如果設(shè)置了某些配置參數(shù)的話蘸际,Value也會發(fā)生變化座哩。

計算出來ConfigUpdate,最后封裝為Envelope后粮彤,寫入文件中根穷,整個流程就結(jié)束了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末导坟,一起剝皮案震驚了整個濱河市屿良,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惫周,老刑警劉巖尘惧,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異递递,居然都是意外死亡喷橙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門登舞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贰逾,“玉大人,你說我怎么就攤上這事菠秒「斫#” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長核芽。 經(jīng)常有香客問我囚戚,道長,這世上最難降的妖魔是什么轧简? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任驰坊,我火速辦了婚禮,結(jié)果婚禮上哮独,老公的妹妹穿的比我還像新娘拳芙。我一直安慰自己,他們只是感情好皮璧,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布舟扎。 她就那樣靜靜地躺著,像睡著了一般悴务。 火紅的嫁衣襯著肌膚如雪睹限。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天讯檐,我揣著相機(jī)與錄音羡疗,去河邊找鬼。 笑死别洪,一個胖子當(dāng)著我的面吹牛叨恨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挖垛,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼痒钝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了痢毒?” 一聲冷哼從身側(cè)響起送矩,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎闸准,沒想到半個月后益愈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡夷家,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年蒸其,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片库快。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡摸袁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出义屏,到底是詐尸還是另有隱情靠汁,我是刑警寧澤蜂大,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站蝶怔,受9級特大地震影響奶浦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜踢星,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一澳叉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沐悦,春花似錦成洗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至副签,卻和暖如春遥椿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背淆储。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工修壕, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人遏考。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蓝谨,于是被迫代替她去往敵國和親灌具。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容