终端用户访问 InfoChain

终端用户可以根据InfoChain访问接口,通过一个InfoChain节点网络,查询或修改InfoChain组下的区块链中存储的数据。

假设终端用户是一个网站开发者,想要使用InfoChain作为数据存储,他已经从节点创建者那里知道了一个节点网络名称和相关密码。 然后他需要选择或开发一个合适的消息传输应用程序来连接到InfoChain节点网络。

InfoChain提供了两个消息传输应用程序来连接终端用户和InfoChain节点。

Deliver

终端用户可以从菜单”资源“ > "下载" 下载Deliver程序,并复制到网站服务器或与网站服务器同内网域的其他PC上。Delivers 有两个版本,分别用于 Linux(Ubuntu) 和 Windows 部署。

第一次启动Deliver时,需要配置一些参数:

-n: 要连接的 InfoChain 节点网络的名称

-p: 节点网络密码

-P: Deliver的监听端口,如果不指定,监听端口为4321


例如, ./Deliver -n MyNodeABC -p 12345678

表示该 Deliver 将监听默认端口 4321,连接到名为 MyNodeABC 的节点网络,密码为 12345678。

要在Linux下运行Deliver,用户必须具有管理员权限,并在提到安装n2n应用程序时输入系统密码。 要在 Windows 下运行 Deliver,需要以管理员身份启动命令行处理器。

终端程序的网络管理员需要为Deliver 配置防火墙规则,打开 UDP端口9999,和 TCP 端口 15793,15794和 15799。

CommDeliver

此应用程序适合希望尝试InfoChain功能或难以部署Deliver的用户。 用户无需下载此应用程序并将其部署到他的设备上,只需在请求中输入一些参数即可。 之后的示例将提供更多详细信息。

注意:CommDeliver 是公用的消息转发器,数据将传输到具有公共 URL 的服务器,其他用户也可以访问该服务器。 出于效率和安全考虑,开发者应避免在正式的应用里使用 CommDeliver。

现在开发人员可以编写他的源代码来访问InfoChain。 我们提供了一些 JavaScript 示例来解释如何创建 InfoChain 请求。

例1. 通过CommDeliver来进行记录查询

<head>

<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>:

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/sha256.js"></script>

<script src="https://InfoChain.link/Interface/js/Deliver.js"></script>

</head>

<script>

function CreateUser()

{

var chain=new ChainRequest(“192.168.1.146",”4330”);

//var chain=new ChainRequest();

//chain.SetPhpServerFolder("./php");

var requestItems={};

requestItems[“Func”]=”CreateUser”;

requestItems[“UserName”]=”TestUser2”;

requestItems[“Password”]=”12345678”;

//requestItems[“PassHash”]=”XXXXX”;

chain.Request(requestItems,handleCreateResult,handleCreateFail);

}

function handleCreateResult(result_string)

{

alert(result_string);

}

function handleCreateFail(error_string)

{

alert(error_string);

}

</script>

上面的示例首先创建了一个 CommChainRequest 对象,该对象在 CommDeliver.js 中定义(其余 js 文件是 CommDeliver.js 所需的)。 然后定义一个名为 requestItems的映射结构,通过节点名称为“MyTestNode1”、网络密码为“password”的节点网络查询自身(用户名“TestUser1”、密码“11223344”)信息。密码项将被 CommDeliver.js 转换为 “PassHash”项。 此请求中所有数据项都是必要的。 查询通过一下函数来处理

chain.Request(items, handleQueryResult, handleQueryFail)

在该函数中,第一个参数是必需的,其余参数是可选的。

HandleQueryResult 是查询成功时的回调函数,其格式是

function HandleQueryResult(result_string, reqItems)

此处result_string 是 JSON 格式的查询结果字符串,reqItems 是可选的,是 chain.Request() 调用中 requestItems 的拷贝。

HandleQueryFail 是查询失败时的回调函数,其格式是

function HandleQueryFail(error_string, reqItems)

此处error_string 是错误描述字符串,reqItems 是可选的,是 chain.Request() 调用中 requestItems 的拷贝。

例 2. 通过Deliver转发来创建用户

<head>

<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>:

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/sha256.js"></script>

<script src="https://InfoChain.link/Interface/js/CommDeliver.js"></script>

</head>

<script>

function QueryUser()

{

var chain=new CommChainRequest();

var requestItems={};

requestItems[“Func”]=”QueryUser”;

requestItems[“UserName”]=”TestUser1”;

requestItems[“Password”]=”11223344”;

//requestItems[“PassHash”]=”XXXXX”;

requestItems[“NodeName”]=”MyTestNode1”;

requestItems[“NetPassword”]=”password”;

chain.Request(requestItems,HandleQueryResult,HandleQueryFail);

}

function HandleQueryResult(result_string)

{

alert(result_string);

}

function HandleQueryFail(error_string)

{

alert(error_string);

}

</script>

上面的示例首先创建一个 ChainRequest 对象,该对象在 Deliver.js 中定义。 然后定义一个映射 requestItems,通过部署的 Deliver 应用创建一个用户(用户名“TestUser2”和密码“12345678”)。

调用过程和参数定义与示例1类似,不同之处在于:

I. ChainRequest 构造函数格式为 ChainRequest(DeliverIP, DeliverPort),DeliverIP 和 DeliverPort 为可选参数,表示 Deliver App 的 IP 和端口,如果未定义,则表示 ChainRequest 对象将通过端口 4321 连接到本地主机 Deliver。

II. 如果该网站是https网站,则需要将发送到Deliver的https请求转换为http请求,以避免被浏览器拦截。 开发者可以从菜单 ”资源“>"下载" 中下载辅助 php 文件并将其部署到网站服务器。 默认情况下,ChainRequest 对象假设 ChainRequest.php 与当前网页存储在同一文件夹中,如果没有存储在该文件夹中,则需要调用 SetPhpServerFolder(phpPath) 来指定 php 的存储文件夹。

III. 不再需要在 request 中定义 NodeName 和 NetPassword,因为它们已在 Deliver 中定义。

例 3. 创建记录

<head>

<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>:

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/sha256.js"></script>

<script src="https://InfoChain.link/Interface/js/Deliver.js"></script>

</head>

<script>

function CreateRecord()

{

var chain=new ChainRequest(“192.168.1.146",”4330”);

//var chain=new ChainRequest();

//chain.SetPhpServerFolder("./php");

var requestItems={};

requestItems[“Func”]=”CreateRecord”;

requestItems[“UserName”]=”TestUser2”;

requestItems[“Password”]=”12345678”;

//requestItems[“PassHash”]=”XXXXX”;

requestItems[“RecordType”]=”Private”;

requestItems[“RelatedUser”]=”TestUser1”;

requestItems[“Commodity_Name”]=”BookA”;

requestItems[“Commodity_ID”]=”10458998374”;

requestItems[“Commodity_Price”]=”$30”;

requestItems[“Sell_count”]=”3”;

requestItems[“Sell_time”]=”2023-06-21 13:30:40”;

chain.Request(requestItems,handleCreateResult,handleCreateFail);

}


function handleCreateResult(result_string)

{

alert(result_string);

}


function handleCreateFail(error_string)

{

alert(error_string);

}

</script>

上例的意思是用户TestUser2创建一条私有记录,存储有人在2023-06-21 13:30:40出售了3件商品(名称BookA,ID 10458998374,价格$30)的信息。用户TestUser1与该记录有关,可以修改记录。 在上面的请求中,Func、UserName、Password(或PassHash)和RelatedUser是必填项,其余项由开发人员根据自己的业务逻辑定义和解释。

例 4. 修改记录

<head>

<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>:

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/sha256.js"></script>

<script src="https://InfoChain.link/Interface/js/Deliver.js"></script>

</head>

<script>

function ChangeRecord()

{

var chain=new ChainRequest(“192.168.1.146",”4330”);

//var chain=new ChainRequest();

//chain.SetPhpServerFolder("./php");

var requestItems={};

requestItems[“Func”]=”ChangeRecord”;

requestItems[“UserName”]=”TestUser1”;

requestItems[“Password”]=”11223344”;

requestItems[“ID”]=”RD_20230621133040381”;

//requestItems[“PassHash”]=”XXXXX”;

requestItems[“RecordType”]=”Private”;

requestItems[“RelatedUser”]=”TestUser2,TestUser3”;

requestItems[“Commodity_Name”]=”BookA”;

requestItems[“Commodity_ID”]=”10458998374”;

requestItems[“Commodity_Price”]=”$30”;

requestItems[“Sell_count”]=”3”;

requestItems[“Sell_time”]=”2023-06-21 13:30:40”;

requestItems[“Deliver_address”]=”AA street, no. 4”;

requestItems[“Deliver_time”]=”2023-06-23 15:10:20”;

chain.Request(requestItems,handleCreateResult,handleCreateFail);

}


function handleCreateResult(result_string)

{

alert(result_string);

}

function handleCreateFail(error_string)

{

alert(error_string);

}

</script>

上面的示例意味着TestUser1尝试更改ID为RD_20230621133040381的记录,将记录相关用户从TestUser1更改为TestUser1和TestUser3,并将项目Deliver_address和Deliver_time添加到该记录中。