fabric智能合约开发的相关API

链码开发重写两个方法

type Chaincode interface

func Init(stub ChaincodeStubInterface) peer.Respone

func Invoke(stub ChaincodeStubInterface) peer.Respone

链码相关的API

GetFunctionAndParameters() (function string, params []string):返回调用链码时在交易提案中指定提供的被调用的函数名称及其参数列表

GetState(key string) ([]byte, error) :根据指定的 Key 查询相应的数据状态。

PutState(key string, value []byte) error:根据指定的 key,将对应的 value 保存在分类账本中。

DelState(key string) error:根据指定的 key 将对应的数据状态删除

GetHistoryForKey(key string) (HistoryQueryIteratorInterface, error):根据指定的 key 查询所有的历史记录信息。

GetPrivateDataQueryResult(collection, query string) (StateQueryIteratorInterface, error):根据指定的查询字符串执行富查询 (只支持支持富查询的 CouchDB)。

shim.Error(msg string) 是一个用于返回错误的函数

shim.Success(payload []byte) 是一个用于返回成功响应的函数。

Start(obj Chaincode) 是一个链码启动函数。在Hyperledger Fabric中,链码是通过容器化的方式运行的,而Start方法用于指定链码的入口点。

代码示例

定义一个名为PaymentChaincode的结构体声明InitInvoke两个属于PaymentChaincode的方法。

type PaymentChaincode struct {

}

实现Init方法

func(account *PaymentChaincode) Init(stub shim.ChaincodeStubInterface)peer.Response {

    // 初始化账户a的余额为100,账户b的余额为200

    err:=stub.PutState("a",[]byte("100"))

    if err != nil {

        return shim.Error("初始化a发生错误"+ err.Error())

    }

    err=stub.PutState("b",[]byte("200"))

    if err != nil {

        return shim.Error("初始化b发生错误"+ err.Error())

    }

 //返回执行结果

    return shim.Success(nil)

}

实现Invoke方法

func (account *PaymentChaincode) Invoke(stub shim.ChaincodeStubInterface)peer.Response {

    funName,args := stub.GetFunctionAndParameters()

    if funName =="find"{

        return find(stub,args)

    }else if funName =="transfer"{

            return transfer(stub,args)

    }

    return shim.Error("不支持的操作")

}

自定义find方法

//find方法表示查询余额功能实现

func find(stub shim.ChaincodeStubInterface,args []string)peer.Response{

    if len(args)!=1{

        return shim.Error("参数错误")

    }

    balance,err :=stub.GetState(args[0])

    if err!=nil{

        return shim.Error("获取账户"+args[0]+"余额发生错误:"+err.Error())

    }

    return shim.Success(balance)

}

自定义transfer方法(需要判断账户是否存在,转账是否成功)

//transfer方法表示转账功能实现

func transfer(stub shim.ChaincodeStubInterface,args []string)peer.Response{

    if len(args)!=3{

        return shim.Error("参数数量不正确")

    }

    //获取接收到的参数

    fromAccount:=args[0]

    toAccount:=args[1]

    amount,_:=strconv.Atoi(args[2])

    //获取俩个账户的余额信息

    // 获取发送方和接收方的余额

    fromBalanceBytes, err := stub.GetState(fromAccount)

    if err != nil {

        return shim.Error(fmt.Sprintf("获取账户 %s 余额失败:%s", fromAccount, err))

    }

    if fromBalanceBytes == nil {

        return shim.Error(fmt.Sprintf("账户 %s 不存在", fromAccount))

    }

    toBalanceBytes, err := stub.GetState(toAccount)

    if err != nil {

        return shim.Error(fmt.Sprintf("获取账户 %s 余额失败:%s", toAccount, err))

    }

    if toBalanceBytes == nil {

        return shim.Error(fmt.Sprintf("账户 %s 不存在", toAccount))

    }

    // 将字节转换为整数

    fromBalance := int(fromBalanceBytes [0])

    toBalance := int(toBalanceBytes[0])

    //检查转账金额是否超过发送方余额

    if fromBalance < amount {

        return shim.Error("转账金额超过发送方余额")

    }

    // 更新发送方和接收方的余额

    fromBalance -= amount

    toBalance += amount

    // 将更新后的余额写回账本中

    err = stub.PutState(fromAccount, []byte(strconv.Itoa(fromBalance)))

    if err != nil {

        return shim.Error(fmt.Sprintf("更新账户 %s 余额失败:%s", fromAccount, err))

    }

    err = stub.PutState(toAccount, []byte(strconv.Itoa(toBalance)))

    if err != nil {

        return shim.Error(fmt.Sprintf("更新账户 %s 余额失败:%s", toAccount, err))

    }

    return shim.Success(nil)

}

调用Start方法启动

func main() {

    err := shim.Start(new(PaymentChaincode))

    if err != nil {

        fmt.Printf("Error starting")

    }

}

  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为一名AI语言模型,我并不具备开发fabric智能合约的实践能力,但我可以给你一些基本信息。 fabric智能合约是一种用于Hyperledger Fabric平台的智能合约,它可以用于定义和管理各种资产,并提供了一个安全的、可编程的方式来管理这些资产的交易和状态。在fabric智能合约开发中,需要使用一种称为链代码(chaincode)的程序来实现智能合约逻辑。链代码是一种独立运行的程序,它可以被安装在fabric网络的节点上,并与其他链代码共同协作完成智能合约的执行。 在fabric智能合约开发中,需要使用一些工具和技术,如: 1. Hyperledger Fabric SDK:提供了一种编写、测试和部署fabric智能合约API。 2. Docker:用于打包和部署链代码,以及构建fabric网络。 3. Go或Java:链代码可以用Go或Java等编程语言编写。 4. VS Code或其他编辑器:用于编写和调试链代码。 在开发fabric智能合约时,需要遵循一些最佳实践,如: 1. 在编写链代码时,需要考虑安全性和可靠性问题,以确保合约的正确执行。 2. 链代码应该尽可能简单,以便于维护和升级。 3. 在编写链代码时,需要考虑性能和可扩展性问题,以应对不断增长的交易量。 4. 在测试链代码时,需要尽可能模拟真实的环境,并采用自动化测试工具来提高测试效率。 总之,fabric智能合约开发需要掌握一些基本的工具和技术,同时需要遵循一些最佳实践,以确保合约的安全、可靠和高效执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值