前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >fabric区块链(三)—发布智能合约

fabric区块链(三)—发布智能合约

作者头像
酒楼
发布2023-05-30 09:49:49
8180
发布2023-05-30 09:49:49
举报
文章被收录于专栏:酒楼酒楼

在Fabric上发布智能合约:

TODO

  1. 编写智能合约代码

您需要使用支持的编程语言(如Go、Java、JavaScript等)编写智能合约代码。您可以使用Hyperledger Fabric提供的示例智能合约作为参考,了解智能合约的结构和编写方式。示例智能合约可在Hyperledger Fabric的官方文档中找到。

以下是针对 Hyperledger Fabric 的智能合约示例:

Go

代码语言:javascript
复制
package main

import (
 "fmt"
 "github.com/hyperledger/fabric-contract-api-go/contractapi"
)

type MyContract struct {
 contractapi.Contract
}

func (c *MyContract) Set(ctx contractapi.TransactionContextInterface, key string, value string) error {
 err := ctx.GetStub().PutState(key, []byte(value))
 if err != nil {
  return fmt.Errorf("failed to set key %s: %v", key, err)
 }
 return nil
}

func (c *MyContract) Get(ctx contractapi.TransactionContextInterface, key string) (string, error) {
 value, err := ctx.GetStub().GetState(key)
 if err != nil {
  return "", fmt.Errorf("failed to get key %s: %v", key, err)
 }
 if value == nil {
  return "", fmt.Errorf("key %s does not exist", key)
 }
 return string(value), nil
}

func main() {
 cc, err := contractapi.NewChaincode(&MyContract{})
 if err != nil {
  fmt.Printf("Error creating MyContract chaincode: %s", err.Error())
  return
 }
 if err := cc.Start(); err != nil {
  fmt.Printf("Error starting MyContract chaincode: %s", err.Error())
 }
}

Java

代码语言:javascript
复制
package org.example;

import org.hyperledger.fabric.contract.ContractInterface;
import org.hyperledger.fabric.contract.annotation.Contract;
import org.hyperledger.fabric.contract.annotation.Default;
import org.hyperledger.fabric.contract.annotation.Transaction;

@Contract(
        name = "MyContract",
        info = @Default(
                org.hyperledger.fabric.contract.annotation.Info(
                        title = "My Contract",
                        description = "My Smart Contract"
                )
        )
)
public final class MyContract implements ContractInterface {

    @Transaction()
    public void set(final Context ctx, final String key, final String value) {
        byte[] buffer = value.getBytes();
        ctx.getStub().putState(key, buffer);
    }

    @Transaction()
    public String get(final Context ctx, final String key) {
        byte[] buffer = ctx.getStub().getState(key);
        if (buffer == null || buffer.length == 0) {
            throw new RuntimeException("Key does not exist");
        }
        return new String(buffer);
    }
}

JavaScript

代码语言:javascript
复制
'use strict';

const { Contract } = require('fabric-contract-api');

class MyContract extends Contract {
    async set(ctx, key, value) {
        await ctx.stub.putState(key, Buffer.from(value));
    }

    async get(ctx, key) {
        const value = await ctx.stub.getState(key);
        if (!value || value.length === 0) {
            throw new Error(`Key ${key} does not exist`);
        }
        return value.toString();
    }
}

module.exports = MyContract;

这些示例仅仅是 Hyperledger Fabric 的智能合约的简单入门,实际的智能合约通常更加复杂。

  1. 打包智能合约代码

在发布智能合约之前,需要将智能合约代码打包为一个可执行文件。要打包代码,需要使用peer lifecycle chaincode package命令。以下是一个示例命令:

代码语言:javascript
复制
peer lifecycle chaincode package mycc.tar.gz --path /path/to/chaincode --lang node --label mycc_1.0

这个命令将使用/path/to/chaincode目录中的Node.js链码代码创建一个名为mycc_1.0的标签,并将其打包为mycc.tar.gz文件。

  1. 安装智能合约

要安装智能合约,您需要使用peer lifecycle chaincode install命令。以下是一个示例命令:

代码语言:javascript
复制
peer lifecycle chaincode install mycc.tar.gz

这个命令将mycc.tar.gz文件安装到Peer节点上。请注意,此命令将返回智能合约的包ID,需要将其用于后续步骤。

  1. 审批智能合约

在将智能合约发布到通道之前,您需要审批智能合约定义。要审批智能合约,您需要使用peer lifecycle chaincode approveformyorg命令。以下是一个示例命令:

代码语言:javascript
复制
peer lifecycle chaincode approveformyorg --channelID mychannel --name mycc --version 1.0 --package-id mycc_1.0:3b3f3d55f08c7d8e00fcb6f10ef6da24d158d371fe123bf54291be7cf32d1703 --sequence 1 --tls true --cafile /path/to/orderer/ca.crt

这个命令将批准mychannel通道上的mycc链码的1.0版本。请注意,此命令需要指定用于连接到Orderer的TLS证书和根证书。

  1. 将智能合约提交到通道

在审批智能合约之后,您需要将其提交到通道。要将智能合约提交到通道,您需要使用peer lifecycle chaincode commit命令。以下是一个示例命令:

代码语言:javascript
复制
peer lifecycle chaincode commit -o localhost:7050 --tls true --cafile /path/to/orderer/ca.crt --channelID mychannel --name mycc --version 1.0 --sequence 1 --init-required --tlsRootCertFiles /path/to/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:7051 --tlsRootCertFiles /path/to/peer0.org1.example.com/tls
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在Fabric上发布智能合约:
  • TODO
    • Go
      • Java
        • JavaScript
        相关产品与服务
        区块链
        云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档