长安链ChainMaker在线合约编辑器-SmartEditor

SmartEditor简介

SmartEditor(后面简称IDE) 是长安链团队为长安链量身打造的在线合约编辑器。支持用 Go 语言写合约,支持长安链 v2.1.0+ 版本。

用户用浏览器访问 IDE 主页,然后用长安链 GitLab 账号授权登录之后,即可开始写合约。我们为每个新用户内置了模板合约,有合约编写经验的用户可以参考合约模板编写合约。我们也为没有经验的用户提供了合约编写说明,跟着说明一步一步没有任何经验的用户也可以编写出自己的第一个合约。对于想编写功能复杂的合约的用户,可以参考合约编写说明里面的合约 SDK 介绍,然后根据SDK提供的合约方法编写功能复杂的合约。

SmartEditor 提供了一系列功能帮助用户用户快速的编写和使用合约。比如 内置合约 SDK、合约模拟执行、合约导出、合约部署、合约调用等,后面会逐一介绍。

SmartEditor 界面展示:

(图1)

为什么要开发SmartEditor?

 

对于区块链来说,合约至关重要。如果链没有合约,就相当于一条静止的链,有了合约,链才可以动起来。

其实写合约就像用 Go 语言开发项目一样简单。在用户本地有 Go 开发环境的前提下,创建一个项目,导入合约 SDK 的依赖,然后使用合约 SDK 提供的方法,按照合约编写规范就可以写合约。

问题1:搭建合约编写环境可能要花费很长时间。

合约编写完成之后怎么验证合约的逻辑是否有错误呢?部署到测试链测试合约,可能会有些麻烦。

问题2:部署到测试链上可能稍微有点麻烦。

由于没有快速写合约的环境和方便的调试合约的方法,导致用户往往认为写合约太复杂,因此对写合约这件事望而却步。

问题3:未知的东西导致用户高估了写合约的难度。

针对上面这些问题,长安链团队开发了在线合约编辑器,用户不需要自己搭建合约编写环境,可以直接在线写合约。还可以模拟执行合约,验证合约逻辑是否有错误。以及一些便捷功能如部署合约和调用合约等。

做到写合约就像写 Go 代码一样简单。

SmartEditor功能及实现方式

开发初期,我们调研了一些开源的在线代码编辑器,考虑到轻量级和方便改造,最终选择了 Wide。

Wide 是一个轻量级的在线 Go 代码编辑器,提供代码自动补全,语法高亮、查找方法定义、代码编译、代码运行等功能。

我们在此基础上进行完善和改进。完善UI设计,以及查找定义和代码自动补全等功能。新增了合约编译、合约调试、合约部署和合约调用等功能。并且内置合约 SDK ,达到用户在IDE中可以直接写合约的效果。

对比图如下:

(图2)

内置合约 SDK

内置合约 SDK 到 Go SDK,做到用合约SDK 像用 Go SDK 一样方便。

首先把合约 SDK 源码放到 GOROOT 下的 src 目录。由于现在 Go SDK 也是使用 Go Modules 管理,所以放入之后先在 src 目录执行 go mod tidy 拉取合约SDK的依赖,然后执行 go mod vendor 重新生成 Go SDK 源码的 vendor 目录内容即可。

合约SDK和合约调试SDK

在 IDE 中,有两个不同的合约编译流程,一个流程编译出来的合约用于合约调试,另一个流程编译出的合约用于部署上链。

我们在合约 SDK 的基础上开发了合约调试 SDK。保证合约调试 SDK 和合约 SDK 实现相同的接口,提供相同的外部接口,然后把和链交互的部分改成本地模拟执行。这样用合约调试 SDK 编译出来的合约,可以在本地执行,不依赖链。依此提供合约调试功能。

合约 SDK和合约调试 SDK 的交互流程如下图所示:

(图3)

合约调试

合约调试功能,实际叫模拟执行合约。用合约调试 SDK 编译生成可执行文件,然后把可执行文件放到 Docker 中执行,执行完成后把合约打印的日志、发出的事件、世界状态和执行结果,通过 RPC 发送给 HTTP Server,然后服务端再把结果发送到浏览器。用户可以通过日志、世界状态和执行结果,验证合约执行是否符合预期。

合约调试怎么保持上次执行后的世界状态?

合约每次执行完成后我们会把世界状态保存在浏览器端,当用户再次执行合约时,浏览器端会把之前保存的世界状态一起发送给服务端,服务端据此初始化世界状态。做到模拟执行的连贯性。当然用户也可以在浏览器端清空世界状态信息。

模拟实现跨合约调用

在链上,跨合约调用是通过网络实现的。模拟执行时,跨合约调用是通过在代码中调用不同合约对象实现的。

假如有两个合约,合约 C1 和合约 C2,想要在 C1 中调用 C2 的方法,只需要让 C1 持有 C2 对象,然后在需要跨合约调用时调用 C2 的方法即可。

实际实现中,我们把跨合约调用涉及到的合约,放到一个工程下,根据规则修改合约的包结构,删除不需要的文件。然后生成初始化代码,把涉及到的合约对象放到 Map 中,在执行跨合约调用时,从 Map 中取出对应的合约执行相应的方法即可。编译生成一个可执行文件,并在 Docker 中执行该文件。

合约部署和合约调用

合约部署是指把合约部署到链上。合约调用是指调用链上的合约。

这两个功能的实现都依赖我们提供的浏览器插件 SmartPlugin。在插件里面用户可以上传证书和管理链。插件通过代理和链接的 PRC 接口交互,从而实现部署合约和调用合约的功能。

插件的使用可参考:SmartPlugin 使用文档

使用SmartEditor

下面是 SmartEdit 官网地址、使用说明和合约编写说明,用户可以访问这些地址开启使用 SmartEdit 之旅 。

SmartEditor 官网地址: 

https://ide.chainmaker.org.cn/ 

SmartEditor 使用说明 ,通过该文档,可以了解 SmartEditor 界面的功能分区和怎么使用 SmartEditor 提供的功能。(链接见文末)

SmartEditor 怎么写合约 ,通过该文档,可以从零开始写一个简单的合约,以及学习合约 SDK 的使用。(链接见文末)

在线IDE的发展趋势

我们调研了其它的在线代码编辑器,比如 Eclipse Che 和 VS Code 浏览器版本 Code-Server。

它们的定位是一个在线代码编辑平台。给用户提供一个在线的工作环境,用户可以在这里编写代码、调试代码、运行代码和代码版本管理等等。提供插件机制,用户可以安装不同的插件,来完善自己的工作环境,提高开发效率。功能非常丰富。

SmartEditor 的定位是一个在线合约编写平台,没有插件和代码版本管理等功能,只提供合约编写、编译、部署相关的功能,编写合约的用户使用起来会比较方便。因此我们选择比较轻量级的 Wide。

目前对于代码编辑器的两个核心功能代码编写和代码调试,有两个成熟的协议 Language Server Protocol 和 Debug Adapter Protocol。使用这两个协议,代码编辑器可以快速的支持多语言。如果未来需要支持多语言或者代码调试,我们会基于这两个规范进行开发。

代码编写和代码调试

Eclipse Che 和 Code-Server 的代码编写和代码调试基于 Language Server Protocol 和 Debug Adapter Protocol 协议实现。

代码编写 的功能包括代码自动补全、代码格式化、查找定义、查找使用和重命名等功能。Language Server Protocol 协议规范了这些功能的请求和响应数据,同一个实现该协议的客户端可以发送请求给实现该协议的不同服务端,客户端可以很方便的扩展多语言支持。如下图所示:

 (图4)

代码调试 的功能包括设置断点、执行到下一个断点、单步执行、进入方法、跳出方法等。Debug Adapter Protocol 定义了适配器协议,在代码调试工具前实现该协议,基于该协议的客户端就可以和不同的代码调试工具交互。如下图所示:

(图5)

相关链接

  • wide:

https://github.com/88250/wide

  • SmartEditor 在线体验:

https://ide.chainmaker.org.cn/login

  • SmartEditor 使用说明:

    https://ide.chainmaker.org.cn/doc/SmartEditor%20%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E/

  • SmartEditor 怎么写合约:

    https://ide.chainmaker.org.cn/doc/SmartEditor%20%E6%80%8E%E4%B9%88%E5%86%99%E5%90%88%E7%BA%A6/

  • SmartPlugin 使用文档:

    https://docs.chainmaker.org.cn/dev/%E9%95%BF%E5%AE%89%E9%93%BEWEB%E6%8F%92%E4%BB%B6-SmartPlugin.html

  • SmartPlugin 仓库:

    https://git.chainmaker.org.cn/chainmaker/chainmaker-smartplugin

  • CodeMirror:

https://codemirror.net/

  • Eclipse Che:

https://github.com/eclipse/che

  • Code-Server:

https://github.com/coder/code-server

  • Language Server Protocol :

    https://microsoft.github.io/language-server-protocol/

  • Debug Adapter Protocol :

    https://microsoft.github.io/debug-adapter-protocol/

  • Monaco Editor:

https://microsoft.github.io/monaco-editor/

RECOMMEND

推荐阅读

长安链ChainMaker容器虚拟机——DockerVM

长安链ChainMaker国密TLS设计与实现

长安链ChainMaker新特性——透明数据加密TDE

Tips

更多长安链开源项目QA,可登录开源社区、技术文档库查看。

下载源码

https://git.chainmaker.org.cn/chainmaker/chainmaker-go

查阅文档

https://docs.chainmaker.org.cn/

长安链ChainMaker案例征集

http://www.wenjuan.com/s/UZBZJvhFGte/

“长安链ChainMaker”是国内首个自主可控区块链软硬件技术体系,由微芯研究院联合头部企业和高校共同研发,具有全自主、高性能、强隐私、广协作的突出特点。长安链面向大规模节点组网、高交易处理性能、强数据安全隐私等下一代区块链技术需求,融合区块链专用加速芯片硬件和可装配底层软件平台,为构建高性能、高可信、高安全的数字基础设施提供新的解决方案,为长安链生态联盟提供强有力的区块链技术支撑。取名“长安链”,喻意“长治久安、再创辉煌、链接世界”。

猜你喜欢

转载自blog.csdn.net/weixin_55760491/article/details/123919278