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参数为指定导入的应用文件。
当然如果你有一个应用,也可以通过以下命令生成完整的目录结构。