UUID
func (t *TestChaincode) getUUID(stub shim.ChaincodeStubInterface, args []string) pb.Response {
arl := util.GenerateUUID()
fmt.Println(arl)
return shim.Success([]byte(arl))
}
getLogger
func getLogger(stub shim.ChaincodeStubInterface) (c *shim.ChaincodeLogger) {
fcn, _ := stub.GetFunctionAndParameters()
c = shim.NewLogger(fmt.Sprintf("%s.%s.%s", stub.GetChannelID(), "你的链码名称", fcn))
c.SetLevel(shim.LogDebug)
return
}
rsaKey
func (t *TestChaincode) getRSAKey(stub shim.ChaincodeStubInterface, args []string) pb.Response {
logger := getLogger(stub)
// 生成私钥
privateKey, err := rsa.GenerateKey(rand.Reader, 256)
logger.Debug("generate key")
// 生成公钥
publicKey := &privateKey.PublicKey
if err != nil {
return shim.Error(err.Error())
}
//生成私钥字符串
derStream := MarshalPKCS8PrivateKey(privateKey)
block := &pem.Block{
Type: "PRIVATE KEY",
Bytes: derStream,
}
pribuffer := bytes.NewBuffer(make([]byte, 1024*5))
err = pem.Encode(pribuffer, block)
if err != nil {
return shim.Error(err.Error())
}
logger.Debug("privatekey is :" + pribuffer.String())
// 生成公钥字符串
pubbuffer := bytes.NewBuffer(make([]byte, 1024*5))
derPkix, err := x509.MarshalPKIXPublicKey(publicKey)
if err != nil {
return shim.Error(err.Error())
}
block = &pem.Block{
Type: "PUBLIC KEY",
Bytes: derPkix,
}
err = pem.Encode(pubbuffer, block)
if err != nil {
fmt.Println(err.Error())
}
pubStr := pubbuffer.String()
priStr := pribuffer.String()
logger.Debug("publickey is : " + pubStr)
pubStr = pubStr[strings.Index(pubStr, "-----BEGIN PUBLIC KE"):]
priStr = priStr[strings.Index(priStr, "-----BEGIN PRIVATE KE"):]
rsaKey := &RSAKey{pubStr, priStr}
value, err := json.Marshal(rsaKey)
if err != nil {
return shim.Error(err.Error())
}
return shim.Success(value)
}
type RSAKey struct {
PrivateKey string `json:"privateKey"`
PublicKey string `json:"publicKey"`
}
获取加密对象
func getEnt(key []byte) (entities.EncrypterEntity, error) {
factory.InitFactories(nil)
ent, err := entities.NewAES256EncrypterEntity("ID", factory.GetDefault(), key, nil)
if err != nil {
return nil, err
}
return ent, nil
}
开始加密
ent, err := getEnt(aesKey)
if err != nil {
return shim.Error(err.Error())
}
res, err := ent.Encrypt([]byte(data))
if err != nil {
return shim.Error(err.Error())
}
logger.Debug(fmt.Sprintf("get encryptVal: %s", res))
开始解密
ent, err := getEnt(aesKey)
if err != nil {
return shim.Error(err.Error())
}
res, err := ent.Decrypt(aes.Data)
if err != nil {
return shim.Error(err.Error())
}
logger.Debug(fmt.Sprintf("get result: %s", string(res)))
解析历史结果集合
func getHisResult(result shim.HistoryQueryIteratorInterface) (bytes.Buffer, error) {
//由于查询的结果是一个集合,所以要将结果集转成字符串,方便传输
var buffer bytes.Buffer
buffer.WriteString("[")
bArrayMemberAlreadyWritten := false
for result.HasNext() {
response, err := result.Next()
if err != nil {
return buffer, err
}
if bArrayMemberAlreadyWritten {
buffer.WriteString(",")
}
buffer.WriteString("{\"TxId\":\"")
buffer.WriteString(response.TxId)
buffer.WriteString("\",\"value\":")
if response.IsDelete {
buffer.WriteString("null")
} else {
buffer.WriteString(string(response.Value))
}
buffer.WriteString(", \"Timestamp\":\"")
buffer.WriteString(time.Unix(response.Timestamp.Seconds, int64(response.Timestamp.Nanos)).Format("2006-01-02 15:04:05"))
buffer.WriteString("\"")
buffer.WriteString(", \"IsDelete\":\"")
buffer.WriteString(strconv.FormatBool(response.IsDelete))
buffer.WriteString("\"")
buffer.WriteString("}")
//item,_:= json.Marshal(response)
//buffer.Write(item)
bArrayMemberAlreadyWritten = true
}
buffer.WriteString("]")
return buffer, nil
}
解析集合结果
func getListResult(resultsIterator shim.StateQueryIteratorInterface) ([]byte, error) {
defer resultsIterator.Close()
// buffer is a JSON array containing QueryRecords
var buffer bytes.Buffer
buffer.WriteString("[")
bArrayMemberAlreadyWritten := false
for resultsIterator.HasNext() {
queryResponse, err := resultsIterator.Next()
if err != nil {
return nil, err
}
// Add a comma before array members, suppress it for the first array member
if bArrayMemberAlreadyWritten == true {
buffer.WriteString(",")
}
buffer.WriteString("{\"Key\":")
buffer.WriteString("\"")
buffer.WriteString(queryResponse.Key)
buffer.WriteString("\"")
buffer.WriteString(", \"Record\":")
// Record is a JSON object, so we write as-is
buffer.WriteString(string(queryResponse.Value))
buffer.WriteString("}")
bArrayMemberAlreadyWritten = true
}
buffer.WriteString("]")
fmt.Printf("queryResult:\n%s\n", buffer.String())
return buffer.Bytes(), nil
}
任意富查询
func (t *AccountChaincode) getResultForQueryString(stub shim.ChaincodeStubInterface, args []string) pb.Response {
logger := getLogger(stub)
logger.Debug("Enter [%s] account.getResultForQueryString, args: %s", stub.GetChannelID(), args)
if len(args) < 1 {
return shim.Error("Incorrect number of arguments. Expecting 1")
}
queryString := args[0]
if queryString == "" {
return shim.Error("queryString is nil")
}
queryResult, err := stub.GetQueryResult(queryString)
if err != nil {
return shim.Error(err.Error())
}
defer queryResult.Close()
value, err := getListResult(queryResult)
if err != nil {
return shim.Error(err.Error())
}
logger.Debug("Leave [%s] account.getResultForQueryString, returned: %s", stub.GetChannelID(), string(value))
return shim.Success(value)
}