ファブリックスーパーインテリジェント本契約

パッケージメイン

インポート(
	"符号化/ 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(q​​ueryResponse.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開始エラー!")
	} 
}

 

おすすめ

転載: cywhoyi.iteye.com/blog/2443074