API接口描述文档

一、概念

站点提供的API接口均为WEB接口,开发者根据文档描述的规则正确使用接口即可完成相关操作,不需要下载SDK。本站接口信息均在/public.json导航文件中进行公示,此文件对外公开,使用JSON文件格式,开发者加载此文件后进行JSON解码后即可按其指导即可获取接口WEB地址。未经特别说明,接口请求及响应信息均使用JSON格式封装。

下面文档中未说明具体哈希算法时均为sha3-256在前sha256在后组成的小写16进制形式组成的自定义哈希值。为方面说明,将参与系统中运作的服务器分成两类,分别为计算服务器及应用服务器,计算服务器为带有计算任务性质的服务器,其产生主链称为权重链(后文中未特殊说明权重链即指计算服务器主链),权重链哈希有一定特点(如以deedface开头);应用服务器为普通服务器,其主链称为最终链,链哈希无规律,其会向计算服务器提交哈希,并且获取其对应的权重链哈希当作参数生成本站最终链。计算服务器同时具有操作链(区别于权重链),操作链数据也参与权重链生成。文本编码未特殊说明均为UTF8编码;文本中未特殊说明符号所属语言均为英文符号(如逗号未特殊说明均指英文逗号,而非中文逗号,)。

不同的API接口使用URL地址,且系统中API接口的URL地址为方便起见(站点开发语言不同,如PHP、Java、Asp.net等多种多样;开发模式不同如有MVC、传统模式等,URL不方便统一)不做规定,但是必须在站点根目录下存在接口导航文件public.json。为使接口使用方便,请加盟成员(无论计算服务器还是应用服务器)不要在接口路径中包含?、&等特殊字符(仅建议,非要求,若存在可能导致使用接口通信的不规范代码通信出错),建议API的WEB接口尽量不要经常变动(即public.json不要经常变动)。

public.json介绍。服务器public.json格式统一为对象类型的键值对儿,键为接口名,值为接口本站路径(是路径,不要包含协议名、主机名等信息)。未特殊说明可选,均为必选。具体请查看下方。

接口的访问可以是https或http,强力建议使用https(由于证书等问题,某些平台无法使用https可使用http,如Windows系统WinInet系统API使用IE组件,由于证书问题通过https协议访问会出错)。访问的方法视接口不同一般为GET或POST方式(一般要求GET方式的使用POST方式也可访问,但是需要注意如果存在参数即使是POST方式也一定要通过GET方式传递)。接口的响应信息未特殊说明为JSON格式数据,一般为包含success和detail的对象。success为bool类型,结果只可能为true(执行成功)或false(执行失败),一般情况下,执行失败时success成员为false,detail为错误原因,比如某一接口功能为查询主链某一节点条目信息,执行失败success为false,detail为字符串类型”系统繁忙”。执行成功时success为true,detail视接口不同类型及信息不同,比如查询主链某一节点信息成功success为true,detail为一个对象类型数据,描述节点的哈希值、节点序号、节点产生时间等,又如添加连接接口添加连接成功success为true时,detail仅仅为操作成功的无意义提示。要看操作成功请注意success成员。

二、计算服务器API接口

public.json典型格式如:

{

"PathGetAllowedServers":"\/customize\/pages\/GetAllowedServers.php",

"PathRemoteLoginVerify":"\/customize\/pages\/RemoteLoginVerify.php",

"PathSubmitCalcTask":"\/customize\/pages\/SubmitCalcTask.php",

"QueryCalcTask":"\/customize\/pages\/QueryCalcTask.php",

"PathCurrentTaskFromHosts":"\/customize\/pages\/CurrentTaskFromHosts.php",

"PathQueryLastChainHash":"\/customize\/pages\/QueryLastChainHash.php",

"PathReportChainError":"\/customize\/pages\/ReportChainError.php",

"PathGetSingleWeightedChainItem":"\/customize\/pages\/GetSingleWeightedChainItem.php",

"PathGetSingleManualChainItem":"\/customize\/pages\/GetSingleManualChainItem.php",

"PathGetFinalChainErrors":"\/customize\/pages\/GetFinalChainErrors.php",

"PathGetLastWaitingTask":"\/customize\/pages\/GetLastWaitingTask.php",

"PathSubmitLastTask":"\/customize\/pages\/SubmitLastTask.php"

}

上述仅为格式展示使用,加盟成员可根据需要增加自定义API,或不提供非必需的PathGetLastWaitingTask。

1、PathGetAllowedServers键对应的键值指明最近一次扫描后认定允许连接的计算服务器(扫描时同样扫描本服务器,且无特殊处理),如上所示,路径为/customize/pages/GetAllowedServers.php,获取对应的列表。此接口无参数,使用GET方式即可。若操作成功,则本机响应为JSON格式的对象类型success为true,detail为字符串组成的数组类型,每个字符串都是一个主机名(一般为域名)。若操作失败success成员为false且detail为字符串类型错误原因,如”系统繁忙”。以PHP代码为例:

file_get_contents(‘https://test.block.ltd/customize/pages/GetAllowedServers.php’);

操作成功返回示例:{“success”:true:”detail”:[”a.ltd”,“b.ltd”]};

操作失败返回示例:{“success”:true:”detail”:”系统繁忙”}(实际操作时中文可能被\u开始的转义字符等价替换)。

PathRemoteLoginVerify键对应远程验证令牌(信息)信息。本接口需要userid及userpwd两个参数,分别为用户ID及密码的MD5加密值。接口要求POST方式访问,参数在POST数据中给出。PHP代码为例访问本接口:

$postdata = http_build_query([‘userid’=>1,’userpwd’=>’测试加密密码’]);

$options = [

        'http' =>

        [

            'method' => 'POST',

            'header' => 'Content-type:application/x-www-form-urlencoded',

            'content' => $postdata,

            'timeout' => 20 //超时时间,单位秒

        ]

    ];

    $context = stream_context_create($options);

    $response = file_get_contents(‘https://block.ltd/RemoteLoginVerify.php’, false, $context);

成功返回如:{“success”:true:”detail”:”验证一致,验证时间 2020-05-01 00:00:00 (服务器时间),当前余额 10000 分”},其中时间及余额为动态数据,仅为举例使用。;失败返回结果如{“success”:true:”detail”:”系统繁忙”}(实际操作时中文可能被\u开始的转义字符等价替换)。

3、PathSubmitCalcTask键对应提交计算任务接口路径。本接口需要使用POST方式,参数需要userid、userpwd、tasks、servername共4个参数,参数分别指明用户ID、用户密码加密值、JSON格式字符串数组类型的计算任务列表(每个字符串必须是合法的128位小写字母数字组成的字符串)及服务器主机名。此参数和设置登录令牌及设置IP白名单主机有关。PHP代码为例访问本接口: $postdata = http_build_query([‘userid’=>1,’userpwd’=>’测试加密密码’,‘tasks’=>[‘哈希值1’,’哈希值2’],’servername’=>’jilu.block.ltd’]);

$options = [

        'http' =>

        [

            'method' => 'POST',

            'header' => 'Content-type:application/x-www-form-urlencoded',

            'content' => $postdata,

            'timeout' => 20 //超时时间,单位秒

        ]

    ];

$context = stream_context_create($options);

$response = file_get_contents(‘https://block.ltd/SubmitCalcTask.php’, false, $context);

4、   QueryCalcTask指定获取计算任务结果接口路径,此接口一次只能获取一个哈希值结果,要求GET方式访问,需要3个参数,分别是uesrid、userpwd、task,对应的是用户ID、加密的用户密码及要获取哪个哈希值对应的计算结果。$response = file_get_contents(‘https://block.ltd/QueryCalcTask.php?querykey=查询码&task=哈希值1’);,成功返回如:{“error”:0:”detail”:$具体内容};$具体内容是一个对象,其结构如下:

{

“WeightHash3”:”权重SHA3-256哈希值”,

“WeightHash2”:”权重SHA256哈希值”,

“LastChain”:”上一权重链哈希”,

“Hash3Value”:”SHA3-256值”,

“Hash2Value”:”SHA256值”

}

具体值生成过程请查看技术白皮书

失败返回结果如{“error”:1:”message”:”系统繁忙”}(实际操作时中文可能被\u开始的转义字符等价替换)。

  • PathCurrentTaskFromHosts指明当前计算服务器相关的子服务器列表,使用GET方式访问即可,PHP代码如:file_get_contents(‘https://block.ltd/CurrentTaskFromHosts.php”);成功detail字段是一个字符串组成的数组,每个字符串均为一个主机名,失败detail表示失败原因。成功如:{“success”:true:”detail”:[‘a.ltd’,’b.ltd’]}。
  • PathQueryLastChainHash指明获取最新权重链哈希路径,无参数,GET方式访问即可。成功时success为true,detail为128位哈希值或空字符串(链数据为空)。
  • PathReportChainError指明报告链错误路径,POST方式,参数如下:

userid:用户ID

userpwd:用户密码的md5值

servername:上报服务器自身主机名

FinalChainItemId:最终链序号

ShoudHash:上报服务器计算出的哈希

RealHash:被报告服务器存在的哈希

PreviousHash:最终链上一条目哈希

ToServer:被报告服务器哈希

  • PathGetSingleWeightedChainItem指明获取单个权重链条目信息,GET方式,参数:no:获取的链节点序号,0表示最新节点信息,默认为0;nonexist:值必须为next、previous、error中的一个,表示若指定序号不存在则返回下一个、上一个、出错。成功时detail为对象类型成员,成员如下:

WeightHash3:最终链哈希3值

WeightHash2:最终链哈希2值

Hash3Value:哈希3值

Hash2Value:哈希2值

CalcChainHash:来自应用服务器提交的哈希值+验证码计算而出的哈希值

FromServer:来自的应用服务器

CalcTaskId:任务ID即最终链序号

  • PathGetSingleManualChainItem指明获取单个操作链条目信息,GET方式。参数:no:获取的链节点序号,0表示最新节点信息,默认为0;nonexist:值必须为next、previous、error中的一个,表示若指定序号不存在则返回下一个、上一个、出错。成功detail为对象类型成员,成员如下:

TypeShowName:类型

         Description:文本描述

         ItemHash:文本描述哈希值

         ChainHash:操作链哈希值

         CreateTime:产生时间

         ManualChainId:链序号

  • PathGetFinalChainErrors指明获取最终链错误主机列表,GET方式,无参数,成功detail成员为一个数组,数组每个成员是对象类型,对象成员如下:

ToServer:被报错主机

ShoudHash:报错主机计算出的最终链哈希

RealHash:被报错主机实际存在的最终链哈希

LastHash:上一链节点哈希值

ChainItemId:最终链序号

CreateTime:产生时间

ReportedServer:被报错主机名

  • PathGetLastWaitingTask指明获取当前任务,GET方式,无参数,成功时detail为对象类型,成员如下:

CalcChainHash:任务哈希

LastChain:上一哈希值

         MustHash3Prefix:要求的哈希3前缀

         MustHash2Prefix:要求的哈希2前缀

  • PathSubmitLastTask指明提交当前任务,GET方式,参数:

Hash3value:计算出的哈希3值

hash2value:计算出的哈希2值

userid:提交的用户ID(若计算成功可能会给该用户添加奖励)

success指明成功失败,detail为成功或失败原因,字符串类型

一般访问各实际接口时先需要访问导航文件public.json文件,上述示例中为方便说明直接使用一接口名。实际的接口名不同加入的成员主机并不一致,并且同一主机也可能会修改接口路径(如网络升级等原因)。本段以验证用户令牌接口为例,使用PHP代码展示一般访问过程:

<?php

 

try

{

$useridsubmit=1;//用户ID

$userpwd=mdt('123');//用户密码加密

$servername='block.ltd';

//获取导航文件

$t=file_get_contents('https://'.$servername.'/public.json');

    if(!$t)

        throw new Exception('获取导航文件失败', 1);

    //true参数指定了将对象转换成数组,开发者也可活力true当对象处理

    $t =json_decode($t,true);

    if(!$t)

        throw new Exception('JSON解码失败', 1);

    $public_config_server=$t;

 

    //此为数组类型访问方式,若解码成对象类型

    //则写法为$public_config_server->PathRemoteLoginVerify,下周

    if(!isset($public_config_server['PathRemoteLoginVerify']))

        throw new Exception('配置文件错误,未定义远程登录验证网址', 1);

 

    //send_post函数后面有定义

    $t = send_post('https://'.$server_name.$public_config_server['PathRemoteLoginVerify'],['userid'=>$useridsubmit,'userpwd'=>$userpwd]);

    if($t===false)

        throw new Exception('访问远程服务器失败', 1);

    $t =json_decode($t,true);

    if(!$t)

        throw new Exception('JSON解码失败', 1);

    if(!$t['success'])

        throw new Exception('验证失败,'.$t['detail'], 1);

    /*

    **若上面均未抛出异常,即为验证通过

    **此处应该在数据保存用户名、加密后的密码、主机名等数据及其它逻辑操作

    */

}

catch (Exception $e)

{

//变量$err_message记录了异常信息

$err_message=$e->getMessage();

/*自定义处理异常的代码...*/

}

 

/**

 * 发送post请求

 * @param string $url 网址

 * @param array $post_data post键值对

 * @return string

 */

function send_post($url, $post_data)

{

    $postdata = http_build_query($post_data);

    $options = [

        'http' =>

        [

            'method' => 'POST',

            'header' => 'Content-type:application/x-www-form-urlencoded',

            'content' => $postdata,

            'timeout' => 20 //超时时间,单位秒

        ]

    ];

    $context = stream_context_create($options);

    $result = file_get_contents($url, false, $context);

    return $result;

}

 

?>

 

 

三、应用服务器计算接口

public.json一般格式如下

{

"PathAddConnect":"\/customize\/pages\/PathAddConnect.php",

"PathGetFinalChainHash":"\/customize\/pages\/GetFinalChainHash.php",

"PathGetCreditGrade":"\/customize\/pages\/GetCreditGrade.php",

"PathGetSingleFinalChainItem":"\/customize\/pages\/GetSingleFinalChainItem.php",

"PathGetFinalChainErrors":"\/customize\/pages\/GetFinalChainErrors.php"

1、PathAddConnect键对应的键值指明添加连接的接口路径,如上所示,路径为/customize/pages/PathAddConnect.php,即想与本机想连需要访问本机的此路径。访问此路径需要提供GET参数server。若操作成功,则本机响应为JSON格式的对象类型success为true,detail无意义,均为字符串类型数据”操作成功”。若操作失败success成员为false且detail为字符串类型错误原因,如”连接数超过上限”。若开发者的主机为a.ltd,其想加入与本机的连接,配置好协议文件等环境后,访问此接口时指定其主机域名,以PHP代码为例:

file_get_contents(‘https://test.block.ltd/customize/pages/PathAddConnect.php?server=a.ltd’);

操作成功返回示例:{“success”:true:”detail”:”操作成功”}(实际操作时中文可能被\u开始的转义字符等价替换);

操作失败返回示例:{“success”:true:”detail”:”连接数超过上限”}

2、PathGetFinalChainHash键对应最终链条目信息。本接口无参数,PHP代码为例访问本接口: file_get_contents(‘https://test.block.ltd/customize/pages/GetFinalChainHash.php’),成功返回如:{“success”:true:”detail”:”xxxxxxxxxxxx”},其中xxxxxxxxxxxx为128位小写字母+数字组成的哈希值;失败返回结果如{“success”:true:”detail”:”系统繁忙”}(实际操作时中文可能被\u开始的转义字符等价替换)。

3、PathGetCreditGrade键对应最终链条目信息。本接口无参数,PHP代码为例访问本接口: file_get_contents(‘https://test.block.ltd/customize/pages/PathGetCreditGrade.php’),成功返回如:{“success”:true:”detail”:999},其中999则为本站权重值;失败返回结果如{“success”:true:”detail”:”系统还未生成”}(实际操作时中文可能被\u开始的转义字符等价替换)。

4、PathGetSingleFinalChainItem指明获取单个最终链条目信息,GET方式,参数:no:获取的链节点序号,0表示最新节点信息,默认为0;nonexist:值必须为next、previous、error中的一个,表示若指定序号不存在则返回下一个、上一个、出错。成功时detail为对象类型成员,成员如下:

ChainHash:主链哈希值

         ContentText:描述文本

         ContentHash:描述文本哈希

         BlockWeightChainId:最终链序号

         WeightedHash3:最终链哈希3值

         WeightedHash3Value:最终链只哈希3依赖的变量

         WeightedHash2:最终链哈希2值

         WeightedHash3Value:最终链只哈希2依赖的变量

         FinalChainHash:最终链

         NodeHash:节点值

         CalcOutAddtion:计算服务器相连主机哈希值

         CalcInnerAddtion:计算服务器操作链哈希值

         CalcLast:上一条哈希

5、PathGetFinalChainErrors指明获取报错主机信息,成功detail成员为一个数组,数组每个成员是对象类型,对象成员如下:

ToServer:被报错主机

ShoudHash:报错主机计算出的最终链哈希

RealHash:被报错主机实际存在的最终链哈希

LastHash:上一链节点哈希值

ChainItemId:最终链序号

CreateTime:产生时间

ReportedServer:被报错主机名

 

一般访问各实际接口时先需要访问导航文件public.json文件,上述示例中为方便说明直接使用一接口名。实际的接口名不同加入的成员主机并不一致,并且同一主机也可能会修改接口路径(如网络升级等原因)。本段以添加主机接口为例,使用PHP代码展示一般访问过程:

<?php

 

try

{

//获取接口导航文件

$t=file_get_contents('https://test.block.ltd/public.json');

    if(!$t)

        throw new Exception('获取导航文件失败', 0);//若失败抛出异常

 

    //json解码,true参数指定为将对象转换为数组类型

    //这里开发者如习惯对象类型,请省略true参数

    $t =json_decode($t,true);

    if(!$t)

        throw new Exception('JSON解码失败', 0);

    $public_config=$t;//$public_config记录导航文件信息

 

    //正常情况下肯定存在PathAddConnect键,以防万一

    //若JSON转化时为对象格式请使用$public_config->PathAddConnect

    //同理,后面的数组方式访问均按描述转化为对象类型

    if(!isset($public_config['PathAddConnect']))

        throw new Exception('配置文件错误', 0);

    //注意,路径中已经包含了根目录符号/,所以主要名后面不要带有/

    $url = 'https://test.block.ltd'.$public_config['PathAddConnect'];

    //API接口可能多种多样,如有采用MVC架构或本身就带有GET参数(接口ID等)

    //目前本站API接口本身均无GET参数,所以不需要处理?,代码仅为以防万一

    if(strpos($public_config['PathAddConnect'], '?')===false)

        $url.='?';

    $t = explode('?', $url);

    if(count($t)!=2)

        throw new Exception('服务器路径不合法'.$url, 0);

    if(strlen($t[1]))

        $url.='&';

    $url.='server='.urlencode($_SERVER['SERVER_NAME']);

    $t = @file_get_contents($url,false);

    if($t===false)

        throw new Exception('访问远程服务器'.$url.'失败', 0);

 

    //接口返回的响应信息同样为JSON格式

    $t =json_decode($t,true);

    if(!$t)

        throw new Exception('JSON解码失败', 0);

    if(!$t['success'])

        throw new Exception('操作失败,服务器报告:'.$t['detail'], 0);

 

    /*

    **若上面均未抛出异常,即为对方添加本机成功

    **此处应该添加对方添加本机成功后的代码

    **如本机数据库将对方主机添加连接信息等

    */

}

catch (Exception $e)

{

//变量$err_message记录了异常信息

$err_message=$e->getMessage();

/*自定义处理异常的代码...*/

}

 

?>

 

四、总结

API接口均为WEB方式,不必下载SDK开发包。对接接口时选择自己适合的开发语言对接口先进行测试。部分接口使用前需要先到对应的网站上进行充值、设置密码、设置IP白名单等操作,具体参考使用文档。通过API获取的信息,具体使用方式请参考技术白皮书。