English / 中文
开发者快速指南
Version 1.0.0
本体是新一代高性能公有式区块链,在主网上线之后,已经有非常多的开发者加入了本体技术社区。文档是开发者加入本体生态的入口,完善的文档体系能大大提高 开发者的开发效率,通过文档,开发者们将对本体生态、本体技术有清晰的认识。本篇文档是本体文档中心的概览,将会大致介绍文档中心的各个组成本分,这将为 开发者提供一个快速熟悉本体技术、本体生态的方法。
本体
什么是本体?
本体的特性在这里有大致的介绍。
如何获取本体?
目前本体的所有源码均在GitHub上开源,用户可以自行前往代码库中下载源码编译安装,你也可以通过命令 curl https://dev.ont.io/ontology_install | sh
获取最新的ontology版本。或者直接获取不同版本号的
release版本。具体的获取、安装方法可以参考这里。
本体节点介绍
获取了本体之后,可以在本地启动本体程序,连接到本体网络。但是在这之前,需要先了解一下目前本体网络中的节点类型,
本体的网络节点目前分为两类:共识节点与同步节点。
共识节点参与共识,打包交易并产生区块;
同步节点同步最新的区块信息,不参与共识。
同步节点
同步节点可以连接到主网,也可以连接到本体的公共测试网。连接到不同的网络时,节点将会同步不同的信息,并且将在当前目录下 建立两个文件夹:Chain和Log。Chain中将存放同步下来的区块数据,包括所有的交易数据,账户数据等;Log将存放同步数据时产生的Log信息。
共识节点
共识节点与同步节点类似,可以运行在主网、测试网中。运行过程中,也将生成Chain和Log文件夹。不同的是,共识节点自己会打包交易信息产生区块,这一点是 同步节点所不能做的。
本体的共识机制
了解完本体网络节点类型之后,将介绍本体网络的共识机制。本体已支持DBFT与VBFT共识,目前主网与测试网均使用VBFT共识, 这里有VBFT共识网络的介绍,更详细的信息请参照本体的源码库。
连接到本体网络
现在,可以试着连接到本体网络了。这里详细介绍了如何连接到本体网络以及如何启动ontology的测试模式。
本体的特殊功能
本体DID
Ontology DID(简称:ONT ID)基于W3C的DID规范,是一个去中心化的身份标识协议。具体的介绍可参看这篇文档。
分布式数据交易
针对目前中心化数据交易所的痛点如:数据缓存、隐私数据未经用户授权、数据版权无法保护等问题,本体提出分布式数据管理协议ONT DATA,并基于此协议推出去中心化数 据交易框架DDXF。更详细的内容可以参考这篇文档。
如何与本体交互
本体命令行工具
在搭建本体网络,并启动的时候,你可能使用很多命令行参数。这些参数在这里有详细的说
明。这些命令行参数也是通过ontology可执行程序来执行,统称为ontology CLI工具。CLI可以执行、调用本体网络的大部分功能,是本体网络的第一个入口。除了文档之
外,还能通过执行./ontology --help
获取命令行参数的简略信息。
本体签名机
为了适应更多的需求,本体提供了一种叫做签名机的服务。该服务使用指定的钱包,对发送到该服务的交易进行签名。详情可以参考这篇文档。
本体的API
在命令行之外,本体提供了一套更方便的区块链交互接口。这些接口以API的形式提供,目前本体的API包含三类:本体RPC API, 本体Restful API,本体Websocket API。 通过使用API,开发者可以十分便捷的向本体网络发送交易、查询数据。
本体的SDK
对于开发者而言,SDK是直接在程序中调用工具。目前,本体提供了三套SDK供开发者使用,分别是Java SDK, Typescript SDK与Golang SDK。在使用SDK之前, 建议先阅读SDK的总体说明和本体的钱包文件规范。
本体智能合约
智能合约是当前区块链最重要的功能,本体也有自己的智能合约体系,详情请参考这里。
本体智能合约IDE——Smartx
Smartx是本体推出的一站式智能合约编写工具,集成了编写、编译、部署与调试等功能,极大地提升了智能合约的开发效率。Smartx的使用方法请参考这篇文档。
如何编写智能合约
这里以Hello World为例给出了一个简单的智能合约的例子。在编写智能合约的过程中, 会用到许多智能合约API,这些API在这里给出。
合约的部署与调用
虽然smartx提供了一键式部署调用方法,但是仍有其他方法可以实现合约的部署和调用。部署方法可以参考这篇文档, 调用方法可以参考这篇文档。
智能合约的权限管理
当前,智能合约的函数可以被任何人调用,这显然不符合现实要求。基于角色的权限管理的基本思想是,每个角色可以调用部分函数,每个实体可以被赋予多种角色(实体是由其ONT ID 来标识)。这篇文档详细介绍了本体智能合约的权限管理方式。
使用本体
在对本体有了充分了解之后,这里将使用一个简单的例子来描述如何在本体网络上进行开发。
环境部署
-
按照连接到本体网络所述,建议使用单机环境下的测试模式。当然,你也可以选择连接到本体的公共测试网络Polaris。 接下来的步骤将以单机环境下的测试模式为例进行。
-
使用命令
./ontology --rest --ws --localrpc --gaslimit 20000 --gasprice 0 --testmode --networkid 3
启动测试网络,输入对应的钱包里的账户的密码。 -
使用rest接口查询初始账户(solo模式下的记账人)的余额。
-
在浏览器中输入
http://localhost:20334/api/v1/balance/APrkensMwPiaqg5rfz54Qa62hDWwtFAnkh
。其中localhost
是节点的ip,20334
是默认的rest端口,这个端口也可以自己指定,命令为--rest --restport 20339
;api/v1/balance/
为rest接口的url 路径,后接的APrkensMwPiaqg5rfz54Qa62hDWwtFAnkh
为初始记账人的地址。这整个URL构成了余额查询的rest接口调用方式。 -
浏览器返回响应
{"Action":"getbalance","Desc":"SUCCESS","Error":0,"Result":{"ont":"1000000000","ong":"0"},"Version":"1.0.0"}
,这是一段json格式的响应字符串,可以看到该账户的ont 数量为十亿,ong数量为0。
-
-
在本体网络中,几乎所有的操作都需要消耗gas,即ong,在本例中,启动时使用了
--gasprice 0
参数将gas消耗置位0,所以后续的操作不消耗gas,但仍可以支付gas。这一步将演示如何给账户提取ong。-
ong是ont的伴生燃料,随ONT逐步释放,但是需要手动提取到自己的账户里;
-
使用
./ontology asset unboundong 1
查询默认钱包里第一个账户可提取的ONG数量,可以使用./ontology asset --help
了解命令的详细信息;Unbound ONG: Account:APrkensMwPiaqg5rfz54Qa62hDWwtFAnkh ONG:0
-
此时可提取的ong数量为零,是因为此账户还未激活ONG的释放,可以使用转账方式来激活;
-
使用
./ontology account add -d
创建另一个ontology账户,地址为AGrJQhb7bZsy57MoQk6YDt3hDP7zRioHia
,使用./ontology account list
查询默认钱包的账户情况;Index:1 Address:APrkensMwPiaqg5rfz54Qa62hDWwtFAnkh Label: (default) Index:2 Address:AGrJQhb7bZsy57MoQk6YDt3hDP7zRioHia Label:
-
使用
./ontology asset transfer --from 1 --to 2 --amount 100000000
命令,从账户1向账户2转入一亿个ont,输入账户1的密码后,转入成功;Transfer ONT From:APrkensMwPiaqg5rfz54Qa62hDWwtFAnkh To:AGrJQhb7bZsy57MoQk6YDt3hDP7zRioHia Amount:100000000 TxHash:73a3d24b7dfd0d96b23f93fd38afe4638b70f921c278202443d0dd29a036236f Tip: Using './ontology info status 73a3d24b7dfd0d96b23f93fd38afe4638b70f921c278202443d0dd29a036236f' to query transaction status
-
查询账户1和账户2的余额,这次使用命令行的方式查询,命令为
./ontology asset balance 1
和./ontology asset balance 2
:BalanceOf:APrkensMwPiaqg5rfz54Qa62hDWwtFAnkh ONT:900000000 ONG:0 BalanceOf:AGrJQhb7bZsy57MoQk6YDt3hDP7zRioHia ONT:100000000 ONG:0
-
再次使用
./ontology asset unboundong 1
查询账户1可提取的ong数量,可以发现可提取的数量大于0(实际执行过程中,这个数额受区块高度和转出的数额影响):Unbound ONG: Account:APrkensMwPiaqg5rfz54Qa62hDWwtFAnkh ONG:5242930
-
使用
./ontology asset withdrawong 1
命令,输入账户1的密码后提取账户1的ong:Withdraw ONG: Account:APrkensMwPiaqg5rfz54Qa62hDWwtFAnkh Amount:5242930 TxHash:6e10592e52cb7a3645eecd987c0161a8811f25ed5e183614d0e9cd9c58ab8a33 Tip: Using './ontology info status 6e10592e52cb7a3645eecd987c0161a8811f25ed5e183614d0e9cd9c58ab8a33' to query transaction status
-
使用命令行方式查询账户1的余额,可以看到,该账户里已经有ong了:
BalanceOf:APrkensMwPiaqg5rfz54Qa62hDWwtFAnkh ONT:900000000 ONG:5242930
-
合约编写、部署与调用
-
打开smartx,按照HelloWorld示例编写一个Hello World智能合约,为方便调用,我们将合约代码改成如下形式,然后编译成AVM字节码, 将AVM字节码下载下来,命名为
hello.avm
:using Neo.SmartContract.Framework.Services.Neo; using Neo.SmartContract.Framework; using System; using System.ComponentModel; namespace Neo.SmartContract { public class HelloWorld : Framework.SmartContract { public static object Main(string operation, params object[] args) { switch (operation) { case "Hello": Hello((string)args[0]); return true; default: return false; } } public static void Hello(string msg) { Runtime.Notify(msg); } } }
说明:Hello方法中,Runtime.Notify将传入的参数在链上做一个通知。
-
使用命令
./ontology contract deploy --code hello.avm --name 'Hello' --version '1.0' --author 'ester' --email 'tester@test.com' --desc 'helloworld' --account 1 --gaslimit 100000000
将 合约部署到网络上,部署合约命令的详细信息可以使用./ontology contract deploy -h
获取;Deploy contract: Contract Address:362cb5608b3eca61d4846591ebb49688900fedd0 TxHash:c49865b16009177ed4b06add97f7be1b0b1c246e4d4575c367e918da294d3287 Tip: Using './ontology info status c49865b16009177ed4b06add97f7be1b0b1c246e4d4575c367e918da294d3287' to query transaction status
-
在浏览器中输入
http://localhost:20334/api/v1/contract/362cb5608b3eca61d4846591ebb49688900fedd0
,调用rest接口查询合约信息:{"Action":"getcontract","Desc":"SUCCESS","Error":0,"Result":{"Code":"54c56b6c7...","NeedStorage":false,"Name":"Hello","CodeVersion":"1.0","Author":"ester","Email": "tester@test.com","Description":"helloworld"},"Version":"1.0.0"}
-
使用命令
./ontology contract invoke --address 362cb5608b3eca61d4846591ebb49688900fedd0 --params string:Hello,[string:tester] --gaslimit 200000
调用部署的合约:Invoke:d0ed0f908896b4eb916584d461ca3e8b60b52c36 Params:["Hello",["tester"]] Password: TxHash:2cc94de8c26fce3be233bef007ec3492043ffc304b79a02d9b612df96e950186 Tip: Using './ontology info status 2cc94de8c26fce3be233bef007ec3492043ffc304b79a02d9b612df96e950186' to query transaction status
说明:
--params string:Hello,[string:tester]
指定调用合约传入的参数,这里传入了两个参数,分别是string:Hello
和[string:tester]
,这些参数即是传入到合约代码中Main函数执行的参数。 -
根据提示使用命令
./ontology info status 2cc94de8c26fce3be233bef007ec3492043ffc304b79a02d9b612df96e950186
查询交易情况:Transaction states: { "TxHash": "2cc94de8c26fce3be233bef007ec3492043ffc304b79a02d9b612df96e950186", "State": 1, "GasConsumed": 0, "Notify": [ { "ContractAddress": "362cb5608b3eca61d4846591ebb49688900fedd0", "States": [ "746573746572" ] } ] }
-
返回的结果中,States即为调用合约通知的msg信息,返回的是一个十六进制字符串,使用编码转换器转化后,得到的结果正是
tester
,即我们在第四步中传入的第二个参数。
DAPP开发指南
这个教程将会告诉你如何开发第一个DAPP。教程