如何解析chaincode package文件

如何解析chaincode package文件

背景
在做chaincode instanticate的時候碰到如下錯誤:
Error: Error endorsing query: rpc error: code = Unknown desc = error executing chaincode: could not get ChaincodeDeploymentSpec for {ccname}:{ccversion}: get ChaincodeDeploymentSpec for {ccname}/{channel} from LSCC error: chaincode fingerprint mismatch data mismatch - <nil>

原因是
首先peer在安裝chaincode的時候會把chaincode安裝到路徑下面:/var/hyperledger/production/chaincodes/{ccname}.{ccversion}盏道,這是一個chaincode package格式文件砖顷,包含chaincode的打包源文件(tar.gz),和其他信息句占。

然后peer在第一次instanticate chaincode的時候會把chainocde的驗證信息寫到channel的state db里面淘菩,這樣當(dāng)chaincode死掉再重新instantiate的時候综芥,會驗證chaincode的package是否已經(jīng)發(fā)生過變化硬爆,對照從chaincode package中讀取的hash值是否和state db里面已經(jīng)存儲的hash值是否一致古瓤。

$ cat fabric/core/common/ccprovider/cdspackage.go
// ValidateCC returns error if the chaincode is not found or if its not a
// ChaincodeDeploymentSpec
func (ccpack *CDSPackage) ValidateCC(ccdata *ChaincodeData) error {
    if ccpack.depSpec == nil {
        return fmt.Errorf("uninitialized package")
    }

    if ccpack.data == nil {
        return fmt.Errorf("nil data")
    }

    if ccdata.Name != ccpack.depSpec.ChaincodeSpec.ChaincodeId.Name || ccdata.Version != ccpack.depSpec.ChaincodeSpec.ChaincodeId.Version {
        return fmt.Errorf("invalid chaincode data %v (%v)", ccdata, ccpack.depSpec.ChaincodeSpec.ChaincodeId)
    }

    otherdata := &CDSData{}
    err := proto.Unmarshal(ccdata.Data, otherdata)
    if err != nil {
        return err
    }

    // Here verify the hash value whether same ?
    if !ccpack.data.Equals(otherdata) {
        return fmt.Errorf("data mismatch")
    }

    return nil
}

如果不一致赢织,chaincode instantiate就會失敗亮靴,報上述錯誤。

下面程序就是讀取chaincode package的內(nèi)容把其中的chaincode代碼包于置,和hash值取出來茧吊。

package main

import (
       "fmt"
       "io/ioutil"

    pb "github.com/hyperledger/fabric/protos/peer"
       "github.com/hyperledger/fabric/core/common/ccprovider"
       "github.com/golang/protobuf/proto"
)


/**
 * This tool will extrace chaincode tar.gz package from chaincode CDSPackage
 *  Chaincode package are named format as: ccname.ccversion, and
 *  placed under path set by SetChaincodesPath
 * Output:
 *  chaincode tar.gz file
 *  chaincode code and meta hash value
 */
func main() {

    ccprovider.SetChaincodesPath("/var/hyperledger/production/chaincodes")

    var ccpack  *ccprovider.CDSPackage = &ccprovider.CDSPackage{}
    var cdsdata *pb.ChaincodeDeploymentSpec
    _, cdsdata, err := ccpack.InitFromFS("{ccname}", "{ccversion}")
    if err != nil {
        fmt.Printf("ERROR: Cannot load chaincode package, error=[%v]\n", err)
        return
    }

    var ccdata *ccprovider.ChaincodeData = ccpack.GetChaincodeData()
    otherdata := &ccprovider.CDSData{}
    err = proto.Unmarshal(ccdata.Data, otherdata)
    if err != nil {
        fmt.Printf("ERROR: Cannot unmarshal chaincode data, error=[%v]\n", err)
        return
    }

    ioutil.WriteFile("chaincode.tar.gz",    cdsdata.CodePackage, 0644)
    ioutil.WriteFile("chaincode.code.hash", []byte(fmt.Sprintf("%v\n", otherdata.CodeHash)), 0644)
    ioutil.WriteFile("chaincode.meta.hash", []byte(fmt.Sprintf("%v\n", otherdata.MetaDataHash)), 0644)

    fmt.Printf("Done\n")
}

我們可以解開chaincode.tar.gz查看chaincode文件的內(nèi)容,注意chaincode.tar.gz的文件格式八毯,是一個tar文件搓侄,也就是說包含原始代碼文件的meta信息,比如讀寫權(quán)限话速,owner/group讶踪,時間戳等等等信息(好在fabric在打包的時候重寫了其中的很多項目,例如把時間戳全部清零了泊交,把owner/group也清零了乳讥,etc)柱查,只要有任何一個域值不一致,整個tar.gz文件就不一致云石,進(jìn)而生成的hash值就不一致唉工。

詳細(xì)tar文件格式請參與:
https://www.gnu.org/software/tar/manual/html_node/Standard.html

另外注意不同的fabric版本,不同的go語言版本(tar庫版本)汹忠,甚至不同的安裝方式(SDK酵紫,peer命令行安裝)都可能導(dǎo)致產(chǎn)生的chaincode package不一樣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末错维,一起剝皮案震驚了整個濱河市奖地,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赋焕,老刑警劉巖参歹,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異隆判,居然都是意外死亡犬庇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門侨嘀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臭挽,“玉大人,你說我怎么就攤上這事咬腕』斗澹” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵涨共,是天一觀的道長纽帖。 經(jīng)常有香客問我,道長举反,這世上最難降的妖魔是什么懊直? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮火鼻,結(jié)果婚禮上室囊,老公的妹妹穿的比我還像新娘。我一直安慰自己魁索,他們只是感情好融撞,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蛾默,像睡著了一般懦铺。 火紅的嫁衣襯著肌膚如雪捉貌。 梳的紋絲不亂的頭發(fā)上支鸡,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天冬念,我揣著相機(jī)與錄音,去河邊找鬼牧挣。 笑死急前,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瀑构。 我是一名探鬼主播裆针,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寺晌!你這毒婦竟也來了世吨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤呻征,失蹤者是張志新(化名)和其女友劉穎耘婚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陆赋,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡沐祷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了攒岛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赖临。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖灾锯,靈堂內(nèi)的尸體忽然破棺而出兢榨,到底是詐尸還是另有隱情,我是刑警寧澤顺饮,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布色乾,位于F島的核電站,受9級特大地震影響领突,放射性物質(zhì)發(fā)生泄漏暖璧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一君旦、第九天 我趴在偏房一處隱蔽的房頂上張望澎办。 院中可真熱鬧,春花似錦金砍、人聲如沸揽碘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽樊诺。三九已至,卻和暖如春鹅巍,著一層夾襖步出監(jiān)牢的瞬間千扶,已是汗流浹背料祠。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留澎羞,地道東北人髓绽。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像妆绞,于是被迫代替她去往敵國和親顺呕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

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