Skip to content

Tarifas de patrocínio para um espaço privado de dados

O patrocínio de taxas permite que os usuários enviem transações no espaço de dados privado sem manter XOR. O usuário ainda assina a transação. Os metadados da transação apontam para uma conta do patrocinador, e o runtime débite o saldo do patrocinado XOR pela taxa da rede.

A integração compõe-se de três partes móveis:

  1. O nó permite o patrocínio de taxas
  2. a conta do patrocinador existe e possui XOR
  3. Cada utilizador tem CanUseFeeSponsor para esse patrocinador.

Depois disso, cada transação de usuário patrocinado só precisa dos metadados:

json
{
  "fee_sponsor": "<SPONSOR_ACCOUNT_I105>"
}

Esta página mostra dois padrões comuns:

  • O usuário livre escreve: o patrocinador paga XOR e o usuário não paga nada.
  • Taxas de tokens locais: o utilizador paga ao patrocinador em token de aplicativo e o patrocinador paga à rede em XOR.

Usar Taira ou uma rede de teste privada primeiro. Um novo espaço de dados privado é um operador e mudança de governança; não é criado por configuração do cliente.

Valores de exemplo

Os comandos a seguir utilizam estes posicionadores:

bash
export DATASPACE="team"
export USER="<USER_ACCOUNT_I105>"
export SPONSOR="<SPONSOR_ACCOUNT_I105>"
export TREASURY="<TREASURY_ACCOUNT_I105>"
export XOR_ASSET="xor#universal"
export BILLING_DOMAIN="billing.team"
export LOCAL_FEE_ASSET="usage#billing.team"
export LOCAL_FEE_ASSET_ID="<LOCAL_FEE_ASSET_DEFINITION_BASE58>"
export USER_ALIAS="alice@team"
export PHONE_POLICY="phone#team"
export EMAIL_POLICY="email#team"
export POLICY_OWNER="<IDENTIFIER_POLICY_OWNER_ACCOUNT_I105>"

Use a conta canônica I105 IDs, a menos que a sua implantação tenha pseudónimos de conta ativa para as mesmas contas.

1. Preparar o espaço de dados

Comece com o catálogo do espaço de dados privado e o trabalho de roteamento descrito em Conect to SORA Nexus Dataspaces. Um fragmento orientado para o operador parece assim:

toml
[[nexus.lane_catalog]]
index = 5
alias = "team-private"
description = "Private team lane"
dataspace = "team"
visibility = "private"
metadata = {}

[[nexus.dataspace_catalog]]
alias = "team"
id = 42
description = "Private team dataspace"
fault_tolerance = 1

[[nexus.routing_policy.rules]]
lane = 5
dataspace = "team"
[nexus.routing_policy.rules.matcher]
account_prefix = "team."
description = "Route team domains to the private dataspace"

Antes de passar para as transacções do utilizador, verifique se:

  • A faixa privada aparece na resposta do nó /status
  • As contas de usuários são admitidas pelo seu fluxo privado de onboarding
  • existe a conta do patrocinador
  • O activo de taxa XOR e a conta de depósito de taxas são válidos na rede.

2. Registrar ativos no espaço de dados

Registre as definições de ativos que os usuários manterão dentro do espaço de dados privado antes de enviá-las para a lógica da aplicação. Para o padrão de taxa local, o tutorial usa usage#billing.team:

text
<asset-name>#<domain>.<dataspace>
usage#billing.team

Primeiro configure o domínio e SNS arrendamento que possuem o espaço de nomes do ativo. Crie uma intenção livre de segredos AliasSetupPlanRequestV1 para $BILLING_DOMAIN, incluindo o espaço de dados team numérico ID, proprietário canônico, prazo de arrendamento e guardador de citações atuais:

bash
iroha --config ./operator.client.toml \
  app alias setup plan \
  --intent-file ./billing-domain.intent.json \
  --plan-file ./billing-domain.plan.json

iroha --config ./operator.client.toml \
  app alias setup apply --plan-file ./billing-domain.plan.json

O --id canônico é a definição de ativo de nível de rede ID. O alias é o que os desenvolvedores e os usuários finais devem usar no código do espaço de dados:

bash
iroha --config ./operator.client.toml \
  ledger asset definition register \
  --id "$LOCAL_FEE_ASSET_ID" \
  --name usage \
  --alias "$LOCAL_FEE_ASSET" \
  --scale 0

A moeda ou transferir o token local para um usuário durante a onboarding:

bash
iroha --config ./operator.client.toml \
  ledger asset mint \
  --definition-alias "$LOCAL_FEE_ASSET" \
  --account "$USER" \
  --quantity 100

Verificar o saldo do utilizador:

bash
iroha --config ./operator.client.toml \
  ledger asset get \
  --definition-alias "$LOCAL_FEE_ASSET" \
  --account "$USER"

Use o mesmo padrão para ativos de aplicativos no espaço de dados. Registre uma definição de ativo por token, dê a cada um um um alias de espaço de dados e faça referência ao alias do código SDK em vez da definição canônica de ativo IDs com codificação dura.

3. Registrar os pseudónimos de utilizador

As contas ainda são canônicas I105 conta IDs. Os nomes de usuários são pseudónimos de conta, e os pseudônimos devem ser manuais não sensíveis como alice@team ou alice@members.team. Não use números de telefone ou endereços de e-mail como pseudônimos.

A configuração do alias usa o mesmo planejador declarativo que a configuração de domínio. Faça com que o SDK ou serviço de onboarding criem uma intenção livre de segredos AliasSetupPlanRequestV1 cujas metas de entrada do alias da conta $USER, selecione o papel primário, pinhe o espaço de dados numérico ID e carregue o guardador atual de citações de arrendamento. Então planeie e aplique-a como uma transação atômica:

bash
iroha --config ./operator.client.toml \
  app alias setup plan \
  --intent-file ./user-alias.intent.json \
  --plan-file ./user-alias.plan.json

iroha --config ./operator.client.toml \
  app alias setup apply --plan-file ./user-alias.plan.json

Se o utilizador não pagar XOR, utilize o serviço de embarque aprovado e consciente do patrocinador para construir e enviar a instalação Transacção. Não dividir a aquisição de arrendamento e os alias vinculativos em operações de aplicação independentes.

Após a ligação do alias, verifique-o com o CLI:

bash
iroha --config ./operator.client.toml \
  app alias resolve --alias "$USER_ALIAS"

iroha --config ./operator.client.toml \
  app alias by-account \
  --account-id "$USER" \
  --dataspace "$DATASPACE"

Para a criação de uma nova conta, prefira um serviço de onboarding que construa NewAccount com um estável uaid e, se necessário, um inicial label. O comando simples ledger account register --id apenas registra a conta canônica ID.

4. Registar telefone e e-mail em privado com FHE

Use números de telefone e endereços de e-mail como reivindicações de identificadores privados, não pseudônimos públicos. O fluxo apoiado por FHE mantém os identificadores brutos fora dos pseudônimos da conta, dos metadados das transações e do estado mundial:

  1. O operador registra uma política de programa RAM-LFE/FHE para telefone e correio electrónico
  2. O operador registra políticas de identificação ativa, tais como phone#team e email#team
  3. A carteira normaliza o telefone ou e-mail localmente
  4. A carteira envia o valor criptografado para o resolutor
  5. O resolvedor retorna um IdentifierResolutionReceipt
  6. O utilizador apresenta ClaimIdentifier juntamente com o recibo.
  7. A cadeia armazena um hash opaco de identificação e recibo, não o valor do telefone bruto ou do email

A configuração da política do operador é uma tarefa de SDK ou serviço. Construir e apresentar os seguintes pares de instruções para cada tipo de identificador:

text
RegisterRamLfeProgramPolicy(
  program_id = "phone_team",
  owner = "$POLICY_OWNER",
  backend = "bfv-programmed-sha3-256-v1",
  verification_mode = "signed",
  commitment = "<HIDDEN_PROGRAM_POLICY_COMMITMENT>",
  resolver_public_key = "<RESOLVER_PUBLIC_KEY>"
)
ActivateRamLfeProgramPolicy(program_id = "phone_team")

RegisterIdentifierPolicy(
  id = "$PHONE_POLICY",
  owner = "$POLICY_OWNER",
  normalization = "PhoneE164",
  program_id = "phone_team",
  note = "Private phone registration for team dataspace"
)
ActivateIdentifierPolicy(policy_id = "$PHONE_POLICY")

Repita para o e-mail com:

text
program_id = "email_team"
policy_id = "$EMAIL_POLICY"
normalization = "EmailAddress"

Durante o onboarding, a carteira ou backend devem normalizar-se localmente:

text
PhoneE164: "+15551234567"
EmailAddress: "alice@example.com"

Após o arquivo de metadados do patrocinador ser criado na etapa 8, apresentar uma instrução de reivindicação assinada pelo usuário com esses metadados:

text
ClaimIdentifier(
  account = "$USER",
  receipt = IdentifierResolutionReceipt {
    payload: {
      policy_id: "$PHONE_POLICY",
      opaque_id: "<OPAQUE_ACCOUNT_ID>",
      uaid: "<USER_UAID>",
      account_id: "$USER",
      ...
    },
    attestation: "<RESOLVER_SIGNATURE_OR_PROOF>"
  }
)

A corrente CLI não expõe comandos digitalizados para estas instruções de identidade. Gerar valores serializados InstructionBox com a SDK e enviá-los através da ledger transaction stdin:

bash
printf '["<BASE64_CLAIM_IDENTIFIER_INSTRUCTION_BOX>"]\n' |
  iroha --config ./alice.client.toml \
    --metadata ./sponsored-fee.json \
    ledger transaction stdin

Mantenha estes barris no serviço de embarque:

  • Os pseudónimos das contas são apenas manuais legíveis por humanos.
  • valores de telefone bruto e email nunca aparecem em alias, metadados, registros ou cargas úteis de transações
  • A conta tem um uaid antes de reclamar identificadores privados.
  • Receitas vinculadas policy_id, opaque_id, uaid e account_id e expiração
  • as chaves de resolução e os compromissos ocultos dos programas são controlados pela governança

5. Habilitar o patrocínio no nó

O patrocínio por taxa é uma política de ponto/tempo de execução. Nexus Configuração de taxas:

toml
[nexus.fees]
fee_asset_id = "xor#universal"
fee_sink_account_id = "<FEE_SINK_ACCOUNT_I105_OR_ALIAS>"
base_fee = "0"
per_byte_fee = "0"
per_instruction_fee = "0.001"
per_gas_unit_fee = "0.00005"
sponsorship_enabled = true
sponsor_max_fee = "0"

fee_asset_id é o ativo da taxa de rede. Para SORA Nexus este é XOR. Use o alias ativo XOR ou a definição canônica de ativo XOR ID exposta pela sua rede.

sponsor_max_fee = "0" significa que não há limite de patrocinador por transacção. Para produção, defina um limite não zero depois de conhecer o tamanho normal e o perfil de gás das suas transações do espaço de dados.

Reinicie ou rode esta configuração através do seu processo normal de operador.

6. Criar e financiar o patrocinador

Gerar um par de chaves do patrocinador, se necessário:

bash
kagami keys --algorithm ed25519 --json

Converte a chave pública no formato da conta para a sua rede:

bash
iroha tools address convert \
  --network-prefix <CHAIN_DISCRIMINANT> \
  <SPONSOR_ED25519_PUBLIC_KEY_HEX>

Registre a conta do patrocinador através do seu fluxo privado de onboarding:

bash
iroha --config ./operator.client.toml \
  ledger account register --id "$SPONSOR"

Financiar o patrocinador com XOR a partir de uma conta do tesouro, da conta de crédito ou de outra conta financiada:

bash
iroha --config ./treasury.client.toml \
  ledger asset transfer \
  --definition-alias "$XOR_ASSET" \
  --account "$TREASURY" \
  --to "$SPONSOR" \
  --quantity 1000

Para os ensaios Taira, salve o auxiliar da torneira a partir de Obter Testnet XOR em Taira como taira_faucet_claim.py, e então financiar o patrocinador com a torneira pública em vez de uma transferência do tesouro:

bash
export SPONSOR='<SPONSOR_TAIRA_I105_ACCOUNT_ID>'
export XOR_ASSET=6TEAJqbb8oEPmLncoNiMRbLEK6tw

python3 taira_faucet_claim.py "$SPONSOR"

iroha --config ./sponsor.client.toml \
  ledger asset get \
  --definition "$XOR_ASSET" \
  --account "$SPONSOR"

Verificar o saldo do patrocinador XOR:

bash
iroha --config ./operator.client.toml \
  ledger asset get \
  --definition-alias "$XOR_ASSET" \
  --account "$SPONSOR"

7. Dar acesso a um usuário ao patrocinador

O patrocinador deve conceder a cada utilizador permissão para cobrar taxas, o que impede os utilizadores de nomear contas arbitrárias do patrocinador.

Executa isto como a conta do patrocinador, ou como uma conta operacional permitida pela sua política de tempo de execução:

bash
printf '{
  "name": "CanUseFeeSponsor",
  "payload": {
    "sponsor": "%s"
  }
}\n' "$SPONSOR" |
  iroha --config ./sponsor.client.toml \
    ledger account permission grant --id "$USER"

Para os serviços de embarque, faça disso um passo normal de fornecimento da conta e registar:

  • Conta de utilizador
  • Conta do patrocinador
  • Espaço de dados ou aplicação
  • bilhete de aprovação ou decisão de governança

Para inspecionar os subsídios de um utilizador:

bash
iroha --config ./operator.client.toml \
  ledger account permission list --id "$USER"

8. Anexar Metadados do Patrocinador

Crie um arquivo de metadados reutilizável:

bash
printf '{
  "fee_sponsor": "%s"
}\n' "$SPONSOR" > sponsored-fee.json

Qualquer inscrição apresentada com estes metadados é cobrada ao patrocinador:

bash
iroha --config ./alice.client.toml \
  --metadata ./sponsored-fee.json \
  ledger transaction ping --msg "sponsored private-dataspace write"

Para SDKs, anexe o mesmo objeto de metadados da transação à transação assinada. O usuário assina a transação com a chave do usuário. O patrocinador não assina todas as transações do usuário porque a concessão anterior CanUseFeeSponsor é a autorização.

Modelo 1: Os utilizadores pagam sem taxas

Utilizá-lo quando o aplicativo ou operador absorver todas as taxas de rede.

Lista de verificação dos desenvolvedores:

  1. Mantenha inalterada a carga útil normal das transações do utilizador.
  2. Adicionar os metadados de transação com fee_sponsor.
  3. Assine como usuário.
  4. Enviar através da rota do espaço de dados privado.

A conta de utilizador não precisa de um saldo XOR; a conta do patrocinador deve manter o suficiente XOR para cobrir as taxas configuradas Nexus.

Modelo 2: Os usuários pagam um token local

Use isso quando os usuários não devem ter XOR, mas o espaço de dados ainda quer uma taxa interna do aplicativo, gastos de crédito ou token de quota.

Neste padrão, o token local é um pagamento de aplicativo. Não é o activo da taxa de rede. O patrocinador ainda paga a taxa de rede em XOR.

Por exemplo, use um token local no espaço de dados privado:

text
usage#billing.team

Os utilizadores de fundos com usage#billing.team durante a incorporação, renovação da assinatura ou atribuição de quotas.

  1. Transferência de tokens locais do utilizador para o patrocinador
  2. Realizar a operação da aplicação solicitada
  3. incluir metadados fee_sponsor para que o patrocinador pague XOR;

Uma prova mínima de fumo CLI é apenas a transferência local-token patrocinada por XOR:

bash
iroha --config ./alice.client.toml \
  --metadata ./sponsored-fee.json \
  ledger asset transfer \
  --definition-alias "$LOCAL_FEE_ASSET" \
  --account "$USER" \
  --to "$SPONSOR" \
  --quantity 1

Para um aplicativo real, não envie o pagamento com token local como uma transação separada de melhor esforço. Construa uma transação assinada contendo tanto o pagamento quanto as instruções de negócio, ou expõe um ponto de entrada do contrato que coleta o token local antes de aplicar a operação comercial.

Mantenha a política de conversão no seu aplicativo ou contrato:

  • que operação custa quantas unidades de tokens locais
  • como os mapas de entrada de tokens locais para patrocinar XOR top-ups
  • O que acontece quando o equilíbrio do usuário é muito baixo
  • O que acontece quando o saldo do patrocinador XOR é muito baixo

WARNING

Não utilize gas_asset_id para o padrão de "taxa local-token", a menos que você queira que o patrocinador também seja cobrado nesse ativo de gás. No tempo de execução atual, fee_sponsor também faz do patrocinador o pagador dos débitos configurados em activos de gasodutos. Para as taxas de utilizador de tokens locais, recolha o token explicitamente com uma regra de transferência ou contrato.

Debug de transações patrocinadas falhadas

As razões comuns de rejeição geralmente apontam para uma etapa de configuração ausente:

Texto de erroO que verificar ?
fee sponsorship is disabledO nexus.fees.sponsorship_enabled ainda está no false.
fee sponsor is not authorizedO utilizador não dispõe de CanUseFeeSponsor para este patrocinador.
fee asset ... is missingO patrocinador não detém o ativo de taxas XOR configurado.
fee balance ... is insufficientAponte o patrocinador. XOR equilíbrio.
fee exceeds sponsor_max_feeAumentar sponsor_max_fee ou reduzir o tamanho/gás da transacção.
invalid nexus fee asset idFix nexus.fees.fee_asset_id ou o alias de ativo XOR.

Ao depurar o padrão 2, verifique ambos os equilíbrios:

bash
iroha --config ./operator.client.toml \
  ledger asset get \
  --definition-alias "$XOR_ASSET" \
  --account "$SPONSOR"

iroha --config ./operator.client.toml \
  ledger asset get \
  --definition-alias "$LOCAL_FEE_ASSET" \
  --account "$USER"

Otimizar o Patrocinador

Tratar o patrocinador como uma conta do tesouro:

  • manter chaves de patrocínio separadas para testnet, stage e mainnet;
  • Alerta antes que o saldo do patrocinador XOR atinja o nível de admissão
  • Estabelecer um limite não-zero sponsor_max_fee uma vez que o tráfego é caracterizado
  • taxa-limite patrocinado escreve no seu pedido ou gateway
  • Revocar CanUseFeeSponsor quando os utilizadores deixarem o espaço de dados
  • reconciliar hashes de transações de usuários, pagamentos com tokens locais e débitos do patrocinador XOR

Revocar o patrocínio para um utilizador:

bash
printf '{
  "name": "CanUseFeeSponsor",
  "payload": {
    "sponsor": "%s"
  }
}\n' "$SPONSOR" |
  iroha --config ./sponsor.client.toml \
    ledger account permission revoke --id "$USER"