IBAX开发教程
入门指南
部署
进阶指南
我们将通过命令行工具 (opens new window) 在IBAX区块链上部署智能合约 , 并学习何如调用智能合约。作为我们的第一个智能合约,我们将其部署到本地测试网络 上,如何部署本地网络你可以参考网络部署 , 因此您不需要任何开销就可以随意部署和运行它。
创建应用
调用智能合约@1NewApplication创建应用,该智能合约有一个应用名称参数和一个修改权限参数 。
下面按行解释:
- 第1行,启动命令行终端。
- 第5行,调用智能合约@1NewApplication创建一个应用,应用名称为
testapp
,应用修改权限为开发者权限@1DeveloperCondition
。 - 第8行,交易产生的区块id。
- 第9行,交易产生的区块哈希。
- 第10行,如果交易执行失败(0:无惩罚 1:惩罚)。
- 第11行,如果交易执行失败,则返回一条错误文本消息,如果返回了区块id,err字段为该应用的id。
当然如果你想查看这个智能合约有哪些字段,字段类型,可以调用getContractInfo
方法,它将返回智能合约信息,如下:
fields
字段为该智能合约的参数,包括参数的名称name
,类型type
,可选项optional
,Name
和Conditions
为必填项,VotingId
为可选项,可参考contract/name API方法。
编写智能合约
我们使用Needle 编写智能合约,我们实现一个简单的加法运算,智能合约源码如下,我们将智能合约保存为SumMath.sim
。
下面按行解释:
- 第1行,我们定义了一个名称为SumMath的智能合约。
- 第2行, 数据部分 。
- 第3-第4行,我们定义了两个输入64位整数型参数
A B
。 - 第6行,条件部分 。
- 第9行,操作部分 我们定义了一个变量sum,用于接收A+B结果,将sum的值赋给$result,作为智能合约的返回结果.当然也可以直接将A+B的值赋给$result,但它可以作为一个例子展示.
创建智能合约
有两种方法创建智能合约,第一种方法:
第一步我们编写一个智能合约参数文件,文件格式为json:
其中ApplicationId
为应用id,Value
为智能合约源码,需要对特殊字符进行转义处理,Conditions
为该智能合约修改权限。
我们将它命名为SumMathParams.json
。
第二步调用创建智能合约@1NewContract。
第二种方法:
直接将保存的智能合约源码文件传入智能合约参数中,参数格式为参数名称
+ -
+ "file",paramsName-file
如下:
下面按行解释:
- 第1行:调用智能合约@1NewContract创建智能合约,-f使用文件导入智能合约参数。
- 第3行,交易产生的区块id。
- 第4行,交易产生的区块哈希。
- 第5行,如果交易执行失败(0:无惩罚 1:惩罚)。
- 第6行,如果交易执行失败,则返回一条错误文本消息,如果返回了区块id,err字段为该智能合约的id。
我们试着调用一下刚刚部署的智能合约。
调用完成,结果符合预期,下面按行解释:
- 第1行调用智能合约,这里我们将智能合约部署到了生态id为5的生态里,当然如果当前所在生态id为5,同一个生态中时,也可以这么调用
callContract SumMath {"A":1, "B":2}
。 - 第3行,交易产生的区块id。
- 第4行,交易产生的区块哈希。
- 第5行,如果交易执行失败(0:无惩罚 1:惩罚)。
- 第6行,如果交易执行失败,则返回一条错误文本消息,如果返回了区块id,err字段为该智能合约的结果,也就是
$result
的值。
在本教程中,您将学习如何:
1、创建生态
2、创建应用
3、创建数据表
4、创建应用参数
5、创建和部署智能合约
6、创建生态参数
7、添加本地化
8、修改智能合约
9、修改数据表权限
为了更清楚的了解IBAX生态与应用是怎么样的,做什么用的,首选我们了解一下生态和应用应该属于那一部分,我们通过一个简单的思维导图可以更好的理解:
可以看到IBAX网络可以有许多生态 ,每个生态可以有多个应用 ,每个应用都有智能合约 ,数据表 , 生态有生态参数,应用有应用参数
第1步创建生态
我们先使用命令行工具 (opens new window) 创建一个生态, 调用智能合约@1NewEcosystem.如果你想修改生态名称,可以调用@1EditEcosystemName
智能合约.
下面按行解释:
- 第1行,启动了命令行控制台程序。
- 第5行,调用智能合约@1NewEcosystem创建一个生态,该生态名称为
test ecosystem
。 - 第8行,交易产生的区块id。
- 第9行,交易产生的区块哈希。
- 第10行,如果交易执行失败(0:无惩罚 1:惩罚)。
- 第11行,如果交易执行失败,则返回一条错误文本消息,如果返回了区块id,err字段为该生态的id为
18
。
然后我们配置命令工具config.yml
,将ecosystem
设置为创建的生态id18
,重新启动命令行控制台程序。
第2步创建应用
调用智能合约@1NewApplication
创建应用,该智能合约有一个应用名称参数和一个修改权限参数 (opens new window) 。
如果你需要修改应用权限,可以调用EditApplication
智能合约。
下面按行解释:
- 第1行,调用智能合约@1NewApplication创建一个应用,应用名称为
GradesRecorder
,应用修改权限为开发者权限@1DeveloperCondition
。 - 第4行,交易产生的区块id。
- 第5行,交易产生的区块哈希。
- 第6行,如果交易执行失败(0:无惩罚 1:惩罚)。
- 第7行,如果交易执行失败,则返回一条错误文本消息,如果返回了区块id,err字段该应用的id为
47
。
我们写一个简单的例子,这个应用可以记录学生的成绩,数据表字段包括学生的信息,年级grade
,班级class
,科目成绩mathematics,physics,literature
,综合评分overall_score
,评级score
,创建时间戳(ms)created_at
。
第3步创建数据表
第一步我们编写一个智能合约参数文件,文件格式为json:
其中ApplicationId
为应用id,Name
为创建的数据表名test_teble
,ColumnsArr
为数据表字段数组,TypesArr
为数据表字段的类型,包括9种类型 。varchar
,character
,json
,number
,datetime
,double
,money
,text
,bytea
,字段名跟字段类型是一一对应关系,InsertPerm
为数据表新建条目权限,UpdatePerm
为数据表更新条目权限,ReadPerm
为数据表数据读取权限,NewColumnPerm
为新建数据表字段权限。参考权限管理 ,这里的ContractConditions(\"MainCondition\")
为当前生态创建者可用。
我们将它命名为createTable.json,然后调用智能合约创建数据表@1NewTableJoint
。
修改数据表字段权限
我们可以修改数据表字段权限,数据表字段权限包括读取权限和更新权限,其中读取权限,在智能合约使用DBFind.Columns
筛选字段或者接口如list (opens new window) 查询时,如果没有权限则会报权限错误,更新权限即为更新数据表字段的权限。 我们将student
字段读取和更新权限设置为false
,当然也可以设置为某个智能合约可操作。 调用@1EditColumn
智能合约修改数据表字段权限。
我们可以创建几个应用参数grade_best_type
,grade_type_a+
,grade_type_a
,grade_type_b+
,grade_type_b
,grade_type_c
,成绩评级类型。
第4步创建应用参数
调用智能合约@1NewAppParam
创建应用参数,如果你要修改应用参数可以调用@1EditAppParam
智能合约.
其中grade_best_type
为最好的评级类型,grade_type_a+
为评级A+
所触发的条件,当分数大于等于90并且小于101时,评为A+
,其他参数类似。
第5步创建智能合约部署智能合约
我们创建一个智能合约,用于记录学生各科目成绩信息与最终评级,录入信息时输入学生的年级班级与各科目成绩,根据输入的各科的成绩做平均运算,得出综合评分overallScore
与最终评级score
,当调用智能合约时,将创建一条记录到我们刚刚创建的数据表中grade_info
。
首先我们编写一个智能合约,将它命名为NewRecord.sim
。
下面按行解释:
- 第2行,数据部分 定义了输入参数
Student
学生名称,Grade
年级,Class
班级,Mathematics
数学分数,Physics
物理分数,Literature
文学分数。 - 第10行,getScore函数,根据各科成绩得出综合评分与最终评级。
- 第30行,safeJsonDecode函数,将字符串进行json解码并转为map。
- 第38行,条件部分 。
- 第39行,操作部分 。
可以看到,当智能合约被调用时,首先走条件部分,验证智能合约输入参数是否有效,比如学生名称if Size($Student) == 0 {
是否为空(第39行),如果为空,则返回报错信息。"Student Can not be empty"
(第30行),当所有输入参数都校验通过后,第61行,使用DBFind 从数据库检索生态id为18
,应用名称为GradesRecorder
并且未删除deleted=0
的应用信息,第69行-74行,使用AppParam 检索应用参数, 如$gradeBestType = AppParam(app_id, "grade_best_type", $eId)
(第69行),如果应用参数为json格式存储,如grade_type_a
,你可以参考$gradeTypeABest = safeJsonDecode(AppParam(app_id, "grade_type_a+", $eId))
,将获取到的应用参数通过safeJsonDecode函数转为map格式。
然后执行到操作部分,调用getScore函数获取得出综合评分与最终评级(第10行),使用map存储,第79行,定义一个map,保存学生成绩信息,DBInsert 往数据表@18grade_info
插入数据。
有两种方法创建智能合约,第一种方法:
首先我们编写一个智能合约参数文件,文件格式为json:
其中ApplicationId
为应用id,,需要对特殊字符进行转义处理,Conditions
为该智能合约修改权限,Value
智能合约源码,我们将它保存为NewRecordParams.json
:
编写完智能合约后,我们需要部署智能合约,调用创建智能合约@1NewContract
。
下面按行解释:
- 第1行:调用智能合约
@1NewContract
创建智能合约,-f使用文件导入刚刚创建的文件NewRecord.json
作为智能合约参数。 - 第3行,交易产生的区块id。
- 第4行,交易产生的区块哈希。
- 第5行,如果交易执行失败(0:无惩罚 1:惩罚)。
- 第6行,如果交易执行失败,则返回一条错误文本消息,如果返回了区块id,err字段该智能合约的id为
348
。
第二种方法:
直接将保存的智能合约源码文件传入智能合约参数中,参数格式为参数名称
+ -
+ "file",paramsName-file
如下:
我们试着调用一下刚刚创建的智能合约。
调用完成,接着我们查一下数据表是否保存了一条记录。
可以看到在数据表中已有一条记录,student
tom的综合评分为56 评级为C。
以上例子仅用于学习研究使用,你需要根据实际情况更改相关参数,比如数据表的写入权限, 智能合约的修改权限等。
比如说我们要指定一个一个人才能调用这个新建记录的智能合约,其他所有人都不可以调用,我们可以设置一个生态参数new_record_account
。
第6步设置生态参数
调用智能合约@1NewParameter
,将在@1parameters
表创建生态参数new_record_account
,如果你需要修改生态参数可以调用@1EditParameter
。
我们创建了一个生态参数new_record_account
,设置值为keyId 6667782293976713160
, 修改权限为ContractConditions("MainCondition")
指当前生态创建者可修改。交易执行成功时,"err"字段该生态参数id为273
。
第7步添加本地化
可以调用@1NewLangJoint
智能合约创建本地化参数account_not_access
,将在@1languages
表创建参数,你可以通过@1EditLangJoint
修改本地化参数.
第8步修改智能合约
接着我们需要修改一下合约源码conditions
部分,在conditions
添加如下代码。
调用修改合约@1EditContract,这里的Id
为合约id, Value
:为合约源码。
第9步修改数据表权限
这里我们需要将数据表的插入权限修改,原先权限ContractConditions("MainCondition")
为生态创建人,而合约设置new_record_account
并不是生态创建人,所以只需将ContractConditions("MainCondition")
修改为指定合约可操作ContractAccess("@18NewRecord")
即可.调用合约@1EditTable
修改数据表权限。
接着调用一下刚刚修改的合约,新建一条记录。
可以看到我们刚刚设置的本地化参数account_not_access
起作用了。
发现报了权限错误,当前用户没有权限操作,我们切换到keyId为6667782293976713160
的账户,我们可以通过命令行工具account info
获取当前用户的信息。设置命令行工具config.yml,切换到keyId为
6667782293976713160`的账户。设置完成后,再次调用合约。
调用完成,通过getList @18grade_info
查询数据表,结果符合预期。
希望本文能帮助您更多地了解IBAX网络如何工作以及如何编写清晰安全的Needle
代码。
在本教程中,您将学习如何:
在开始本教程之前,你需要有一个自己的应用并且知道生态与应用的概念,你可以参考入门指南 。我们将通过命令行工具 (opens new window) 在IBAX区块链上导入应用、导出应用。
导出应用
调用account info
可以查询当前的账户信息,这里登录的生态id为9
,调用getList
命令可以查询当前生态有哪些应用。
可以看到当前生态有6个应用,我们使用export
命令导出id
为36
的应用。
这里的-f参数,将要导出的应用保存到当前目录data.json
文件中,如果没有-f参数,则将在命令终端输出应用数据。
export
命令封装了导出应用的步骤,你可以使用以上命令导出应用,或使用以下步骤,具体步骤如下:
调用合约@1ExportNewApp
导出一个新的应用,会在1_buffer_data
表生成一条导出应用的记录。
调用合约@1Export
导出应用,在1_buffer_data
表中查找所选应用程序,并将所有应用程序资源导出到生成的 json 字符串中。生成的 json 字符串将写入当前生态系统的1_binaries
表。
通过getList
命令查询1_binaries
表中的数据。
得到二进制文件id和hash。调用binaryVerify
命令导出二进制文件。
导入应用
使用import
命令导入应用,-f
参数为指定导入的应用文件。
其中import
命令封装了导入应用的步骤,你可以使用以上命令导入应用。
或使用以下步骤,为方便学习与研究,具体步骤如下:
- 第1步,调用合约
@1ImportUpload
导入一个新的应用,会在1_buffer_data
表生成一条导出应用的记录。@1ImportUpload
该合约参数Data
为file
类型 ,包含关键字Name
文件名(string),MimeType
文件类型(string),Body
([]byte)文件内容。你需要将应用文件数据进行base64编码后传入Body
中,可以使用base64Encode
命令进行base64编码。
- 第2步,调用完成后,使用
getList
命令查询1_buffer_data
表中的数据。
- 第3步,将value.data->Data中的数据组装成一维数组,[a,b,c,d],然后创建一个合约参数文件
importParams.json
,内容如下:
-第4步,调用合约@1Import
导入应用数据。
在本教程中,您将学习如何:
- 申请加入生态
- 添加生态成员
- 冻结账户
- 角色管理
- 生态代币发行
- 生态代扣
- DAO治理生态
在开始本教程之前,你需要有一个自己的应用并且知道生态与应用的概念,你可以参考入门指南 。我们将通过命令行工具 (opens new window) 在IBAX区块链上进行生态配置。
申请加入生态
我们可以调用@1MembershipRequest
合约申请加入生态。如下例子:
申请加入生态id为19
的生态,@1MembershipRequest
合约对调用生态做了限制,只有在基础生态才可调用,当申请成功后,目标生态管理者会收到一条申请,只有申请被生态管理者批复后才算是加入了目标生态,当然如果目标生态是公开的,你可以直接加入目标生态。
添加生态成员
当生态刚创建时,生态成员只有生态创建者,当你需要邀请其他成员加入时,你需要知道被邀请人的公钥,然后调用合约@1MembershipAdd
添加成员。
如果生态是公开的允许任何人加入,你可以设置生态参数free_membership
= 1,默认是不公开的,设置完成后,无需通过审批即可加入你的生态。
如果你没有设置参数free_membership
,其他成员申请加入你的生态时,你将会收到一条申请通知,可通过``查看所有的角色通知。
调用@1MembershipDecide
合约批复申请,合约参数NotificId
为通知id,'Accept'为决议标识,决议标识1
为通过。
冻结账户
调用@1DeleteMember
合约冻结账户,注意此操作无法还原。
角色管理
新建角色
调用@1RolesCreate
合约新建角色,角色名student
,类型2
(1-可分配 2-通过投票选任类型 3-System)。
返回结果里包含角色id 21
。
添加角色成员
有两种方法,第一种方法,生态成员发起申请,调用合约@1RolesRequest
申请添加为该角色成员,其中Rid
为角色id。
第二种方法,角色管理者分配角色成员,角色管理者调用合约@1RolesAssign
添加该角色的成员。
删除角色成员
首先我们查看某个角色有哪些成员,我们可以通过getList查询,如下所示:
其中where
条件ecosystem
指定生态,role->id
指定角色id,deleted
: 0指定未删除。我们可以看到查询到了3条记录,假如我们要移除成员为1273-2644-xxxx-5846-6598
的角色权限,即id
为21
的角色。管理员可以调用合约@1RolesUnassign
删除角色成员,如下所示:
修改角色管理者
我们查看一下当前生态的角色。
其中roles_access
为当前角色的管理角色,它是一个数组,可以有多个。我们给teacher
这个角色添加管理角色,调用@1RolesAccessManager
合约,其中合约参数Action
管理操作符(clean
清空,remove
删除,add
添加),Rid
要管理的角色ID,ManagerRid
该 Rid 角色的管理者。
删除角色
我们可以调用@1RolesDelete
合约删除角色,其中合约参数Rid
要管理的角色ID,Ops
为操作符(D
为删除 R
为恢复)
生态代币发行
创建生态
创建一个生态, 调用@1NewEcosystem
合约。
然后我们修改命令行工具配置,登录到新创建的这个生态ecosystem: "21"。
安装基础应用
调用合约安装基础应用,如下所示:
第1行,安装平台应用。
第2行,安装默认角色。
第3-4行,安装生态配置与代币发行应用,其中应用id 5,6
可通过getList查询,如下:
生态发币
因为是新建的生态,需要进行代币发行设置,调用@1TeSettings
合约指定可发行代币的角色。
其中RoleDeveloper
为当前生态角色id,可通过@1roles
数据表获取。
代币发行 调用@1NewToken
合约发行代币。
其中合约参数Symbol
为代币符号,Name
为代币名称,Amount
为总额,Digits
为精度。
增发代币
销毁代币
默认增发代币和销毁代币是允许的,你可以通过@1TeChange
设置关闭,其中TypeChange
为类型(emission
增发,withdraw
销毁),Value
为开关状态(1
开启,2
关闭),例如:关闭增发 注意:关闭后无法开启 。
关闭销毁,如果你想再次开启销毁功能,将Value
置为1
即可。
生态代扣
在设置生态代扣之前,你需要了解IBAX收费模型,可在 白皮书 (opens new window) 中找到.
我们首先设置生态钱包地址,调用@1EditParameter
合约,修改生态参数:
其中Id
为生态钱包ecosystem_wallet
参数id,可通过如下方式查询:
Value
值为将要绑定的生态钱包地址,合约产生的gas费,由该地址付款。该地址必须在当前生态有足够的代币,并且需要被绑定地址同意后才会修改成功。
调用@1EcoFeeModeManage
合约设置多生态扣费,如下:
其中合约参数字段定义如下:
FollowFuel
参数为跟随生态1费率的倍数。 CombustionFlag
是否开启生态交易gas费燃烧,1-否,2-是。 CombustionPercent
燃烧百分比,仅开启gas费燃烧生效,取值1到100,未开启时为0。 VmCostFlag
虚拟机费用标识,设置直付或代付,1-直付,2-代付。 StorageFlag
存储费用标识,设置直付或代付,1-直付,2-代付。 ExpediteFlag
加急费用标识,设置直付或代付,1-直付,2-代付。 VmCostConversionRate
虚拟机费用转换率,小数位2位,仅代付生效,大于零。 StorageConversionRate
存储费用转换率,小数位2位,仅代付生效,大于零。
如果你使用了上述设置,所有用户在该生态内调用合约所产生的交易费用,由当前生态设置的生态钱包统一支付。所有用户只需要支付在该生态内所产生的gas费用.当然你可以根据实际需要,调整对应费用参数。
DAO治理生态
在修改为DAO治理生态之前,你需要确保当前生态已经发行代币,修改为DAO治理生态后,生态所有的提案都将由治理委员会成员投票决定,不再单独由生态开发者管理, DAO治理委员会成员由生态持币量前50名代表当选。
调用@1EditControlMode
合约,将生态治理模式改为DAO治理模式。
其中Value
参数 1
表示创建者模型 2
表示DAO治理模型。
我们可以试着创建一个应用:
这个时候会生成一个DAO治理提案,经过DAO治理委员会投票通过后才会创建应用.有效提案需75%的投票数中68%的通过率.
DAO治理范围包括:
1、增删改应用、合约、页面、代码片段、选项卡、菜单、应用参数、数据表及字段。
2、修改多语言。
3、DAO和创建者模型开关。
4、编辑生态参数。
5、角色,分配移除角色成员。
6、增发销毁币种。
7、修改平台参数。
8、修改生态信息。
9、修改延迟合约。
10、修改投票模版。
在开始本教程之前,你需要下载IBAX应用打包工具 (opens new window) ,我们需要使用这个工具打包IBAX应用程序。
我们需要按照以下目录结构存放应用程序文件:
如下所示:
其中app_params
目录存放应用参数文件,命名使用参数名+文件格式.csv
,文件内容为参数值.contracts
目录存放合约,.sim
文件格式,文件内容为合约源码.tables
目录存放应用数据表结构,json
文件格式,如下所示:
name
为数据表字段名称,conditions
为数据表字段权限,type
为字段类型。
第1步,我们生成一个config.json文件,将它保存到airdrop目录,文件内容如下所示:
其中name
为此应用的名称,conditions
: 为修改该应用的权限,然后将它保存到airdrop目录.
第2步,打包应用,通过以下命令会在当前目录生成应用airdrop.json
,如果你修改了合约或应用参数,需要重新打包应用.
我们可以通过命令行工具 (opens new window) 导入应用,如下所示:
使用import
命令导入应用,-f
参数为指定导入的应用文件。
当然如果你有一个应用,也可以通过以下命令生成完整的目录结构。