从零学本体dApp开发(9): 本体中的一个简单的智能合约长什么样?

本文介绍了本体智能合约的开发,对比了Python与C/C++的语法差异,并详细解析了一个实现加法功能的简单智能合约的代码结构,包括头部、函数入口和执行逻辑。同时,讲解了编译后生成的ABI、AVM字节码和Opcode的作用。

 写在前面

最近在利用业余时间学习本体的开发。我打算把自己学习的过程记录下来,一方面便于自己梳理学到的东西,另一方面希望可以通过笔记的共享,能使本体后来的开发者少走弯路。

由于是初学者,学习本体开发的过程中遇到了很多问题,在此,特别感谢本体社区的各位老师(宏雷、楚笙、Mickey、雪飞的逆袭、Andy季、周佩文等)耐心地为我解答各种各样的问题,本体有你们,真好!

原创 | 工匠 (来自本体社区的技术人员)

---------------

学习本篇的目的:

 

《本体SmartX到底是个是啥》一文中我们介绍了helloword智能合约的创建流程,这一篇我们来学习一下一个简单的智能合约的代码长什么样子的。

 

 

 

目录:

1. Python与C/C++的语法不同点

2. 本体智能合约代码的组成部分

    2.1 头部

    2.2 合约的调用函数入口

     2.3 合约正真调用执行的逻辑

3. 智能合约编译生成的文件

 

本体的智能合约目前支持三种语言:C#,Python和Java,但是本体对不同语言的工具链、编译器和调试工具等支持最完备的是Python。所有我们学习智能合约开发可以先选择Python。

我们用写一个简单的智能合约,实现数学加法的功能,其代码如下:

 

 

1.Python与C的语法不同点

对于熟悉类C语言的程序员来说,Python语法有很大的不同,一开始会不太习惯,我们先来学习一下Python与C/C++的语法不同点:

 

1.1 头文件的引用:

Python:import

C语言:#include

1.2 函数的定义

Python 定义函数使用 def 关键字,一般格式如下:            

           def 函数名(参数列表):

                       函数体

C语言 定义函数需要声明,一般格式如下:

            类型 函数名(参数列表) {

             函数体;

              }

1.3 运算符

1.4 注释的使用

Python:

单行注释以 # 开头

多行注释以可以使用多个#,还可以使用 ' ' '或 " " "

C语言:

     单行注释以//开头

    多行注释以可以使用多个//,还可以使用 /* */

1.5 关于分号的使用

 在C、Java等语言的语法中规定,必须以分号作为语句结束的标识。Python也支持分号,同样用于一条语句的结束标识。但在Python中分号的作用已经不像C、Java中那么重要了,Python中的分号可以省略,主要通过换行来识别语句的结束。

 

例如,以下两行代码是等价的:

print "hello world!"

print "hello world!"

 

2.智能合约代码的组成部分

了解了Python的基础语法后再看这段代码就不那么难了。

 

一个简单的智能合约代码由三部分组成

1.头部(package的引用)

2.合约的调用函数入口(main函数)

3.合约正真调用执行的逻辑

 

 2.1 头部

 from boa.interop.boa.interop.System.Runtime import Notify

这一句其实和C语言包含头文件是一个道理,

import Notify的意思是我们导入Notify这个API函数,这个函数的作用是将消息推送到区块链的一个工具。

from boa.interop.boa.interop.System.Runtime 这一句的意思是Notify函数包含在boa.interop.boa.interop.System.Runtime这个package(包)中,这个包可以理解成C语言的库,那么Notify就是其中的一个库函数。

智能合约越复杂就会需要调用越多的package中的函数,如果想查看更多的package的用法可以查看一下文档:https://github.com/ontio/neo-boa/blob/master/Ontology_smart_contract_API_for_Python.md,截图如下:

 

这里面包含了很多package的用法。

 

2.2 合约的调用函数入口

每个程序都有一个入口函数main,智能合约的程序也不例外,这里定义的入口函数如下:

 

def Main(operation, args);

     if operation == "Add";    

           a = args[0]  

          b = args[1]    

       return Add(a, b)

 

这里其实就是通过传入operation,来判断合约要执行什么函数。

operation必须是字符串类型,是调用合约的名称,第二个是参数的数组,可以引入n个参数

 

2.3 合约正真调用执行的逻辑

合约的逻辑如下:

        def Add(a, b);  

             return a + b

我们这个简单的智能合约执行的逻辑就是一个加法算法,通过输入两个值,然后算出他们的和,在返回结果就结束了。

 

3.智能合约代码的编译

智能合约的代码经编译以后生成3个不同的文件,分别是ABI文件,AVM字节码和Opcode,如下图:

 

 

3.1 ABI文件是什么?

应用程序二进制接口(Application Binary Interface,ABI)定义了一组在系统软件上编译应用程序所需要遵循的一套规则,主要包括基本数据类型,参数的传递规则等。

ABI是关于合约的描述信息,描述了合约的具体结构的 JSON文件,包含了合约的哈希,入口函数,接口函数,函数的参数列表和返回值,事件等。当我们了解了合约的 ABI文件,我们就了解了该合约的具体功能。

 

3.2  AVM文件和Opcode是什么?

AVM Byte  code是编译生成的二进制code,当合约部署到区块链上时,合约字节码会存储在分配给合约的存储区里。

Opcode是本体记忆NeoVM生成的code,执行推栈入栈的操作。

 

写在最后

希望有更多的小伙伴参与到本体开发学习中来,让我们共同为本体的生态建设添砖加瓦!感兴趣的小伙伴可以联系我,共同学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值