云服务器内容精选

  • Go SDK升级 1. 删除原有huaweichainSDK文件,下载新版本的SDK文件解压至原有的SDK文件路径。 2. SDK下载参见SDK配置。 3. 修改合约发送方法,详细参考下表。 表1 更新内容 内容 旧版本(2.1.0.2.39) 新版本(2.1.0.6.41) SDK参考 交易消息构建方法 BuildTransactionMessage BuildTxRawMsg 利用合约发送交易 父主题: SDK升级
  • 查询文件历史版本 接口方法 func (bc *BsClient) GetFileHistory(fileName string) ([]*bstore.FileHistory, error) 参数说明 参数 类型 说明 fileName string 查询的链上文件名。 返回值 类型 说明 []*FileHistory 文件历史版本信息列表,每条历史版本信息包含版本号、文件哈希值、首次上链时间、更新时间、上传者数据。 error 查询成功返回类型为nil,反之返回error。 父主题: 其他查询
  • 文件下载 接口方法 func (bc *BsClient) DownloadFile(filePath, fileName string, versionId int) error 参数说明 参数 类型 说明 filePath string 文件下载到本地的路径。 fileName string 待下载文件在链上的名称。 versionId int 待下载文件的版本号。 返回值 类型 说明 error 下载成功返回类型为nil,反之返回error。 父主题: Go SDK介绍
  • 查询文件操作记录 接口方法 func (bc *BsClient) GetFileOperation(fileName, startTime, endTime string) ([]*bstore.StorageEvent, error) 参数说明 参数 类型 说明 fileName string 查询的链上文件名。 startTime string 查询记录的起始时间(秒时间戳)。 endTime string 查询记录的结束时间(秒时间戳) 返回值 类型 说明 []*StorageEvent 文件操作记录列表,每条操作记录包含操作者、操作类型、时间数据。 error 查询成功返回类型为nil,反之返回error。 父主题: 其他查询
  • 文件上链 接口方法 func (bc *BsClient) UploadFile(filePath, fileName string) (*UploadFileResponse, error) 参数说明 参数 类型 说明 filePath string 待上链文件在本地的路径。当前支持不大于100MB的任意格式文件。 fileName string 文件在链上的名称。 返回值 类型 说明 *UploadFileResponse 文件上链返回信息。 error 上链成功返回类型为nil,反之返回error。 父主题: Go SDK介绍
  • 初始化SDK 文件存储客户端 基于已初始化的SDK Gateway客户端模板初始化富媒体存储客户端。 调用方法 func NewBsClient(gatewayClient *client.GatewayClient, chainID string, consenterName string)(*BsClient, error) 参数说明 参数 类型 说明 gatewayClient *client.GatewayClient 必填参数,已初始化过的Gateway客户端。 chainID string 链名称。 consenterName string 共识节点名称,如“node-0.organization”。
  • 初始化SDK客户端 基于标准配置文件模板初始化Gateway SDK。 调用方法 func NewGatewayClient(configPath string, decrypts ...func(bytes []byte) ([]byte, error)) (*GatewayClient, error) 参数说明 参数 类型 说明 configPath String 必填参数,客户端SDK配置文件的绝对路径。 decrypts func(bytes []byte) ([]byte, error) 非必填参数,指定证书密文解密算法,默认为明文,无须解密(可变参数)。
  • SDK客户端配置 客户端配置如下: SDK配置请参考SDK配置。 华为链实例创建完成后,下载配置文件,具体请参考下载配置文件。 使用解压后的配置文件初始化SDK客户端,初始化方法请参考SDK介绍中的通用方法,配置示例可参考示例Demo。 配置文件主要包含证书文件和yaml配置,实例中每个组织对应一个yaml文件,可通过读取不同的yaml生成不同的SDK客户端对象。 客户端初始化需确保yaml文件中证书文件等路径为证书的实际存放路径。 父主题: Go应用程序开发
  • 查询区块详情 消息构建。 接口方法 func (msg *QueryRawMessage) BuildBlockRawMessage(chainID string, blockNum uint64) (*common.RawMessage, error) 参数说明 参数 类型 说明 chainID string 链名称。 blockNum uint64 区块高度。 返回值 类型 说明 *common.RawMessage 根据块高查询区块详情需发送的消息。 error 查询成功返回类型为nil,反之返回error。 消息发送。 接口方法 func (action *QueryAction) GetBlockByNum(rawMsg *common.RawMessage) (*common.RawMessage, error) 参数说明 参数 类型 说明 rawMsg *common.RawMessage 上述根据块高查询区块详情消息。 返回值 类型 说明 *common.RawMessage 用于获取包含发送结果的消息。 error 发送成功返回类型为nil,反之返回error。 父主题: 其他查询
  • SDK配置 linux环境,Go SDK的编译、运行,需要手动下载并配置openssl(openssl下载链接) 解压openssl,拷贝openssl文件夹到目录/usr/local/include/下 执行库的导入命令:export LD_LIBRARY_PATH=/usr/local/include/openssl SDK版本号 下载链接 2.1.0.6.41 下载SDK 父主题: Go SDK介绍
  • 合约结构 AssemblyScript语言合约主要包括index.ts和contract.ts两个文件,其中index.ts为开发智能合约文件(contract.ts)依赖的合约SDK,合约涉及的业务相关开发仅在contract.ts文件,智能合约文件contract.ts需要根据实际业务进行开发。 合约SDK(index.ts)主要结构如下: // 引入智能合约文件 import { invoke, init } from "./contract";// 合约的初始化(wasm_init)接口。包含合约文件的init()接口,合约启动时,需要首先执行且只需要执行一次的逻辑放到合约文件init()接口中。export function wasm_init(buffer_offset: i32, size: i32):void{ // 实际调用合约文件的init()接口} // 合约被调用(wasm_invoke)接口。包含合约文件的invoke()接口,供合约使用者通过SDK的wasm_invoke接口调用。export function wasm_invoke(buffer_offset: i32, size: i32):void{ // 实际调用合约文件的invoke()接口}// 合约被调用(wasm_prepare)接口,保持为空即可。export function wasm_prepare():void{} 智能合约文件(contract.ts)主要结构如下: // 引入合约SDK方法 import { FuncName, smlog, Str2ArrayBuffer, Parameters, PutKV, ArrayBuffer2Str, GetKV, DelKV, MakeErrRes,MakeSuccessRes, Response,IteratorNew, IteValue, IteKey, IteNext, IteratorFree } from "./index"// 智能合约的初始化(init)接口的实现。export function init(txid:string):Response{}// 智能合约被调用(invoke)接口的实现。export function invoke(txid:string):Response{} 父主题: Wasm合约开发(AssemblyScript)
  • 基于SDK开发流程 基于SDK开发客户端需要进行以下步骤。 初始化 创建SDK实例对象,然后进行初始化。 构造消息 由于消息类型较多,所以根据消息类型进行封装,在构造消息之前,必须先获取消息类型对象,然后再基于获取对象中对应的方法封装消息。 获取节点 获取消息发送节点对象。 发送消息 所有的发送接口都封装在节点类中,发送消息时,先获取节点,再调用节点的消息发送对象获取方法。不同的消息对应不同的构建接口,同理,消息发送接口也根据接口类型进行了分装,在发送消息前,必须先获取接口类型对象,然后再基于获取对象中对应的方法发送消息。 结果解析 服务端返回的消息中,均包含交易最后执行结果的标志位,以此判断交易是否执行成功。若结果为不成功,则返回错误原因,用于分析定位。 结果监听 对于业务交易和投票类型等需要落盘的交易,即使消息发送成功,后续落盘时还可能产生各种校验失败,导致交易无效。因此还需要监听交易是否最终落盘成功。
  • SDK逻辑结构 SDK主要提供消息封装、发送模块及相应的配套组件。配套组件主要包含异常处理、配置文件解析、节点获取等功能接口。 消息封装 由于消息类型较多,因此按类型进行了分类封装。消息封装相关接口均在build这个包下面,包含了ContractRawMessage、QueryRawMessage这几种消息构造的封装类。 ContractRawMessage:包含交易背书、落盘两阶段消息的构建。 QueryRawMessage:包含所有查询相关接口的消息构建,目前支持交易详情查询、链状态查询、区块查询、合约信息查询等接口。 消息发送 同消息封装类接口,按类型进行了分类封装。消息发送相关接口均包含在action这个包下面,包含了ContractAction、QueryAction、EventAction这几种消息发送的封装类。 ContractAction:对应ContractRawMessage封装的消息的发送。 QueryAction:对应QueryRawMessage中封装的消息的发送。 EventAction:主要用于监听消息的最终状态,因为参数仅包含交易ID,消息封装的方法直接内置。同时所有的消息发送接口均提供同步和异步两种接口。 同步接口入参均为需要发送的消息,返回值为一个ListenableFuture对象,用于监听消息发送结果。 异步接口则传入需要发送消息的同时,还需要传入一个StreamObserver对象,用于异步获取消息发送结果。
  • SDK说明 华为链目前提供Java、Golang两种语言SDK, 区块链 服务启动时会启动一系列grpc接口,监听客户端发送的消息,与客户端交互完成各种请求。在开发客户端时,如果从底层grpc接口开始,进行各种消息封装、消息发送、返回值解析等工作,不仅会导致开发量过大,并且造成重复劳动。SDK则是将区块链服务提供的各种grpc接口进行封装,同时封装各接口所需类型的消息。在开发客户端时,只需要关注自己的业务逻辑,调用相应接口封装并发送消息即可,不需要关注底层消息发送接收的具体过程。 1. SDK中相关方法的使用示例,可参考应用程序开发对应语言的示例Demo。 2. SDK在不同环境下支持的实例安全机制如下: windows环境:ECDSA linux环境:国密算法、ECDSA
  • 合约相关的API contractapi.ContractStub提供如下API接口,可以在合约文件中进行调用。这些API按照功能可以划分为: 表1 辅助功能 接口 说明 FuncName() string 获取智能合约请求中指定的智能合约函数名称。 Parameters() [][]byte 获取请求参数。 ChainID() string 获取智能合约所在链ID。 ContractName() string 获取智能合约名称。 表2 账本数据操作 接口 说明 GetKV(key string) ([]byte, error) 获取某个键对应的值。 PutKV(key string, value []byte) error 添加或更新一对键值。 PutKVCommon(key string, value interface{}) error 添加或更新一对键值。其中值为结构体,需要实现Marshal() ([]byte, error)。 DelKV(key string) error 删除一对键值。 GetIterator(startKey, endKey string) (Iterator, error) 查询指定范围内的键值,查询范围是左闭右开的。 GetKeyHistoryIterator(key string) (HistoryIterator, error) 查询某个键的所有历史值。 SaveComIndex(indexName string, attributes []string, objectKey string) error 创建一个复合键。 例如为"zhangsan":{sex="male", height=175}创建用于查询性别的复合键,可调用SaveComIndex("sex", []string{"male"}, "zhangsan"),如创建用于查询性别和身高的复合键,可调用SaveComIndex("sex/height", []string{"male", "175"}, "zhangsan")。 GetKVByComIndex(indexName string, attributes []string) (Iterator, error) 通过复合键查找满足某种查询条件的键值对。 DelComIndexOneRow(indexName string, attributes []string, objectKey string) error 删除某个复合键。 父主题: Go合约开发