パッケージメイン インポート( "符号化/ JSON" "FMT" "バイト" "時間" "のStrConv" "github.com/hyperledger/fabric/core/chaincode/shim" "github.com/hyperledger/fabric/protos/peer" ) 型MarblesChaincode構造体{ } 型の大理石の構造体{ のObjectType文字列`JSON: "objectTypeに"` 名前文字列`JSON: "名前"` カラー文字列`JSON: "色"` サイズはint `JSON: "サイズ"` 所有者文字列`JSON: "所有者" ` } FUNC(のT *のMarblesChaincode)初期(スタブshim.ChaincodeStubInterface)peer.Response { 戻りshim.Success(NIL) } FUNC(のT *のMarblesChaincode)を呼び出す(スタブshim.ChaincodeStubInterface)peer.Response { //関数のparams:= stub.GetFunctionAndParameters() FN、引数:= stub.GetFunctionAndParameters() FN == "initMarble" {もし 戻りT。 initMarble(スタブ、引数) }他FN == "readMarble" {場合 t.readMarble(スタブ、引数)を返す FN == "deleteMarble" {他の場合} t.deleteMarble(スタブ、引数)を返す 他FN場合} == "transferMarble" { t.transferMarble(スタブ、引数)を返す 場合はそう} FN == "getMarblesByRange" { t.getMarblesByRange(スタブ、引数)を返す 場合はそう} FN == "queryMarblesByOwner" { t.queryMarblesByOwner(スタブ、引数を返します) 他} FN ==「getHistoryForMarbleなら"{ t.getHistoryForMarble(スタブ、引数)を返す } shim.Error( "没有相应的方法!")を返す } FUNC(のT *のMarblesChaincode)initMarble(スタブshim.ChaincodeStubInterface、引数[]の文字列)peer.Response { marblename:=引数を[0] //判断大理石是否の存在の marbleAsBytes、ERR = stub.GetState(marblename) ERR =ゼロ{場合! 戻りshim.Error(err.Error()) } marbleAsBytesは=ゼロ{場合! 「(shim.Errorを返します大理石已经存在! ") } 色:=引数[1] サイズ、ERR = strconv.Atoi(引数[2]) !ERR =ゼロ{場合 shim.Errorを返す("サイズ必须传数字字符串") } 大理石:=&大理石{objectTypeに、marblename、色、サイズ、所有者} 所有者:=引数[3] objectTypeに:= "大理石" marbleJsonAsBytes、ERR = json.Marshal(大理石) ERR = stub.PutState(marblename、marbleJsonAsBytes) ERRなら=ゼロ{! shim.Errorを返す(err.Error()) } (shim.Successを返しますNIL) } FUNC(のT *のMarblesChaincode)readMarble(スタブshim.ChaincodeStubInterface、引数[]の文字列)peer.Response { marblename:=引数[0] marbleAsBytes、ERR = stub.GetState(marblename) ERR =ゼロ{なら! リターンshim.Error(err.Error()) marbleAsBytesは== nilの{それ以外の場合} shim.Errorを返す( "大理石信息不存在!") } shim.Success(marbleAsBytes)を返します } FUNC(T * MarblesChaincode)deleteMarble(スタブshim.ChaincodeStubInterface、引数[]の文字列)peer.Response { //判断大理石の是否の存在の marblename:=引数は、[0] marbleAsBytes、ERR:= stub.GetState(marblename) ERRの場合=! nilの{ 返すshim.Error(err.Error()) } の場合marbleAsBytes!= nilの{ //删除大理石 ERR = stub.DelState(marblename) の場合、ERR!= nilの{ 返すshim.Error(err.Error()) } } shim.Success(NIL)を返す } FUNC(のT *のMarblesChaincode)transferMarble(スタブshim.ChaincodeStubInterface、引数[]の文字列)peer.Response { =引数[0]:marblename newownerに:=引数[1] //判断大理石是否存在 marbleAsBytes、ERR = stub.GetState(marblename) !場合ERR =ゼロ{ 戻りshim.Error(err.Error()) }そうならmarbleAsBytes == nilの{ ( "!大理石の不存在の")shim.Errorを返す } =大理石{}:marbleInfo ERR = json.Unmarshal(marbleAsBytes、&marbleInfo) !誤る= nilの{場合 返しshim.Error(err.Error()) } marbleInfo.Owner = newownerに marbleJsonAsBytes、ERR = json.Marshal(marbleInfo)は !ERR =ゼロ{場合 返すshim.Error(err.Error()) } ERR = stub.PutState(marblename、marbleJsonAsBytes) 場合ERR =ゼロ{! リターンシム。エラー(err.Error()) } shim.Success(NIL)を返す } FUNC(のT *のMarblesChaincode)getMarblesByRange(スタブshim.ChaincodeStubInterface、引数[]の文字列)peer.Response { startKey:=引数[0] endKey:=引数[1] resultIterator、ERR = stub.GetStateByRange(startKey、endKey) != nilを誤る場合{ 戻りshim.Error(err.Error()) } 延期resultIterator.Close() VARバッファbytes.Buffer buffer.WriteString( "[") isWrite:=偽 resultIterator.HasNext(){のため queryResponse、ERR:= resultIterator.Next() = nilを{誤る場合! 返しshim.Error(err.Error()) } ==真{isWrite場合 buffer.WriteString(」 、 ") } buffer.WriteString("{\ "キー\":") buffer.WriteString(queryResponse.Key) buffer.WriteString("、\ "レコード\": ") buffer.WriteString(文字列(queryResponse.Value)) buffer.WriteString("}」) isWrite = TRUE } buffer.WriteString( "]") shim.Success(buffer.Bytes())を返す } FUNC(のT *のMarblesChaincode)queryMarblesByOwner(スタブshim.ChaincodeStubInterface、引数[]の文字列)peer.Response { 所有者:=引数[0] queryStr := fmt.Sprintf( "{\"セレクタ\ ":{\"所有者\ ":\" %s \ "は}}"、所有者) resultIterator、ERR = stub.GetQueryResult(queryStr) 場合ERR =ゼロ{! shim.Error(err.Error())を返す } resultIterator.Closeを延期() isWrite場合==真{ バッファ。WriteStringは( "") クローズ() のvarバッファbytes.Buffer buffer.WriteString( "[") isWrite:=偽 (resultIterator.HasNext用){ queryResponse、ERR:= resultIterator.Next() 誤る場合= nilは{! (err.Error())shim.Errorを返す } } buffer.WriteString( "{\"キー\ ":") buffer.WriteString(queryResponse.Key) buffer.WriteString( "\ "レコード\": ") buffer.WriteString(文字列(queryResponse.Value)) buffer.WriteString("}") isWrite = TRUE } バッファ.WriteString( "]") を返すshim.Success(buffer.Bytes()) } FUNC(のT *のMarblesChaincode)getHistoryForMarble(スタブshim.ChaincodeStubInterface、引数[]の文字列)peer.Response { marblename:=引数[0] resultIterator、ERR = stub.GetHistoryForKey(marblename) != nilを誤る場合{ 戻りshim.Error(err.Error()) } 延期resultIterator.Close() VARバッファbytes.Buffer buffer.WriteString( "[") isWrite。 =偽 resultIterator.HasNext(){のため queryResponse、ERR:= resultIterator.Next() != nilを誤る場合{ 返すshim.Error(err.Error()) } であればisWrite ==真{ buffer.WriteString( "" ) } buffer.WriteString( "{\" TXID \ ":") buffer.WriteString(queryResponse.TxId) buffer.WriteString( "\ "タイムスタンプ\":") buffer.WriteString(time.Unix(queryResponse.Timestamp.Seconds、int64型(queryResponse.Timestamp.Nanos))文字列()。) buffer.WriteString( "\ "値\":") buffer.WriteString(文字列(queryResponse。値)) buffer.WriteString("、\ "IsDelete \":" ) buffer.WriteString(のStrConv。FormatBool(queryResponse.IsDelete)) buffer.WriteString( "}") isWrite = TRUE } buffer.WriteString( "]") を返すshim.Success(buffer.Bytes()) } FUNCメイン(){ ERR = shim.Start(新しい(MarblesChaincode )) 誤る場合!=ゼロ{ fmt.Println( "chaincode開始エラー!") } }