热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

长安链智能合约的开发、编译、安装、调用、查询(二)

作者:明神特烦恼 公众号:明神特烦恼 智能合约是区块链与业务关联度最大的部分,合约的友好性、安全性、执行效率也是优秀的智能合约引擎的重要指标,长

作者:明神特烦恼
公众号:明神特烦恼

智能合约是区块链与业务关联度最大的部分,合约的友好性、安全性、执行效率也是优秀的智能合约引擎的重要指标,长安链的支持多种语言的智能合约,包括go、rust、solidity、c++等。本节使用go语言开发智能合约,使用tinygo进行合约编译、使用go sdk 安装、调用、查询智能合约。

官方参考文档: https://docs.chainmaker.org.cn/dev/%E6%99%BA%E8%83%BD%E5%90%88%E7%BA%A6.html

1.开发智能合约
1)合约模板

    学习智能合约的开发,通常需要有Demo来学习API的使用方式,项目组织方式。在长安链学习过程中也是如此,所以第一步获取合约模块。
1.1)拉取镜像:docker pull chainmakerofficial/chainmaker-go-contract:1.1.1
长安链为我们提供合约开发的镜像,内部包含合约模板。

1.2)启动并进入容器: docker run -it --name chainmaker-go-contract -v ${PWD}:/home chainmakerofficial/chainmaker-go-contract:1.1.1 bash
启动chainmaker-go-contract容器并进入,同时将当前目录挂载到容器的 /home目录下

1.3) 解压并分析合约模板
cp /home
tar xzvf contract_go_template.tar.gz

  • 目录结构:
    其中业务逻辑在main.go中,//export注释的方法被编译器识别,用于外部访问。
    image.png
  • 合约逻辑
    save方法支持传入三个参数file_hashfile_nametime,以file_hash为索引存入区块链世界状态。
    findByFileHash方法支持传入一个参数file_hash,以file_hash为检索条件进行世界状态检索并返回。
  • 合约逻辑可任意修改,只要后续调用指定export的方法名即可

2)编译合约

按照官方参考文档方式 在chainmaker-go-contract容器中执行./build.sh
生成main.wasm文件

3)安装、调用、查询合约

  1. 下载go sdk代码

git clone --recursive https://git.chainmaker.org.cn/chainmaker/chainmaker-sdk-go.git


  1. 拷贝crypto-config文件

rm -rf chainmaker-sdk-go/testdata/crypto-config
cp -r chainmaker-go/build/crypto-config chainmaker-sdk-go/testdata/


  1. 编写测试用例
    可基于sdk_user_contract_claim_test.go文件进行修改。
    1)创建文件hash_test.go


package chainmaker_sdk_goimport ("chainmaker.org/chainmaker-go/common/random/uuid""chainmaker.org/chainmaker-sdk-go/pb/protogo/common""fmt""github.com/stretchr/testify/require""testing""time"
)var (hashContractName = "myhash001"hashVersion = "1.0.0"hashByteCodePath = "./testdata/hash-cc/main.wasm"
)func TestUserContractHash(t *testing.T) {fmt.Println("====================== create client ======================")client, err := createClientWithCertBytes()require.Nil(t, err)fmt.Println("====================== create admin1 ======================")admin1, err := createAdmin(orgId1)require.Nil(t, err)fmt.Println("====================== create admin2 ======================")admin2, err := createAdmin(orgId2)require.Nil(t, err)fmt.Println("====================== create admin3 ======================")admin3, err := createAdmin(orgId3)require.Nil(t, err)fmt.Println("====================== create admin4 ======================")admin4, err := createAdmin(orgId4)require.Nil(t, err)fmt.Println("====================== 创建合约 ======================")testUserContractHashCreate(t, client, admin1, admin2, admin3, admin4, true, true)fmt.Println("====================== 调用合约 ======================")fileHash, err := testUserContractHashInvoke(client, "save", true)require.Nil(t, err)fmt.Println("====================== 执行合约查询接口 ======================")//txId := "1cbdbe6106cc4132b464185ea8275d0a53c0261b7b1a470fb0c3f10bd4a57ba6"//fileHash = txId[len(txId)/2:]params := map[string]string{"file_hash": fileHash,}testUserContractHashQuery(t, client, "find_by_file_hash", params)
}func testUserContractHashCreate(t *testing.T, client *ChainClient,admin1, admin2, admin3, admin4 *ChainClient, withSyncResult bool, isIgnoreSameContract bool) {resp, err := createUserContract(client, admin1, admin2, admin3, admin4,hashContractName, hashVersion, hashByteCodePath, common.RuntimeType_GASM, []*common.KeyValuePair{}, withSyncResult)if !isIgnoreSameContract {require.Nil(t, err)}fmt.Printf("CREATE claim contract resp: %+v\n", resp)
}func testUserContractHashInvoke(client *ChainClient,method string, withSyncResult bool) (string, error) {//curTime := fmt.Sprintf("%d", CurrentTimeMillisSeconds())curTime := time.Now().Format("2006-01-02 15:04:05")fileHash := uuid.GetUUID()params := map[string]string{"time": "123","file_hash": fileHash,"file_name": fmt.Sprintf("file_%s", curTime),}err := invokeUserContract(client, hashContractName, method, "", params, withSyncResult)//err := invokeUserContractStepByStep(client, claimContractName, method, "", params, withSyncResult)if err != nil {return "", err}return fileHash, nil
}func testUserContractHashQuery(t *testing.T, client *ChainClient,method string, params map[string]string) {resp, err := client.QueryContract(hashContractName, method, params, -1)require.Nil(t, err)fmt.Printf("QUERY claim contract resp: %+v\n", resp)
}

2)执行TestUserContractHash Test方法

2.扩展

    这里使用的是默认配置文件,如果需要改变端口、连接数、TLS使能等等,需要修改chainmaker-sdk-go/testdata/sdk_config.yml


推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • 其实之前也有下载过完整的android源码,但是从来没有对这个做过一些总结,在加上最近需要经常去看,索性就在从新下载,编译一下,其实这些东西官网上面都有。http:sou ... [详细]
  • 1.脚本功能1)自动替换jar包中的配置文件。2)自动备份老版本的Jar包3)自动判断是初次启动还是更新服务2.脚本准备进入ho ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 本文介绍了GregorianCalendar类的基本信息,包括它是Calendar的子类,提供了世界上大多数国家使用的标准日历系统。默认情况下,它对应格里高利日历创立时的日期,但可以通过调用setGregorianChange()方法来更改起始日期。同时,文中还提到了GregorianCalendar类为每个日历字段使用的默认值。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • 本文介绍了Android平台各个版本的API级别、版本号以及平台亮点,从Android 1.0到Android 10.0,共涵盖了多个版本的特点和发展历程。详细内容请参考https://developer.android.google.cn/guide/topics/manifest/uses-sdk-element.html。 ... [详细]
author-avatar
寺儿沟小晨晨
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有