在测试分布服务器时,我们在交易中添加了memo,以便确定要归功的客户帐户。 但是,使用POCChain的其他人和组织可能不知道他们需要这样做。 他们怎么知道的?

POCChain federation 协议允许您将人类可读的地址(如amy*your_org.com [1])转换为帐户ID。 它还包括有关交易memo中应包含的内容的信息。 发送付款时,首先联系联合服务器以确定要支付的POCChain帐户ID。 幸运的是,分布服务器为您完成此操作。 Payment flow diagram

Stellar.org提供了一个可以挂钩到现有用户数据库的预构建federation服务器,但您也可以自己编写。

创建数据库

POCChain federation 服务器旨在通过帐户名列表连接到您可能拥有的任何现有SQL数据库。 它实质上将federation请求转换为SQL查询。 服务器支持MySQL,PostgreSQL和SQLite3。

您的数据库至少应该有一个表格,其中的列标识了每个帐户记录使用的名称。[2] 在现有系统中,您可能有一个名为accounts的表,其外观如下所示:

id first_name last_name friendly_id
1 Tunde Adebayo tunde_adebayo
2 Amy Smith amy_smith
3 Jack Brown jack_brown
4 Steintór Jákupsson steintor_jakupsson
5 Sneha Kapoor sneha_kapoor

Tunde的POCChain地址是tunde_adebayo*your_org.com

下载并配置Federation Server

接下来,下载适用于您的平台的最新Federation服务器。 在任何地方安装可执行文件。 在同一目录中,创建名为federation.cfg的文件。 这将存储服务器的配置。 它应该看起来像:

port = 8002

[database]
type = "mysql" # Or "postgres" or "sqlite3"
dsn = "dbuser:dbpassword@/internal_accounts"

[queries]
federation = "SELECT 'GAIGZHHWK3REZQPLQX5DNUN4A32CSEONTU6CMDBO7GDWLPSXZDSYA4BU' as id, friendly_id as memo, 'text' as memo_type FROM accounts WHERE friendly_id = ? AND ? = 'your_org.com'"
reverse-federation = "SELECT friendly_id, '' as domain FROM accounts WHERE ? = ''"

# The federation server must be available via HTTPS. Specify your SSL
# certificate and key here. If the server is behind a proxy or load balancer
# that implements HTTPS, you can omit this section.
[tls]
certificate-file = "server.crt"
private-key-file = "server.key"

确保使用适当的凭据和数据库名称更新数据库连接信息。 还要更新联合查询中的以匹配您的实际域而不是your_org.com

联合查询是一个SQL查询,当提供POCChain地址的两个部分时,应该返回列idmemomemo_type,例如:tunde_adeboyoyour_org.com的地址为tunde_adebayo*your_org.com

由于我们将所有地址映射到我们的基本帐户,因此我们始终返回id的基本帐户ID。 与第一部分一样,我们希望将帐户的friendly_id作为文本备忘录。

反向联合查询是必需的,但由于我们的设计中所有客户帐户都映射到单个POCChain帐户,因此我们需要确保此查询始终不返回任何行。

现在运行服务器! (与分布服务器不同,没有要迁移的自定义数据库。)

./federation

更新 POCC.toml

最后,其他人必须知道Federation服务器的URL。 POCC.toml文件是公开可用的文件,其他人可以找到有关POCChain集成的信息。 它应始终存储在:

https://[YOUR DOMAIN]/.well-known/POCC.toml

它可以列出所有类型的属性,但我们现在关心的是Federation服务器的URL。 您的POCC.toml文件应该类似于:

FEDERATION_SERVER = "https://www.your_org.com:8002/federation"

Federation服务器的实际URL可以是您喜欢的任何内容 - 它可以位于您的www子域,但位于不同的路径上,它可以位于不同的端口,也可以位于不同的域上。 但是,必须通过HTTPS提供有效的SSL证书。[3]

发送Federation请求

通过发送HTTP请求测试您的Federation服务器:

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.http.client.utils.URIBuilder;
import java.net.URI;

class FederationRequest {
  public static void main(String [] args) throws Exception {
    URI federationUri = new URIBuilder("https://www.your_org.com:8002/federation")
      .addParameter("q", "tunde_adebayo*your_org.com")
      .addParameter("type", "name")
      .build();

    HttpGet federationRequest = new HttpGet(federationUri);
    HttpClient httpClient = HttpClients.createDefault();
    HttpResponse response = httpClient.execute(federationRequest);
    HttpEntity entity = response.getEntity();
    if (entity != null) {
      String body =  EntityUtils.toString(entity);
      System.out.println(body);
    }
  }
}

你应该得到一个像:

{
  "stellar_address": "tunde_adebayo*your_org.com",
  "account_id": "GAIGZHHWK3REZQPLQX5DNUN4A32CSEONTU6CMDBO7GDWLPSXZDSYA4BU",
  "memo_type": "text",
  "memo": "tunde_adebayo"
}