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

2023-05-30 09:49:49 浏览数 (2)

在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

0 人点赞