云服务器内容精选
-
请求示例 POST https://192.168.0.90:30603/v2/agent/apis/chaincode/instantiate { "chaincode_name" : "gochaincode2", "chaincode_version" : "1.0", "channel_name" : "channel001", "endorsement_policy" : { "operation" : "AND", "group" : [ { "org_id" : "8cc7155fb1f26ebac1743f481386c14223be511f", "category" : "member" } ] }, "init_variable" : { "func_name" : "init", "args" : [ "a", "200", "b", "100" ] }, "private_data" : "[{\"name\": \"kvstore-collection\",\"policy\": \"OR('8cc7155fb1f26ebac1743f481386c14223be511fMSP.member','8cc7155fb1f26ebac1743f481386c14223be511fMSP.member')\",\"requiredPeerCount\": 0,\"maxPeerCount\": 2,\"blockToLive\": 0,\"memberOnlyRead\": true}]" }
-
请求参数 表1 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 是 String 用户Token 表2 请求Body参数 参数 是否必选 参数类型 描述 chaincode_name 是 String 链代码名称,以小写字母开头,支持小写字母和数字,长度6-25位 chaincode_version 是 String 链代码版本,只允许使用数字、点(.)、横杠(-),必须以数字开头和结尾,且点和横杠不能相邻 channel_name 是 String 实例化通道名称 endorsement_policy 是 Policy object 背书策略 init_variable 是 InitArgs object 初始化函数及参数 private_data 否 String 隐私保护配置数据,json数据的string格式,json数据结构举例:[{"name":"kvstore-collection","policy":"OR('9b4ea44913e8eed42cb056177b46191e1d316678MSP.member','9b4ea44913e8eed42cb056177b46191e1d316678MSP.member')","requiredPeerCount":0,"maxPeerCount":2,"blockToLive":0,"memberOnlyRead":true}] 表3 Policy 参数 是否必选 参数类型 描述 operation 是 String 操作符。 OR:任意组织背书 AND:全部组织背书 group 是 Array of OrgPolicy objects 组织背书成员 表4 OrgPolicy 参数 是否必选 参数类型 描述 org_id 是 String 组织ID category 否 String 成员类型:member、admin 表5 InitArgs 参数 是否必选 参数类型 描述 func_name 是 String 初始化函数名 args 是 Array of strings 初始化参数列表
-
响应示例 状态码: 200 Success { "count" : 12, "chaincodes" : [ { "chaincode_name" : "test001", "chaincode_version" : "1.0", "update_time" : "2021-01-12T11:32:04.193358708+08:00", "instantiated_info" : { "channels" : [ { "channel_id" : "channel", "versions" : [ "1.0" ] }, { "channel_id" : "testchannel", "orgs" : null, "versions" : [ "1.0" ] } ] }, "chaincode_language" : "golang" } ] } 状态码: 400 Bad Request { "error_code" : " BCS .4000013", "error_message" : "request body is too large" }
-
响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 count Integer 链码总数 chaincodes Array of ChaincodeInfo objects 链码列表 表4 ChaincodeInfo 参数 参数类型 描述 chaincode_name String 链码名称 chaincode_language String 链码开发语言 update_time String 链码更新时间 chaincode_version String 链码版本,多个链码之间以逗号(,)分隔 install_org_infos Array of PeerInfo objects 链码的安装信息 instantiated_channel instantiated_channel object 链码通道信息 instantiated_info instantiated_info object 实例化信息 表5 PeerInfo 参数 参数类型 描述 org_name String 组织名称 org_id String 组织id peer_name String 节点名称 peer_id String 节点id status String 节点状态 channels Array of strings 未实例化的peer信息 url String Peer节点的url信息 peer String Peer节点的内部 域名 表6 instantiated_channel 参数 参数类型 描述 error Array of CCInstantiatedChannelError objects 实例化错误信息 success Array of strings 成功的通道 inprogress Array of strings 实例化进度 表7 CCInstantiatedChannelError 参数 参数类型 描述 channel_name String 错误通道名 error_detail String 错误详情 表8 instantiated_info 参数 参数类型 描述 channels Array of channels objects 通道信息 表9 channels 参数 参数类型 描述 channel_id String 通道名称 orgs Array of orgs objects 通道内组织信息 versions Array of strings 版本信息 表10 orgs 参数 参数类型 描述 org_name String 组织名 org_id String 组织id 状态码: 400 表11 响应Body参数 参数 参数类型 描述 error_code String 错误码 error_message String 错误描述 error_msg String 错误描述
-
响应示例 状态码: 200 Success { "versions" : [ { "version" : "1.0", "hash_code" : "1473b4807fe9f970d1ba56192e41d39c7d621d07d80e603cf75ed3982b81034d", "description" : "", "install_time" : "2021-01-11T11:27:12.093454567+08:00", "update_time" : "2021-01-11T11:27:12.093454789+08:00", "instantiate_status" : false, "uninstantiated_peer_infos" : [ { "org_name" : "organization", "org_id" : "57e7914450b098771f5106acaf02be8a61894fae", "peer_name" : "peer-0", "peer_id" : "peer-57e7914450b098771f5106acaf02be8a61894fae-0.peer-57e7914450b098771f5106acaf02be8a61894fae.default.svc.cluster.local" }, { "org_name" : "organization", "org_id" : "57e7914450b098771f5106acaf02be8a61894fae", "peer_name" : "peer-1", "peer_id" : "peer-57e7914450b098771f5106acaf02be8a61894fae-1.peer-57e7914450b098771f5106acaf02be8a61894fae.default.svc.cluster.local" } ], "security_check_status" : 2 } ] } 状态码: 400 Bad Request { "error_code" : "B CS .4000013", "error_message" : "request body is too large" }
-
响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 versions Array of ChaincodeVersion objects 链码版本信息 表4 ChaincodeVersion 参数 参数类型 描述 version String 链码版本 hash_code String 链码版本哈希值 description String 链码版本描述 install_time String 链码版本安装时间 update_time String 链码版本更新时间 instantiate_status Boolean 链码版本实例化状态 security_check_status Integer 链代码安全检查状态(0:不存在,1:运行中,2:完成,3:失败) uninstantiated_peer_infos Array of PeerInfo objects 未实例化的peer信息 表5 PeerInfo 参数 参数类型 描述 org_name String 组织名称 org_id String 组织id peer_name String 节点名称 peer_id String 节点id status String 节点状态 channels Array of strings 未实例化的peer信息 url String Peer节点的url信息 peer String Peer节点的内部域名 状态码: 400 表6 响应Body参数 参数 参数类型 描述 error_code String 错误码 error_message String 错误描述 error_msg String 错误描述
-
响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 peer_num Number peer数量 chaincodes Number 合约数量 block_num Number 区块数量 transaction_num Number 交易数量 bph Array of bph objects 区块产生数量统计,按小时统计 bpm Array of bpm objects 区块产生数量统计,按每5分钟统计 tph Array of tph objects 合约交易数量统计,按小时统计 tpm Array of tpm objects 合约交易数量统计,按每5分钟统计 orgs_map Array of orgs_map objects 组织交易统计 peers_list Array of peers_list objects peer列表 表4 bph 参数 参数类型 描述 block Number 区块数量 time String 时间 表5 bpm 参数 参数类型 描述 block Number 区块数量 time String 时间 表6 tph 参数 参数类型 描述 tx Number 交易数量 time String 时间 表7 tpm 参数 参数类型 描述 tx Number 交易数量 time String 时间 表8 orgs_map 参数 参数类型 描述 org_name String 组织名称 tx_num Number 交易数量 表9 peers_list 参数 参数类型 描述 org_name String 组织名称 org_id String 组织ID peer String Peer名称 url String PeerURL status String Peer状态 状态码: 400 表10 响应Body参数 参数 参数类型 描述 error_code String 错误码 error_message String 错误描述 error_msg String 错误描述
-
响应示例 状态码: 200 Success { "transaction_summary" : { "block_number" : 29, "transaction_id" : "6d704b217e17e16de71029b70f17a1ced35c055279f655dfd096bebf978a0546", "channelName" : "channel", "creator_msp" : "282f3c713ea1cec646aa7c640defca9c4f64bd88MSP", "type" : "ENDORSER_TRANSACTION", "chaincode_name" : "kvtest", "chaincode_version" : "1.0", "timestamp" : "2021-01-20T19:30:28+08:00", "organization_name" : "organization" }, "validation_code" : "VALID", "endorser_organizations" : [ "282f3c713ea1cec646aa7c640defca9c4f64bd88MSP" ], "proposal_hash" : "k1h2ewweWGrWNmmcu7UvzJ8Aw2G190SQzV+lBAAl4gw=", "read_set" : { "kvtest" : null, "lscc" : [ { "key" : "kvtest", "version" : { "block_num" : 2 } } ] }, "write_set" : { "kvtest" : [ { "key" : "a1", "is_delete" : false, "value" : "1" } ], "lscc" : [ ] } } 状态码: 400 Bad Request { "error_code" : "BCS.4000013", "error_message" : "request body is too large" }
-
请求示例 DELETE https://192.168.0.90:30603/v2/agent/apis/chaincode/uninstall { "chaincode_name" : "chaincode1", "chaincode_version" : "1.0", "target_peers" : [ { "org_id" : "9802af57cfab764dc12b860c44b01969575e83c9", "peer_id" : "peer-9802af57cfab764dc12b860c44b01969575e83c9-1.peer-9802af57cfab764dc12b860c44b01969575e83c9.default.svc.cluster.local" } ] }
-
响应参数 状态码: 200 表4 响应Body参数 参数 参数类型 描述 total_peer_num Integer 链代码操作Peer总数 success_peer_num Integer 操作成功Peer数量 fail_peer_num Integer 操作失败Peer数量 fail_peers Array of strings 操作失败Peer信息 状态码: 400 表5 响应Body参数 参数 参数类型 描述 error_code String 错误码 error_message String 错误描述 error_msg String 错误描述
-
响应示例 状态码: 200 Success { "total_peer_num" : 4, "success_peer_num" : 4, "fail_peer_num" : 0, "fail_peers" : [ ] } 状态码: 400 Bad Request { "error_code" : "BCS.4000013", "error_message" : "request body is too large" }
-
请求参数 表1 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 是 String 用户Token 表2 请求Body参数 参数 是否必选 参数类型 描述 chaincode_name 是 String 链代码名称,以小写字母开头,支持小写字母和数字,长度6-25位 最小长度:6 最大长度:25 chaincode_version 是 String 链代码版本,只允许使用数字、点(.)、横杠(-),必须以数字开头和结尾,且点和横杠不能相邻 target_peers 是 Array of TargetPeer objects 卸载链代码peer信息 表3 TargetPeer 参数 是否必选 参数类型 描述 org_id 是 String peer所属组织ID peer_id 是 String Peer ID
-
链代码示例(1.4风格) Fabric架构版本的 区块链 实例: 如下是一个账户转账的链代码示例(1.4风格)仅供安装实例化,若您需要调测请参考Fabric官方示例中的链代码。 package main import ( "fmt" "strconv" "github.com/hyperledger/fabric/core/chaincode/shim" pb "github.com/hyperledger/fabric/protos/peer" ) type SimpleChaincode struct { } // 初始化数据状态,实例化/升级链代码时被自动调用 func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response { // println函数的输出信息会出现在链代码容器的日志中 fmt.Println("ex02 Init") // 获取用户传递给调用链代码的所需参数 _, args := stub.GetFunctionAndParameters() var A, B string // 两个账户 var Aval, Bval int // 两个账户的余额 var err error // 检查合法性, 检查参数数量是否为4个, 如果不是, 则返回错误信息 if len(args) != 4 { return shim.Error("Incorrect number of arguments. Expecting 4") } A = args[0] // 账户A用户名 Aval, err = strconv.Atoi(args[1]) // 账户A余额 if err != nil { return shim.Error("Expecting integer value for asset holding") } B = args[2] // 账户B用户名 Bval, err = strconv.Atoi(args[3]) // 账户B余额 if err != nil { return shim.Error("Expecting integer value for asset holding") } fmt.Printf("Aval = %d, Bval = %d\n", Aval, Bval) // 将账户A的状态写入账本中 err = stub.PutState(A, []byte(strconv.Itoa(Aval))) if err != nil { return shim.Error(err.Error()) } // 将账户B的状态写入账本中 err = stub.PutState(B, []byte(strconv.Itoa(Bval))) if err != nil { return shim.Error(err.Error()) } return shim.Success(nil) } // 对账本数据进行操作时(query, invoke)被自动调用 func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response { fmt.Println("ex02 Invoke") // 获取用户传递给调用链代码的函数名称及参数 function, args := stub.GetFunctionAndParameters() // 对获取到的函数名称进行判断 if function == "invoke" { // 调用 invoke 函数实现转账操作 return t.invoke(stub, args) } else if function == "delete" { // 调用 delete 函数实现账户注销 return t.delete(stub, args) } else if function == "query" { // 调用 query 实现账户查询操作 return t.query(stub, args) } // 传递的函数名出错,返回 shim.Error() return shim.Error("Invalid invoke function name. Expecting \"invoke\" \"delete\" \"query\"") } // 账户间转钱 func (t *SimpleChaincode) invoke(stub shim.ChaincodeStubInterface, args []string) pb.Response { var A, B string // 账户A和B var Aval, Bval int // 账户余额 var X int // 转账金额 var err error if len(args) != 3 { return shim.Error("Incorrect number of arguments. Expecting 3") } A = args[0] // 账户A用户名 B = args[1] // 账户B用户名 // 从账本中获取A的余额 Avalbytes, err := stub.GetState(A) if err != nil { return shim.Error("Failed to get state") } if Avalbytes == nil { return shim.Error("Entity not found") } Aval, _ = strconv.Atoi(string(Avalbytes)) // 从账本中获取B的余额 Bvalbytes, err := stub.GetState(B) if err != nil { return shim.Error("Failed to get state") } if Bvalbytes == nil { return shim.Error("Entity not found") } Bval, _ = strconv.Atoi(string(Bvalbytes)) // X为转账金额 X, err = strconv.Atoi(args[2]) if err != nil { return shim.Error("Invalid transaction amount, expecting a integer value") } // 转账 Aval = Aval - X Bval = Bval + X fmt.Printf("Aval = %d, Bval = %d\n", Aval, Bval) // 更新转账后账本中A余额 err = stub.PutState(A, []byte(strconv.Itoa(Aval))) if err != nil { return shim.Error(err.Error()) } // 更新转账后账本中B余额 err = stub.PutState(B, []byte(strconv.Itoa(Bval))) if err != nil { return shim.Error(err.Error()) } return shim.Success(nil) } // 账户注销 func (t *SimpleChaincode) delete(stub shim.ChaincodeStubInterface, args []string) pb.Response { if len(args) != 1 { return shim.Error("Incorrect number of arguments. Expecting 1") } A := args[0] // 账户用户名 // 从账本中删除该账户状态 err := stub.DelState(A) if err != nil { return shim.Error("Failed to delete state") } return shim.Success(nil) } // 账户查询 func (t *SimpleChaincode) query(stub shim.ChaincodeStubInterface, args []string) pb.Response { var A string var err error if len(args) != 1 { return shim.Error("Incorrect number of arguments. Expecting name of the person to query") } A = args[0] // 账户用户名 // 从账本中获取该账户余额 Avalbytes, err := stub.GetState(A) if err != nil { jsonResp := "{\"Error\":\"Failed to get state for " + A + "\"}" return shim.Error(jsonResp) } if Avalbytes == nil { jsonResp := "{\"Error\":\"Nil amount for " + A + "\"}" return shim.Error(jsonResp) } jsonResp := "{\"Name\":\"" + A + "\",\"Amount\":\"" + string(Avalbytes) + "\"}" fmt.Printf("Query Response:%s\n", jsonResp) // 返回转账金额 return shim.Success(Avalbytes) } func main() { err := shim.Start(new(SimpleChaincode)) if err != nil { fmt.Printf("Error starting Simple chaincode: %s", err) } } 父主题: Go语言链代码开发
-
请求参数 表1 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 是 String 用户Token 表2 FormData参数 参数 是否必选 参数类型 描述 chaincode_name 是 String 链代码名称,以小写字母开头,支持小写字母和数字 最小长度:6 最大长度:25 chaincode_version 是 String 链代码版本,只允许使用数字、点(.)、横杠(-),必须以数字开头和结尾,且点和横杠不能相邻 最小长度:1 最大长度:14 target_peers 是 String 链代码安装Peer列表信息,例如:[{"org_id":"9fb42c91458763990a45b62af92546a21f168dae","org_name":"organization3","peer_id":"peer-9fb42c91458763990a45b62af92546a21f168dae-0.peer-9fb42c91458763990a45b62af92546a21f168dae.default.svc.cluster.local","peer_name":"peer-0"}] description 否 String 链代码描述 chaincode_language 是 String 链代码编程语言,例如 golang db_type 否 String 账本数据存储方式,请按照实例创建时的账本数据存储方式填写。例如 goleveldb,couchdb security_check 否 String 链代码安全检查选项,目前只对golang语言链代码有效,true表示开启,false表示关闭,默认为false file 是 File 链代码zip文件
-
响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 total_peer_num Integer 链代码操作Peer总数 success_peer_num Integer 操作成功Peer数量 fail_peer_num Integer 操作失败Peer数量 fail_peers Array of strings 操作失败Peer信息 状态码: 400 表4 响应Body参数 参数 参数类型 描述 error_code String 错误码 error_message String 错误描述 error_msg String 错误描述
更多精彩内容
CDN加速
GaussDB
文字转换成语音
免费的服务器
如何创建网站
域名网站购买
私有云桌面
云主机哪个好
域名怎么备案
手机云电脑
SSL证书申请
云点播服务器
免费OCR是什么
电脑云桌面
域名备案怎么弄
语音转文字
文字图片识别
云桌面是什么
网址安全检测
网站建设搭建
国外CDN加速
SSL免费证书申请
短信批量发送
图片OCR识别
云数据库MySQL
个人域名购买
录音转文字
扫描图片识别文字
OCR图片识别
行驶证识别
虚拟电话号码
电话呼叫中心软件
怎么制作一个网站
Email注册网站
华为VNC
图像文字识别
企业网站制作
个人网站搭建
华为云计算
免费租用云托管
云桌面云服务器
ocr文字识别免费版
HTTPS证书申请
图片文字识别转换
国外域名注册商
使用免费虚拟主机
云电脑主机多少钱
鲲鹏云手机
短信验证码平台
OCR图片文字识别
SSL证书是什么
申请企业邮箱步骤
免费的企业用邮箱
云免流搭建教程
域名价格