HyperLedger Fabric chaincode 示例 -- 借貸

package main

import (
    "github.com/hyperledger/fabric/core/chaincode/shim"
    "github.com/hyperledger/fabric/protos/peer"
    "fmt"
    "bytes"
    "encoding/pem"
    "crypto/x509"
    "encoding/json"
    "time"
)

type Finance struct {

}

type Compact struct {
    Timestamp int64 `json:"timestamp"`
    Uid string `json:"uid"`
    LoanAmount string `json:"loanAmount"`
    ApplyDate string `json:"applyDate"`
    CompactStartDate string `json:"compactStartDate"`
    CompactEndDate string `json:"compactEndDate"`
    RealEndDate string `json:"realEndDate"`
}

func Loan(stub shim.ChaincodeStubInterface, args []string, name string) {
    fmt.Println("in Loan ...")
    var compact Compact
    compact.Uid = args[0]
    compact.LoanAmount = args[1]
    compact.ApplyDate = args[2]
    compact.CompactStartDate = args[3]
    compact.CompactEndDate = args[4]
    compact.Timestamp = time.Now().Unix()

    compactJsonBytes, err := json.Marshal(&compact)
    fmt.Println(string(compactJsonBytes))
    if err != nil {
        fmt.Println("json serialize compact fail, compact id = ",args[5])
    }

    key, err2 := stub.CreateCompositeKey("compact", []string{name, args[5]})
    if err2 != nil {
        fmt.Printf("failed to CreateCompositeKey, %s", err)
    }
    fmt.Println("key:",key)

    err3 := stub.PutState(key, compactJsonBytes)
    fmt.Println("put state err:", err3)
    if err3 != nil {
        fmt.Printf("failed to putstate, compact id = " + args[5])
    }
}

func (t *Finance) Init(stub shim.ChaincodeStubInterface) peer.Response{
    fmt.Println("Init ...")
    return shim.Success(nil)
}

func (t *Finance) Invoke(stub shim.ChaincodeStubInterface) peer.Response {
    fmt.Println("Invoke ...")
    fn, args := stub.GetFunctionAndParameters()

    switch fn {
    case "loan":
        return loan(stub, args)
    case "get":
        return get(stub, args)
    default:
        return shim.Error("func name wrong")
    }

}

func get(stub shim.ChaincodeStubInterface, args []string) peer.Response {
    fmt.Println("in get ...")
    fmt.Println(args[0])

    value, err := stub.GetState(args[0])
    if err != nil {
        fmt.Errorf("failed to get asset %s", args[0])
    }

    fmt.Println("get val: ", string(value))

    return shim.Success(nil)
}

func loan(stub shim.ChaincodeStubInterface, args []string) peer.Response {
    fmt.Println("loan ...")

    name,err := GetCreatorName(stub)
    if err != nil {
        return shim.Error(err.Error())
    }
    fmt.Println("name:", name)

    key := "compact" + name + args[5]

    fmt.Println("key:",key)

    var compact Compact
    compact.Uid = args[0]
    compact.LoanAmount = args[1]
    compact.ApplyDate = args[2]
    compact.CompactStartDate = args[3]
    compact.CompactEndDate = args[4]
    compact.Timestamp = time.Now().Unix()

    compactJsonBytes, err := json.Marshal(&compact)

    stub.PutState(key, compactJsonBytes)

    return shim.Success([]byte("loan ok"))
}

func GetCreatorName(stub shim.ChaincodeStubInterface) (string, error){
    name, err := Getcreator(stub)
    if err != nil {
        return "", err
    }
    return name, err
}

func Getcreator(stub shim.ChaincodeStubInterface) (string, error) {
    creator, _ := stub.GetCreator()
    certStart := bytes.IndexAny(creator, "-----BEGIN CERTIFICATE-----")
    certText := creator[certStart+9:]
    fmt.Println(string(certText))
    block, err := pem.Decode(certText)
    if err != nil {
        fmt.Errorf("pem.Decode err: %s", err)
    }
    ucert, err2 := x509.ParseCertificate(block.Bytes)
    if err2 != nil {
        fmt.Errorf("Error received on ParseCertificate", err2)
    }

    uname:=ucert.Subject.CommonName
    fmt.Println(uname)

    return uname, nil

}

func main() {
    err := shim.Start(new(Finance))
    if err != nil {
        fmt.Printf("Chaincode 啟動(dòng)失敽采唷:%s", err)
    }
}

測(cè)試:

peer chaincode invoke -C myc -n finance -c '{"Args":["loan", "O8yTkeBYU3J9otEdOpr9fNR4bE1sHgQ2", "200000", "20180806080812", "20180807080812", "20190807080812", "000011"]}'

peer chaincode invoke -C myc -n finance -c '{"Args":["get", "compactpeer0.org1.example.com000011"]}'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市竖哩,隨后出現(xiàn)的幾起案子嘶窄,更是在濱河造成了極大的恐慌,老刑警劉巖距贷,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柄冲,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡忠蝗,警方通過查閱死者的電腦和手機(jī)现横,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)阁最,“玉大人戒祠,你說我怎么就攤上這事∷僦郑” “怎么了姜盈?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)配阵。 經(jīng)常有香客問我馏颂,道長(zhǎng),這世上最難降的妖魔是什么棋傍? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任救拉,我火速辦了婚禮,結(jié)果婚禮上瘫拣,老公的妹妹穿的比我還像新娘亿絮。我一直安慰自己,他們只是感情好麸拄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布派昧。 她就那樣靜靜地躺著,像睡著了一般感帅。 火紅的嫁衣襯著肌膚如雪斗锭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天失球,我揣著相機(jī)與錄音岖是,去河邊找鬼帮毁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛豺撑,可吹牛的內(nèi)容都是我干的烈疚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼聪轿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼爷肝!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起陆错,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤灯抛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后音瓷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體对嚼,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年绳慎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纵竖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杏愤,死狀恐怖靡砌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情珊楼,我是刑警寧澤通殃,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站亥曹,受9級(jí)特大地震影響邓了,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜媳瞪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一骗炉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛇受,春花似錦句葵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至把将,卻和暖如春轻专,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背察蹲。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工请垛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留催训,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓宗收,卻偏偏與公主長(zhǎng)得像漫拭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子混稽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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