Skip to content

Commit

Permalink
Merge pull request #616 from Celia18305/DAPP-integration-update-2
Browse files Browse the repository at this point in the history
DAPP integration update 2
  • Loading branch information
NashMiao committed May 15, 2019
2 parents aa5467e + 569d704 commit 21527aa
Showing 1 changed file with 74 additions and 72 deletions.
146 changes: 74 additions & 72 deletions dev-website-docs/docs-cn/dApp-Integration/06-DAppDocking-Wake-up.md
@@ -1,42 +1,38 @@


## 概述

进行特殊适配的钱包 App 可以支持被手机内其他 App 唤醒,本篇文档将介绍在App内如果通过唤醒钱包 App 实现登录,调用智能合约(包括付款)等功能。
进行特殊适配的钱包 App 可以支持被手机内其他 App 唤醒,本文将介绍在 App 内如何通过唤醒钱包 App 实现登录,调用智能合约(包括付款)等功能。

## 说明
### 基本概念

##### DApp
去中心化应用程序

##### DApp 后台
主要提供以下功能:
- 相应DApp操作,生成相应的登录参数或者调用智能合约的参数。
- DApp 操作,生成相应的登录参数或者调用智能合约的参数。
- 同步链上信息,获取登录或调用智能合约的结果

##### 智能合约
本体智能合约是一个集多功能、轻量级、高可用、可并发、多语言、跨合约、跨虚拟机等于一体的完备体系。

对于DApp而言,智能合约实现了其全部或部分业务逻辑

##### Provider
提供签名,预执行交易,执行交易等与链交互,在当前文档中就指目前支持的两个钱包。
提供签名,预执行交易,执行交易等与链交互。本文档描述针对目前支持的两个钱包:
- ONTO [下载](https://onto.app)
- Cyano [下载](http://101.132.193.149/files/app-debug.apk)

##### demo
我们提供了一个唤醒特定钱包的Demo app 供参考 [唤醒demo](https://github.com/ontio-cyano/android-app-demo)
我们提供了一个唤醒特定钱包的Demo app 供参考[唤醒demo](https://github.com/ontio-cyano/android-app-demo)

## 开发
## 交互流程

DApp开发要实现唤醒功能中的两种流程
DApp 开发要实现唤醒功能中的两种流程
- 登录
- 调用智能合约

登录流程不用过多解释,调用智能合约这个流程可以根据调用不同合约不同方法,实现DApp的各种业务逻辑,以游戏举例,可以实现购买,出售,租赁等不同的业务。
登录流程不用过多解释,调用智能合约这个流程可以根据调用不同合约不同方法,实现 DApp 的各种业务逻辑,以游戏为例,可以实现购买,出售,租赁等不同的业务。

### 登录

登录流程如下图所示
登录流程如下图所示

![wakeup-login](https://raw.githubusercontent.com/ontio/documentation/master/dev-website-docs/assets/integration/wakeupLogin.png)

Expand All @@ -46,7 +42,7 @@ DApp开发要实现唤醒功能中的两种流程:

#### 登录数据

DApp需要登录的时候,就从DApp后台获取登录数据,发送给特定的 Provider
DApp 需要登录的时候,就从 DApp 后台获取登录数据,发送给特定的 Provider

登录数据示例:
```json
Expand All @@ -65,40 +61,41 @@ DApp开发要实现唤醒功能中的两种流程:
}
```

##### 具体实施流程

0. 判断本地是否安装Cyano App,例如:
```
public static boolean checkInstallCynoApp(Context context) {
final PackageManager packageManager = context.getPackageManager();// 获取packagemanager
List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);// 获取所有已安装程序的包信息
if (pinfo != null) {
for (int i = 0; i < pinfo.size(); i++) {
String pn = pinfo.get(i).packageName.toLowerCase(Locale.ENGLISH);
if (pn.equals("com.github.ont.cyanowallet")) {
return true;
}
}
}
return false;
}
```


1. DApp 将 DApp 后台服务构建的登录信息发送给特定的 Provider (钱包),例如:
```
String data = "{\"action\":\"login\",\"id\":\"10ba038e-48da-487b-96e8-8d3b99b6d18a\",\"version\":\"v1.0.0\",\"params\":{\"type\":\"ontid or account\",\"dappName\":\"dapp Name\",\"dappIcon\":\"dapp Icon\",\"message\":\"helloworld\",\"expire\":1546415363,\"callback\":\"http://127.0.0.1:80/login/callback\"}}"; //此处就是将之前的登录数据拼接后的状态。
String sendData = Base64.encodeToString(Uri.encode(data).getBytes(), Base64.NO_WRAP);
Intent intent = new Intent("android.intent.action.VIEW");
intent.setData(Uri.parse("ontprovider://ont.io?param=" + sendData ));
intent.addCategory("android.intent.category.DEFAULT");
startActivity(intent);
```

2. Provider 对登录信息进行签名,将相关的数据传输到之前登录信息中设定好的回传地址,此步操作不需要DApp开发者执行

3. DApp 后台验证签名,通过后通知 DApp 登录成功。
#### 具体实施流程

1. 判断本地是否安装Cyano App,例如:

```
public static boolean checkInstallCynoApp(Context context) {
final PackageManager packageManager = context.getPackageManager();// 获取packagemanager
List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);// 获取所有已安装程序的包信息
if (pinfo != null) {
for (int i = 0; i < pinfo.size(); i++) {
String pn = pinfo.get(i).packageName.toLowerCase(Locale.ENGLISH);
if (pn.equals("com.github.ont.cyanowallet")) {
return true;
}
}
}
return false;
}
```

2. DApp 将 DApp 后台服务构建的登录信息发送给特定的 Provider (钱包),例如:

```
String data = "{\"action\":\"login\",\"id\":\"10ba038e-48da-487b-96e8-8d3b99b6d18a\",\"version\":\"v1.0.0\",\"params\":{\"type\":\"ontid or account\",\"dappName\":\"dapp Name\",\"dappIcon\":\"dapp Icon\",\"message\":\"helloworld\",\"expire\":1546415363,\"callback\":\"http://127.0.0.1:80/login/callback\"}}"; //此处就是将之前的登录数据拼接后的状态。
String sendData = Base64.encodeToString(Uri.encode(data).getBytes(), Base64.NO_WRAP);
Intent intent = new Intent("android.intent.action.VIEW");
intent.setData(Uri.parse("ontprovider://ont.io?param=" + sendData ));
intent.addCategory("android.intent.category.DEFAULT");
startActivity(intent);
```

3. Provider 对登录信息进行签名,将相关的数据传输到之前登录信息中设定好的回传地址,此步操作不需要DApp 开发者执行。

4. DApp 后台验证签名,通过后通知 DApp 登录成功。

签名验证方法:
* [java sdk验签](https://github.com/ontio/ontology-java-sdk/blob/master/docs/cn/interface.md#%E7%AD%BE%E5%90%8D%E9%AA%8C%E7%AD%BE)
Expand All @@ -107,19 +104,19 @@ DApp开发要实现唤醒功能中的两种流程:

### 调用合约

调用合约流程如下图所示
调用合约流程如下图所示

![wakeup-login](https://raw.githubusercontent.com/ontio/documentation/master/dev-website-docs/assets/integration/wakeupInvoke.png)

1. 构建调用合约数据给特定 Provider
2. Provider 签名,预执行,最终发送到链上(本步骤无需DApp开发
3. Provider 将交易 hash 发给DApp 后台
4. DApp 后台 从链上查询合约执行结果
2. Provider 签名,预执行,并最终发送到链上(本步骤无需 DApp 开发
3. Provider 将交易 hash 发给 DApp 后台
4. DApp 后台从链上查询合约执行结果
5. DApp 后台将结果反馈给 DApp,呈献给用户

#### 调用合约数据

调用合约数据示例
调用合约数据示例
```
{
"action": "invoke",
Expand All @@ -133,27 +130,32 @@ DApp开发要实现唤醒功能中的两种流程:
}
}
```
##### 具体实施流程
#### 具体实施流程

0. 检查是否安装特定 Provider ,参考[登录](#登录)
1. DApp 后台将交易内容放在qrcodeUrl链接中,具体操作请参考[Cyano二维码](https://github.com/ontio-cyano/CEPs/blob/master/CEPS/CEP1.mediawiki#Invoke_a_Smart_Contract-2)
1. 检查是否安装特定 Provider ,参考 [登录](#登录)

拼接传递内容,启动交易,例如:
2. DApp 后台将交易内容放在 qrcodeUrl 链接中,具体操作请参考 [Cyano二维码](https://github.com/ontio-cyano/CEPs/blob/master/CEPS/CEP1.mediawiki#Invoke_a_Smart_Contract-2)

```
String data="{\"action\":\"invoke\",\"version\":\"v1.0.0\",\"id\":\"10ba038e-48da-487b-96e8-8d3b99b6d18a\",\"params\":{\"login\":true,\"qrcodeUrl\":\"http://101.132.193.149:4027/qrcode/AUr5QUfeBADq6BMY6Tp5yuMsUNGpsD7nLZ\",\"message\":\"will pay 1 ONT in this transaction\",\"callback\":\"http://101.132.193.149:4027/invoke/callback\"}}";
拼接传递内容,启动交易,例如:

```
String data="{\"action\":\"invoke\",\"version\":\"v1.0.0\",\"id\":\"10ba038e-48da-487b-96e8-8d3b99b6d18a\",\"params\":{\"login\":true,\"qrcodeUrl\":\"http://101.132.193.149:4027/qrcode/AUr5QUfeBADq6BMY6Tp5yuMsUNGpsD7nLZ\",\"message\":\"will pay 1 ONT in this transaction\",\"callback\":\"http://101.132.193.149:4027/invoke/callback\"}}";
String sendData = Base64.encodeToString(Uri.encode(data).getBytes(), Base64.NO_WRAP);
Intent intent = new Intent("android.intent.action.VIEW");
intent.setData(Uri.parse("ontprovider://ont.io?param=" + sendData ));
intent.addCategory("android.intent.category.DEFAULT");
startActivity(intent);
```

String sendData = Base64.encodeToString(Uri.encode(data).getBytes(), Base64.NO_WRAP);
Intent intent = new Intent("android.intent.action.VIEW");
intent.setData(Uri.parse("ontprovider://ont.io?param=" + sendData ));
intent.addCategory("android.intent.category.DEFAULT");
startActivity(intent);
```
3. Provider 签名,预执行,最终发送到链上(本步骤无需 DApp 开发)

4. Provider 将交易 hash 发给DApp 后台(本步骤视 DApp 具体情况实现)。

5. DApp 后台从链上查询合约执行结果:

- [java sdk 交易事件查询方法](https://github.com/ontio/ontology-java-sdk/blob/master/docs/cn/basic.md#%E4%B8%8E%E9%93%BE%E4%BA%A4%E4%BA%92%E6%8E%A5%E5%8F%A3)
- [ts sdk 交易事件查询方法](https://github.com/ontio/ontology-ts-sdk/blob/master/test/websocket.test.ts)

2. Provider 签名,预执行,最终发送到链上(本步骤无需DApp开发)
3. Provider 将交易 hash 发给DApp 后台,本步根据DApp具体情况实现
4. DApp 后台 从链上查询合约执行结果
- [java sdk 交易事件查询方法](https://github.com/ontio/ontology-java-sdk/blob/master/docs/cn/basic.md#%E4%B8%8E%E9%93%BE%E4%BA%A4%E4%BA%92%E6%8E%A5%E5%8F%A3)
- [ts sdk 交易事件查询方法](https://github.com/ontio/ontology-ts-sdk/blob/master/test/websocket.test.ts)
5. DApp 后台将结果反馈给 DApp,呈献给用户,本步根据DApp具体情况实现
6. DApp 后台将结果反馈给 DApp,呈献给用户(本步视 DApp 具体情况实现)。

0 comments on commit 21527aa

Please sign in to comment.