开发指南

智能合约开发——Fabric引擎

概述

区块链服务当前版本支持Go开发的智能合约部署。

智能合约API接口(Go)

浪潮区块链提供了丰富的智能合约API接口,开发者通过实现这些接口完成区块链账本操作(包括数据写链、链数据查询等)。以下对智能合约开发过程中常见的API接口进行说明:

智能合约调用相关
接口名称 功能说明
GetArgs() [][]byte 获取智能合约调用请求的参数
GetStringArgs() []string 获取智能合约调用请求的参数
GetFunctionAndParameters() (string, []string) 获取智能合约调用请求的函数名和参数, 默认第一个参数为函数名
InvokeChaincode(chaincodeName string, args [][]byte, channel string) pb.Response 调用其它智能合约的 Invoke 方法
账本交易相关
接口名称 功能说明
GetTxID() string 获取当前交易 ID
GetChannelID() string 获取当前通道名称
GetCreator() ([]byte, error) 获取交易提交者信息
GetSignedProposal() (*pb.SignedProposal, error) 获取交易提案数据
GetTxTimestamp() (*timestamp.Timestamp, error) 获取交易时间戳
GetState() ([]byte, error) 获取指定key的账本数据
PutState(key string, value []byte) error 新增或更新一条账本数据
DelState(key string) error 删除一条账本数据,删除后通过GetState无法查询
DelState(key string) error 删除一条账本数据,删除后通过GetState无法查询
GetHistoryForKey(key string) (HistoryQueryIteratorInterface, error) 获取指定key的历史账本数据

智能合约调试

开发者部署智能合约后,可以使用智能合约管理提供的调用功能,进行写链、查询链上数据调试等操作。 以下步骤为智能合约调试方法:

  1. 打开智能合约管理页面,点击要调试的智能合约名称,进入智能合约详情页面,如下图:
    image
  2. 点击更多-调用按钮,打开智能合约调用弹出对话框,选择、输入智能合约部署信息以及智能合约参数,点击执行,发起智能合约调用请求;如下图:
    image
    所属通道:智能合约部署通道
    智能合约版本:要调用的智能合约版本
    选择连接节点:即部署智能合约的成员Peer节点
    智能合约参数:要调用智能合约的方法参数,类型为字符串数组,数组的第一个item为固定值invokequery,表示通过哪种调用方式调用智能合约,如 写链方法要使用invoke,查询方法可以使用invokequery,从数组的第二个item开始就是调用智能合约方法的实际参数,根据智能合约输入;
  3. 发起调用后,会在执行结果输出智能合约调用响应结果。

应用集成

开发者可通过在自己的应用中,调用相应虚机资源中暴露出来的代理API接口,来调用智能合约,实现与区块链的交互。API详情如下:

URI
POST http://{agent_ip}:{agent_port}/api/chaincode/invoke

agent_ip为部署了相应智能合约的Peer所属虚机资源的IPagent_port由实例使用的安全算法来确定,安全算法为国密算法agent_type9200,安全算法为ECDSAagent_type9201

Content-Type: application/json
请求参数
名称 类型 是否必须 描述
projectName String 登录用户名称
chainName String 服务名称
channelName String 通道名称
ccName String 智能合约名称
ccVersion String 智能合约版本
ccLang String 智能合约语言(golang)
ccArgs String[] 调用合约的参数
org Json 成员信息(具体内容见示例)
orderers JsonArray Orderer信息(具体内容见示例)
user Json 用户信息(具体内容见示例)

参数示例

huo{
    "projectName": "admin",
    "chainName": "chain01",
    "channelName": "channel01",
    "ccName": "qc-data-cc",
    "ccVersion": "1.0",
    "ccLang": "golang",
    "ccArgs": ["invoke", "invoke", "setData", "a", "{\"key\":\"value\"}"],
    "org": {
        "orgName": "org1", // 成员名称
        "mspId": "org1MSP",
        "orgDomain": "org1.admin", // 成员的域名
        "ca": {
            "name": "ca-org1", // ca名称
            "endpoint": "172.31.0.24:9524" // ca地址
        },
        "peers": [
            {
                "endpoint": "172.31.0.24:9521", // peer地址
                "peerName": "peer0.org1.admin", // peer名称
                "host": {
                    "ip": "172.31.0.24"
                } 
            }
        ]
    },
    "orderers": [
        {
            "ordererName": "orderer0.chain01.admin", // orderer名称
            "endpoint": "172.31.0.24:9520", // orderer地址
            "domain": "chain01.admin", // 域名
            "tlscaCertPem": "该orderer的ca证书",
            "host": {
                "ip": "172.31.0.24",
                "port": 9201
            }
        }
    ],
    "user": {
        "userName": "zhanglan01", // ca用户名称
        "privateKey": "该ca用户的私钥",
        "cert": "该ca用户的证书"
    }
}
响应参数
名称 类型 是否必须 描述
code Integer 响应码,100成功;200失败
msg String 提示信息
data Json 具体内容见示例

参数示例

{
    "code": 100,
    "msg": "success",
    "data": {
        "transactionId": "交易id",
        "payload": "合约调用的结果"
    }
}

智能合约开发——EVM引擎

概述

区块链服务当前ECDSA安全体系版本支持Solidity开发的智能合约。

智能合约使用

开发者部署合约引擎后,可以使用EVM引擎提供的调用功能,对智能合约进行相关操作。以下步骤为智能合约使用的方法:

  1. 打开EVM页面,点击安装智能合约按钮,弹出安装智能合约弹窗,如下图:
    image
1. 合约名称:符合规范的合约名称;<br>
2. 所属服务:选择服务实例;<br>
3. 所属通道:选择服务实例下的通道;<br>
4. 安装节点:选择合约安装的节点;<br>
5. 字节码:智能合约编译后的字节码;<br>
  1. 合约详情:显示合约名称、所属服务、所属通道等状态


    image

  2. 点击调用按钮,打开合约调用弹出对话框,输入合约函数及相关参数,点击执行,发起调用请求;如下图:

    查询相关参数:["query","合约地址","合约函数哈希"]

    image

    状态变更相关参数:["invoke","合约地址",合约函数哈希和参数]

    image

    image

  3. 示例相关的SimpleStorage合约。

    pragma solidity ^0.4.0;
    
    contract SimpleStorage {
        uint storedData = 3;
    
        function set(uint x) public {
            storedData = x;
        }
    
        function get() public  returns (uint) {
            return storedData;
        }
    }