mirror of
https://github.com/Xahau/xahau-web.git
synced 2026-08-23 11:00:51 +00:00
Merge remote-tracking branch 'upstream/main' into lang-dynamic-routing
This commit is contained in:
@@ -75,12 +75,6 @@ Copy the structure below and fill in the translations (English originals shown a
|
||||
feat_more: '', // 'Discover more features'
|
||||
stats_title: '', // 'Network statistics'
|
||||
stats_subtitle: '', // 'Xahau in numbers'
|
||||
stats_accounts: '', // 'Accounts'
|
||||
stats_hooks: '', // 'Hooks installed'
|
||||
stats_nodes: '', // 'Nodes'
|
||||
stats_txs: '', // 'Transactions/24h'
|
||||
stats_ledgers: '', // 'Ledgers closed'
|
||||
stats_node_cta: '', // 'Want to run a node?'
|
||||
},
|
||||
```
|
||||
|
||||
@@ -298,7 +292,7 @@ Find the TM disclaimer ternary and add the `pt-BR` case:
|
||||
{locale === 'es'
|
||||
? 'Todas las marcas y logotipos son propiedad de sus respectivos dueños.'
|
||||
: locale === 'ja'
|
||||
? 'すべての商標およびロゴは、各所有者の財産です。'
|
||||
? 'すべての商標およびロゴは、各所有者に帰属します'
|
||||
: locale === 'pt-BR'
|
||||
? 'Todas as marcas e logotipos são propriedade de seus respectivos donos.'
|
||||
: 'All trademarks and logos are the property of their respective owners.'}
|
||||
|
||||
@@ -20,6 +20,7 @@ export default defineConfig({
|
||||
locales: {
|
||||
root: { label: 'English', lang: 'en' },
|
||||
es: { label: 'Español', lang: 'es' },
|
||||
'pt-br': { label: 'Português (Brasil)', lang: 'pt-BR' },
|
||||
ja: { label: '日本語', lang: 'ja' },
|
||||
},
|
||||
tableOfContents: {
|
||||
@@ -75,12 +76,20 @@ export default defineConfig({
|
||||
sidebar: [
|
||||
{
|
||||
label: 'Get started',
|
||||
translations: { es: 'Primeros pasos', ja: 'はじめる' },
|
||||
translations: {
|
||||
es: 'Primeros pasos',
|
||||
ja: 'はじめる',
|
||||
'pt-BR': 'Primeiros Passos',
|
||||
},
|
||||
items: ['docs', 'docs/what-is-different'],
|
||||
},
|
||||
{
|
||||
label: 'Features',
|
||||
translations: { es: 'Características', ja: '機能' },
|
||||
translations: {
|
||||
es: 'Características',
|
||||
ja: '機能',
|
||||
'pt-BR': 'Recursos',
|
||||
},
|
||||
items: [
|
||||
'docs/features/public-nodes-rpc',
|
||||
'docs/features/amendments',
|
||||
@@ -89,6 +98,7 @@ export default defineConfig({
|
||||
translations: {
|
||||
es: 'Firma de Transacciones',
|
||||
ja: 'トランザクション署名',
|
||||
'pt-BR': 'Assinatura de Transações',
|
||||
},
|
||||
autogenerate: { directory: 'docs/features/transaction-signing' },
|
||||
collapsed: true,
|
||||
@@ -98,6 +108,7 @@ export default defineConfig({
|
||||
translations: {
|
||||
es: 'Herramientas para Desarrolladores',
|
||||
ja: '開発者ツール',
|
||||
'pt-BR': 'Ferramentas para Desenvolvedores',
|
||||
},
|
||||
autogenerate: { directory: 'docs/features/developer-tooling' },
|
||||
collapsed: true,
|
||||
@@ -107,6 +118,7 @@ export default defineConfig({
|
||||
translations: {
|
||||
es: 'APIs HTTP / WebSocket',
|
||||
ja: 'HTTP / WebSocket API',
|
||||
'pt-BR': 'APIs HTTP / WebSocket',
|
||||
},
|
||||
autogenerate: { directory: 'docs/features/http-websocket-apis' },
|
||||
collapsed: true,
|
||||
@@ -116,6 +128,7 @@ export default defineConfig({
|
||||
translations: {
|
||||
es: 'Funcionalidades de Red',
|
||||
ja: 'ネットワーク機能',
|
||||
'pt-BR': 'Funcionalidades da Rede',
|
||||
},
|
||||
autogenerate: { directory: 'docs/features/network-features' },
|
||||
collapsed: true,
|
||||
@@ -132,11 +145,16 @@ export default defineConfig({
|
||||
translations: {
|
||||
es: 'Referencia del Protocolo',
|
||||
ja: 'プロトコルリファレンス',
|
||||
'pt-BR': 'Referência do Protocolo',
|
||||
},
|
||||
items: [
|
||||
{
|
||||
label: 'Transactions',
|
||||
translations: { es: 'Transacciones', ja: 'トランザクション' },
|
||||
translations: {
|
||||
es: 'Transacciones',
|
||||
ja: 'トランザクション',
|
||||
'pt-BR': 'Transações',
|
||||
},
|
||||
collapsed: true,
|
||||
items: [
|
||||
'docs/protocol-reference/transactions',
|
||||
@@ -145,6 +163,7 @@ export default defineConfig({
|
||||
translations: {
|
||||
es: 'Tipos de Transacción',
|
||||
ja: 'トランザクションタイプ',
|
||||
'pt-BR': 'Tipos de Transação',
|
||||
},
|
||||
autogenerate: {
|
||||
directory:
|
||||
@@ -157,6 +176,7 @@ export default defineConfig({
|
||||
translations: {
|
||||
es: 'Tipos de Pseudotransacción',
|
||||
ja: '擬似トランザクションタイプ',
|
||||
'pt-BR': 'Tipos de Pseudotransação',
|
||||
},
|
||||
autogenerate: {
|
||||
directory:
|
||||
@@ -169,6 +189,7 @@ export default defineConfig({
|
||||
translations: {
|
||||
es: 'Resultados de Transacción',
|
||||
ja: 'トランザクション結果',
|
||||
'pt-BR': 'Resultados de Transação',
|
||||
},
|
||||
autogenerate: {
|
||||
directory:
|
||||
@@ -182,7 +203,11 @@ export default defineConfig({
|
||||
},
|
||||
{
|
||||
label: 'Ledger Data',
|
||||
translations: { es: 'Datos del Ledger', ja: 'レジャーデータ' },
|
||||
translations: {
|
||||
es: 'Datos del Ledger',
|
||||
ja: 'レジャーデータ',
|
||||
'pt-BR': 'Dados do Ledger',
|
||||
},
|
||||
collapsed: true,
|
||||
items: [
|
||||
'docs/protocol-reference/ledger-data',
|
||||
@@ -191,6 +216,7 @@ export default defineConfig({
|
||||
translations: {
|
||||
es: 'Tipos de Objetos del Ledger',
|
||||
ja: 'レジャーオブジェクトタイプ',
|
||||
'pt-BR': 'Tipos de Objetos do Ledger',
|
||||
},
|
||||
autogenerate: {
|
||||
directory:
|
||||
@@ -204,7 +230,11 @@ export default defineConfig({
|
||||
},
|
||||
{
|
||||
label: 'Data Types',
|
||||
translations: { es: 'Tipos de Datos', ja: 'データ型' },
|
||||
translations: {
|
||||
es: 'Tipos de Datos',
|
||||
ja: 'データ型',
|
||||
'pt-BR': 'Tipos de Dados',
|
||||
},
|
||||
collapsed: true,
|
||||
items: [
|
||||
'docs/protocol-reference/data-types',
|
||||
@@ -221,7 +251,11 @@ export default defineConfig({
|
||||
'docs/hooks',
|
||||
{
|
||||
label: 'Concepts',
|
||||
translations: { es: 'Conceptos', ja: 'コンセプト' },
|
||||
translations: {
|
||||
es: 'Conceptos',
|
||||
ja: 'コンセプト',
|
||||
'pt-BR': 'Conceitos',
|
||||
},
|
||||
collapsed: true,
|
||||
items: [
|
||||
'docs/hooks/concepts/introduction',
|
||||
@@ -249,12 +283,16 @@ export default defineConfig({
|
||||
},
|
||||
{
|
||||
label: 'Functions',
|
||||
translations: { es: 'Funciones', ja: '関数' },
|
||||
translations: { es: 'Funciones', ja: '関数', 'pt-BR': 'Funções' },
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
label: 'Overview',
|
||||
translations: { es: 'Descripción General', ja: '概要' },
|
||||
translations: {
|
||||
es: 'Descripción General',
|
||||
ja: '概要',
|
||||
'pt-BR': 'Visão Geral',
|
||||
},
|
||||
collapsed: true,
|
||||
autogenerate: { directory: 'docs/hooks/functions/overview' },
|
||||
},
|
||||
@@ -263,6 +301,7 @@ export default defineConfig({
|
||||
translations: {
|
||||
es: 'Definidas por el Desarrollador',
|
||||
ja: '開発者定義',
|
||||
'pt-BR': 'Definidas pelo Desenvolvedor',
|
||||
},
|
||||
collapsed: true,
|
||||
autogenerate: {
|
||||
@@ -276,7 +315,11 @@ export default defineConfig({
|
||||
},
|
||||
{
|
||||
label: 'Utilities',
|
||||
translations: { es: 'Utilidades', ja: 'ユーティリティ' },
|
||||
translations: {
|
||||
es: 'Utilidades',
|
||||
ja: 'ユーティリティ',
|
||||
'pt-BR': 'Utilitários',
|
||||
},
|
||||
collapsed: true,
|
||||
autogenerate: { directory: 'docs/hooks/functions/utilities' },
|
||||
},
|
||||
@@ -285,6 +328,7 @@ export default defineConfig({
|
||||
translations: {
|
||||
es: 'Serialización',
|
||||
ja: 'シリアライゼーション',
|
||||
'pt-BR': 'Serialização',
|
||||
},
|
||||
collapsed: true,
|
||||
autogenerate: {
|
||||
@@ -296,6 +340,7 @@ export default defineConfig({
|
||||
translations: {
|
||||
es: 'Transacción Emitida',
|
||||
ja: '発行トランザクション',
|
||||
'pt-BR': 'Transação Emitida',
|
||||
},
|
||||
collapsed: true,
|
||||
autogenerate: {
|
||||
@@ -317,6 +362,7 @@ export default defineConfig({
|
||||
translations: {
|
||||
es: 'Contexto del Hook',
|
||||
ja: 'フックコンテキスト',
|
||||
'pt-BR': 'Contexto do Hook',
|
||||
},
|
||||
collapsed: true,
|
||||
autogenerate: {
|
||||
@@ -330,7 +376,7 @@ export default defineConfig({
|
||||
},
|
||||
{
|
||||
label: 'State',
|
||||
translations: { es: 'Estado', ja: '状態' },
|
||||
translations: { es: 'Estado', ja: '状態', 'pt-BR': 'Estado' },
|
||||
collapsed: true,
|
||||
autogenerate: { directory: 'docs/hooks/functions/state' },
|
||||
},
|
||||
@@ -339,6 +385,7 @@ export default defineConfig({
|
||||
translations: {
|
||||
es: 'Traza (Debug)',
|
||||
ja: 'トレース(デバッグ)',
|
||||
'pt-BR': 'Rastreamento (Debug)',
|
||||
},
|
||||
collapsed: true,
|
||||
autogenerate: {
|
||||
@@ -350,6 +397,7 @@ export default defineConfig({
|
||||
translations: {
|
||||
es: 'Transacción de Origen',
|
||||
ja: '発信トランザクション',
|
||||
'pt-BR': 'Transação de Origem',
|
||||
},
|
||||
collapsed: true,
|
||||
autogenerate: {
|
||||
@@ -373,7 +421,11 @@ export default defineConfig({
|
||||
},
|
||||
{
|
||||
label: 'Compliance',
|
||||
translations: { es: 'Cumplimiento', ja: 'コンプライアンス' },
|
||||
translations: {
|
||||
es: 'Cumplimiento',
|
||||
ja: 'コンプライアンス',
|
||||
'pt-BR': 'Conformidade',
|
||||
},
|
||||
items: [
|
||||
'docs/compliance/security-audit',
|
||||
'docs/compliance/responsible-disclosure',
|
||||
@@ -381,7 +433,11 @@ export default defineConfig({
|
||||
},
|
||||
{
|
||||
label: 'Infrastructure',
|
||||
translations: { es: 'Infraestructura', ja: 'インフラストラクチャ' },
|
||||
translations: {
|
||||
es: 'Infraestructura',
|
||||
ja: 'インフラストラクチャ',
|
||||
'pt-BR': 'Infraestrutura',
|
||||
},
|
||||
items: [
|
||||
'docs/infrastructure/system-requirements',
|
||||
'docs/infrastructure/installing-xahaud',
|
||||
@@ -395,6 +451,7 @@ export default defineConfig({
|
||||
translations: {
|
||||
es: 'Compilar xahaud (Avanzado)',
|
||||
ja: 'xahaudをビルド(上級)',
|
||||
'pt-BR': 'Compilar xahaud (Avançado)',
|
||||
},
|
||||
collapsed: true,
|
||||
items: [
|
||||
@@ -407,12 +464,12 @@ export default defineConfig({
|
||||
},
|
||||
{
|
||||
label: 'Resources',
|
||||
translations: { es: 'Recursos', ja: 'リソース' },
|
||||
translations: { es: 'Recursos', ja: 'リソース', 'pt-BR': 'Recursos' },
|
||||
items: ['docs/resources/whitepaper', 'docs/resources/media-kit'],
|
||||
},
|
||||
{
|
||||
label: 'Support',
|
||||
translations: { es: 'Soporte', ja: 'サポート' },
|
||||
translations: { es: 'Soporte', ja: 'サポート', 'pt-BR': 'Suporte' },
|
||||
autogenerate: { directory: 'docs/support' },
|
||||
},
|
||||
],
|
||||
|
||||
12
src/assets/ecosystem-logos/terrapay.svg
Normal file
12
src/assets/ecosystem-logos/terrapay.svg
Normal file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" id="div-Img-Logo" width="149.406" height="28.77" viewBox="0 0 149.406 28.77">
|
||||
<path id="Path_13" data-name="Path 13" d="M662.92,30.152A7.7,7.7,0,0,0,668.6,28.8l2.29,3.207c-.808.916-4.257,2.56-7.706,2.56-9.916.3-8.542-8.946-8.542-8.946.135-2.048,2.512-9.963,12.044-9.431,9.439.527,5.847,10.886,5.847,10.886H659.605s-.162,2.587,3.314,3.072m-2.56-6.817h8.3s.269-2.775-3.665-2.775a5.132,5.132,0,0,0-4.635,2.775" transform="translate(-641.083 -11.867)" fill="#e35e57"></path>
|
||||
<path id="Path_14" data-name="Path 14" d="M733.3,16.921h-4.736l-3.092,17.545H730.6l1.557-9.087a5.136,5.136,0,0,1,1.246-2.606,4.6,4.6,0,0,1,2.228-1.361,3.963,3.963,0,0,1,3.951.687l2.871-4a5.162,5.162,0,0,0-3.852-1.619,7.005,7.005,0,0,0-5.227,2.331Z" transform="translate(-693.113 -12.095)" fill="#213871"></path>
|
||||
<path id="Path_15" data-name="Path 15" d="M793.041,16.921H788.3l-3.092,17.545h5.129l1.557-9.087a5.136,5.136,0,0,1,1.246-2.606,4.6,4.6,0,0,1,2.228-1.361,3.963,3.963,0,0,1,3.951.687l2.871-4a5.162,5.162,0,0,0-3.852-1.619,7.005,7.005,0,0,0-5.227,2.331Z" transform="translate(-736.961 -12.095)" fill="#213871"></path>
|
||||
<path id="Path_16" data-name="Path 16" d="M859.568,17.034h4.862l-3.2,17.536H856.7l.042-2.161a8.233,8.233,0,0,1-6.524,2.493c-4.7-.042-7.4-3.864-6.815-9.017A10.515,10.515,0,0,1,853,16.66c5.012-.347,6.066,2.318,6.066,2.318Zm-1.686,8.547s.679-4.431-3.856-4.453c-4.976-.025-5.474,4.926-5.474,4.926s-.721,4.406,4.106,4.354c4.628-.05,5.225-4.827,5.225-4.827" transform="translate(-779.613 -12.205)" fill="#213871"></path>
|
||||
<path id="Path_17" data-name="Path 17" d="M613.835,4.8c.472-2.672.847-4.8.847-4.8L609.5.565,608.759,4.8H604.48l-.638,4.22h4.18l-1.271,7.288s-.51,2.973.51,4.361,2.917,2.973,8.807,1.246l-.4-4.219s-3.313,1.359-3.794-.623a3.736,3.736,0,0,1,.077-1.753c.067-.314.219-1.274.669-3.806l-.984-2.493h3.524a5.062,5.062,0,0,0,4.992-4.22Z" transform="translate(-603.841)" fill="#213871"></path>
|
||||
<path id="Path_18" data-name="Path 18" d="M612.621,36.4l-8.781-2.493h7.8Z" transform="translate(-603.84 -24.889)" fill="#e35e57"></path>
|
||||
<path id="Path_19" data-name="Path 19" d="M936.632,17.557a7.018,7.018,0,0,1,2.767,2.718,8.217,8.217,0,0,1,1.026,4.183,10.621,10.621,0,0,1-1.286,5.225,9.442,9.442,0,0,1-8.416,4.964q-4,0-5.664-2.6L923.334,40.7h-5.079l4.753-23.83h4.818l-.358,1.726a7.685,7.685,0,0,1,5.372-1.986,7.834,7.834,0,0,1,3.793.944m-3.825,12.159a4.951,4.951,0,0,0,1.823-2.035,6.608,6.608,0,0,0,.651-3,3.8,3.8,0,0,0-1.058-2.832,4.021,4.021,0,0,0-2.946-1.042,4.871,4.871,0,0,0-2.637.732,4.953,4.953,0,0,0-1.823,2.035,6.607,6.607,0,0,0-.651,3,3.825,3.825,0,0,0,1.042,2.832,3.961,3.961,0,0,0,2.93,1.042,4.931,4.931,0,0,0,2.669-.732" transform="translate(-834.609 -12.193)" fill="#213871"></path>
|
||||
<path id="Path_20" data-name="Path 20" d="M1027.261,16.873l-3.483,17.514h-4.818l.326-1.726a8.163,8.163,0,0,1-9.148,1.042,7.036,7.036,0,0,1-2.751-2.718,8.212,8.212,0,0,1-1.026-4.183,10.619,10.619,0,0,1,1.286-5.225,9.5,9.5,0,0,1,3.5-3.646,9.364,9.364,0,0,1,4.883-1.318q4.036,0,5.7,2.637l.456-2.377Zm-9.115,12.843a4.953,4.953,0,0,0,1.823-2.035,6.612,6.612,0,0,0,.651-3,3.8,3.8,0,0,0-1.058-2.832,4.021,4.021,0,0,0-2.946-1.042,4.871,4.871,0,0,0-4.493,2.767,6.61,6.61,0,0,0-.651,3,3.793,3.793,0,0,0,1.058,2.832,4.018,4.018,0,0,0,2.946,1.042,4.931,4.931,0,0,0,2.669-.732" transform="translate(-899.276 -12.193)" fill="#213871"></path>
|
||||
<path id="Path_21" data-name="Path 21" d="M1098.079,17.592l-11.655,18.686a13.535,13.535,0,0,1-3.662,4.232,7.715,7.715,0,0,1-4.346,1.172,8.748,8.748,0,0,1-2.686-.423,5.549,5.549,0,0,1-2.067-1.107l2.344-3.646a4,4,0,0,0,2.8,1.074,2.933,2.933,0,0,0,1.693-.488,5.712,5.712,0,0,0,1.465-1.66l.162-.293-4.037-17.547h5.079l2.6,11.915,7.292-11.915Z" transform="translate(-948.673 -12.912)" fill="#213871"></path>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.7 KiB |
@@ -67,6 +67,26 @@ const translations = {
|
||||
discord: 'コミュニティDiscord',
|
||||
copyright: `© ${new Date().getFullYear()} Xahau. オープンソース`,
|
||||
},
|
||||
'pt-BR': {
|
||||
tagline: 'Este site é open source e está aberto a contribuições',
|
||||
on: 'em',
|
||||
about: 'Sobre',
|
||||
features: 'Recursos',
|
||||
ecosystem: 'Ecossistema',
|
||||
roadmap: 'Roadmap',
|
||||
break: 'Quebre o Xahau',
|
||||
fraud: 'Denunciar fraude',
|
||||
media: 'Kit de mídia',
|
||||
privacy: 'Política de Privacidade',
|
||||
docs: 'Documentação',
|
||||
getstarted: 'Começar',
|
||||
protocol: 'Referência do Protocolo',
|
||||
infra: 'Infraestrutura',
|
||||
connect: 'Conectar',
|
||||
events: 'Eventos',
|
||||
discord: 'Discord da Comunidade',
|
||||
copyright: `© ${new Date().getFullYear()} Xahau. Open source`,
|
||||
},
|
||||
}
|
||||
|
||||
const t = translations[locale as Locale] || translations[defaultLocale]
|
||||
|
||||
@@ -26,7 +26,8 @@ import { getAlternateLocaleHref } from '../utils/localizedHref'
|
||||
const languages = [
|
||||
{ code: 'en', label: 'English' },
|
||||
{ code: 'es', label: 'Español' },
|
||||
// { code: 'ja', label: '日本語' },
|
||||
{ code: 'pt-BR', label: 'Português (Brasil)' },
|
||||
{ code: 'ja', label: '日本語' },
|
||||
]
|
||||
|
||||
const nav = {
|
||||
@@ -58,6 +59,20 @@ const nav = {
|
||||
infra: 'Infraestructura',
|
||||
discord: 'Discord de la Comunidad',
|
||||
},
|
||||
'pt-BR': {
|
||||
about: 'Sobre',
|
||||
features: 'Recursos',
|
||||
ecosystem: 'Ecossistema',
|
||||
roadmap: 'Roadmap',
|
||||
docs: 'Documentação',
|
||||
connect: 'Conectar',
|
||||
explorers: 'Exploradores',
|
||||
events: 'Eventos',
|
||||
getstarted: 'Primeiros passos',
|
||||
protocol: 'Referência de Protocolo',
|
||||
infra: 'Infraestrutura',
|
||||
discord: 'Discord da Comunidade',
|
||||
},
|
||||
ja: {
|
||||
about: 'Xahauについて',
|
||||
features: '機能',
|
||||
|
||||
@@ -114,6 +114,33 @@ const ui = {
|
||||
contact_on_x: '(X)',
|
||||
contact_or: 'またはメール:',
|
||||
},
|
||||
'pt-BR': {
|
||||
page_title: 'Xahau Connect',
|
||||
page_sub:
|
||||
'Eventos profissionais de blockchain para discussões sérias e inovação',
|
||||
chip_inftf: 'Por INFTF',
|
||||
chip_location: 'Madri, Espanha',
|
||||
chip_upcoming: (n: number) => (n === 1 ? '1 Próximo' : `${n} Próximos`),
|
||||
lbl_upcoming: 'Próximos Eventos',
|
||||
lbl_past: 'Eventos Anteriores',
|
||||
lbl_about: 'Sobre',
|
||||
lbl_contact: 'Participe',
|
||||
no_upcoming: 'Nenhum evento agendado no momento.',
|
||||
no_upcoming_sub:
|
||||
'Siga @XahauNetwork ou envie um e-mail para connect@xahau.org para receber comunicados.',
|
||||
location_view: 'Ver no mapa',
|
||||
about_title: 'Sobre o Xahau Connect',
|
||||
mission_title: 'Nossa Missão',
|
||||
contact_title: 'Palestrantes, Patrocinadores e Contato',
|
||||
contact_body:
|
||||
'Agradecemos aos nossos parceiros que apoiam a missão do Xahau Connect de promover o debate profissional sobre blockchain. Detalhes sobre parceiros e palestrantes serão divulgados conforme confirmarmos a participação nos próximos eventos.',
|
||||
contact_speaking: 'Propostas de palestras e patrocínio:',
|
||||
contact_updates: 'Inscreva-se para receber novidades:',
|
||||
contact_follow: 'Siga',
|
||||
contact_follow2: 'e',
|
||||
contact_on_x: 'no X',
|
||||
contact_or: 'ou envie um e-mail para',
|
||||
},
|
||||
}
|
||||
const t = ui[locale]
|
||||
---
|
||||
@@ -174,8 +201,8 @@ const t = ui[locale]
|
||||
</div>
|
||||
)}
|
||||
{ev.registration && (
|
||||
<a href={ev.registration.url} target="_blank" rel="noopener noreferrer" class="xc-cta-btn btn-teal">
|
||||
{regLabel} →
|
||||
<a href={ev.registration.url} target="_blank" rel="noopener noreferrer" class="xc-cta-link link-teal">
|
||||
{regLabel} ↗
|
||||
</a>
|
||||
)}
|
||||
</article>
|
||||
@@ -585,6 +612,13 @@ const t = ui[locale]
|
||||
border-color 0.15s,
|
||||
color 0.15s;
|
||||
}
|
||||
.link-teal {
|
||||
color: var(--teal2);
|
||||
}
|
||||
.link-teal:hover {
|
||||
color: #004d60;
|
||||
border-color: #004d60;
|
||||
}
|
||||
.link-amb {
|
||||
color: var(--amb2);
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import logoComingSoon from '../assets/ecosystem-logos/coming-soon.svg'
|
||||
import logoDcent from '../assets/ecosystem-logos/dcent.png'
|
||||
import logoGatehub from '../assets/ecosystem-logos/gatehub.png'
|
||||
import logoQuantoz from '../assets/ecosystem-logos/quantoz.svg'
|
||||
import logoTerrapay from '../assets/ecosystem-logos/terrapay.svg'
|
||||
import logoXahauServices from '../assets/ecosystem-logos/xahau-services.png'
|
||||
import logoXahscan from '../assets/ecosystem-logos/xahscan.png'
|
||||
// ── Logo import map (static imports required by Astro)
|
||||
@@ -43,6 +44,7 @@ const logoMap: Record<string, ImageMetadata> = {
|
||||
'Coopbank-Logo-Ethiopia': logoCoopbank,
|
||||
AUPF: logoAfricanUnion,
|
||||
quantoz: logoQuantoz,
|
||||
terrapay: logoTerrapay,
|
||||
}
|
||||
|
||||
const locale = (Astro.currentLocale ?? defaultLocale) as Locale
|
||||
|
||||
BIN
src/content/docs/pt-br/docs/assets/image.png
Normal file
BIN
src/content/docs/pt-br/docs/assets/image.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 98 KiB |
@@ -0,0 +1,70 @@
|
||||
---
|
||||
title: Divulgação Responsável
|
||||
description: >-
|
||||
Nossa Política de Divulgação Responsável fornece diretrizes claras para o
|
||||
envio de relatórios, garantindo a confidencialidade.
|
||||
---
|
||||
|
||||
import { Aside } from "@astrojs/starlight/components";
|
||||
|
||||
### Política de Divulgação Responsável
|
||||
|
||||
No Xahau, acreditamos que a segurança dos nossos sistemas é extremamente importante.
|
||||
|
||||
Apesar do nosso cuidado com a segurança dos nossos sistemas durante o desenvolvimento e a manutenção dos produtos, sempre há a possibilidade de alguém encontrar algo que precisamos melhorar/atualizar/alterar/corrigir/...
|
||||
|
||||
Agradecemos que nos notifique o mais rápido possível caso tenha encontrado um ponto fraco em um dos nossos sistemas, para que possamos tomar medidas imediatas para proteger nossos clientes e seus dados.
|
||||
|
||||
### Como Reportar
|
||||
|
||||
Se você acredita ter encontrado um problema de segurança em um dos nossos sistemas, notifique-nos o mais rápido possível publicando uma **descrição de alto nível da sua descoberta e informações de contato (para que alguém possa retornar) no Github:** [**https://github.com/Xahau/xahaud/issues**](https://github.com/Xahau/xahaud/issues)
|
||||
|
||||
### Regras
|
||||
|
||||
Esta política de divulgação responsável não é um convite aberto para escanear ativamente nossa rede e aplicações em busca de vulnerabilidades. Nosso monitoramento contínuo provavelmente detectará sua varredura, e estas serão investigadas.
|
||||
|
||||
#### Pedimos que você:
|
||||
|
||||
- Não compartilhe informações sobre o problema de segurança com outras pessoas até que o problema seja resolvido, e que exclua imediatamente quaisquer dados confidenciais obtidos
|
||||
- Não abuse ainda mais do problema, por exemplo, baixando mais dados do que o necessário para demonstrar a vulnerabilidade, ou visualizando, excluindo ou alterando dados de terceiros
|
||||
- Forneça informações detalhadas para que possamos reproduzir, validar e resolver o problema o mais rápido possível. Inclua seus dados de teste, registros de data e hora e URL(s) do(s) sistema(s) envolvido(s)
|
||||
- Deixe seus dados de contato (endereço de e-mail e/ou número de telefone) para que possamos entrar em contato com você sobre o andamento da solução. Também aceitamos relatórios anônimos.
|
||||
- Não utilize ataques à segurança física, engenharia social, negação de serviço distribuída, spam ou aplicações de terceiros
|
||||
|
||||
### Procedimento(s) de Divulgação Responsável
|
||||
|
||||
#### Ao reportar um problema de segurança, agiremos da seguinte forma:
|
||||
|
||||
- Você receberá uma confirmação de recebimento dentro de 4 dias úteis após o envio do relatório
|
||||
- Você receberá uma resposta com a avaliação do problema de segurança e uma data prevista de resolução dentro de 4 dias úteis após o envio da confirmação de recebimento
|
||||
- Não tomaremos medidas legais contra você em relação ao relatório se você tiver cumprido as condições estabelecidas acima
|
||||
- Trataremos seu relatório de forma confidencial e não compartilharemos seus dados com terceiros sem sua permissão, a menos que isso seja necessário para cumprir uma obrigação legal
|
||||
|
||||
#### Este esquema de divulgação responsável não se destina a:
|
||||
|
||||
- Reclamações
|
||||
- Relatórios de indisponibilidade do site
|
||||
- Relatórios de phishing
|
||||
- Relatórios de fraude
|
||||
|
||||
Para essas reclamações ou relatórios, publique uma **descrição de alto nível do seu problema e informações de contato (para que alguém possa retornar) no Github:** [**https://github.com/Xahau/xahaud/issues**](https://github.com/Xahau/xahaud/issues)
|
||||
|
||||
### Programa de recompensa por bugs
|
||||
|
||||
O Xahau incentiva o reporte de problemas de segurança ou vulnerabilidades. Podemos oferecer uma recompensa adequada pela divulgação confidencial de qualquer problema de design ou implementação que possa ser usado para comprometer a confidencialidade ou integridade dos dados dos nossos usuários e que ainda não fosse do nosso conhecimento. Nós decidimos se o relatório é elegível e o valor da recompensa.
|
||||
|
||||
### Exclusões
|
||||
|
||||
#### Os seguintes tipos de problemas de segurança são excluídos
|
||||
|
||||
- Ataques (D)DOS
|
||||
- Mensagens de erro ou páginas de erro sem dados sensíveis
|
||||
- Testes e dados de amostra disponíveis publicamente em nossos repositórios no Github
|
||||
- Problemas comuns como avisos de cabeçalho de navegador ou configuração de DNS, identificados por varreduras de vulnerabilidade
|
||||
- Relatórios de varredura de vulnerabilidade para os softwares que utilizamos publicamente
|
||||
- Problemas de segurança relacionados a sistemas operacionais, navegadores ou plugins desatualizados
|
||||
- Relatórios de problemas de segurança sobre os quais já fomos notificados anteriormente
|
||||
|
||||
Atenção: Relatórios que não contenham nenhuma prova (como capturas de tela ou outros dados), informações detalhadas ou detalhes sobre como reproduzir qualquer resultado inesperado serão investigados, mas não serão elegíveis para nenhuma recompensa.
|
||||
|
||||
Esta política é baseada nas Diretrizes de Divulgação Responsável do Centro Nacional de Segurança Cibernética e em um [exemplo de Floor Terra](https://responsibledisclosure.nl/).
|
||||
24
src/content/docs/pt-br/docs/compliance/security-audit.mdx
Normal file
24
src/content/docs/pt-br/docs/compliance/security-audit.mdx
Normal file
@@ -0,0 +1,24 @@
|
||||
---
|
||||
title: Auditorias de Segurança
|
||||
---
|
||||
import { Aside } from '@astrojs/starlight/components';
|
||||
|
||||
O amendment Hooks, parte integrante da infraestrutura de contratos inteligentes do XRPL, passou por uma auditoria de segurança detalhada realizada pela FYEO. A auditoria examinou a implementação do framework Hooks, incluindo a API de Hook, funções auxiliares e o ambiente de execução. 
|
||||
|
||||
Sem problemas de segurança graves detectados e todos os problemas menores resolvidos, esta auditoria serve como um testemunho do nosso compromisso com a segurança e da robustez dos Hooks. 
|
||||
|
||||
Ao habilitar lógica de transações inteligentes diretamente na Camada 1 do XRPL, os Hooks trazem maior flexibilidade para adaptar aplicações às suas necessidades únicas, inspirando mais inovação dentro do ecossistema XRPL.
|
||||
|
||||
Os desenvolvedores agora dispõem de ferramentas robustas para criar e implantar lógica personalizada, acessível em nossa testnet.
|
||||
|
||||
### **Garantia de Segurança Contínua**
|
||||
|
||||
A conclusão bem-sucedida da auditoria não é apenas um marco, mas um alicerce para a segurança e a sustentabilidade contínuas da rede Hooks.
|
||||
|
||||
Com todas as vulnerabilidades identificadas tratadas, o amendment Hooks está pronto para impulsionar a inovação de forma segura no Xahau.
|
||||
|
||||
<Aside type="note">
|
||||
A auditoria de segurança completa pode ser encontrada [**aqui**](https://xrpl-labs.com/static/misc/Security%20Assessment%20of%20the%20XRP%20Labs%20Hooks%20Amendment%20v1.0.pdf). 
|
||||
</Aside>
|
||||
|
||||
Por um futuro mais brilhante e inovador com o Xahau!
|
||||
5
src/content/docs/pt-br/docs/data-apis/index.mdx
Normal file
5
src/content/docs/pt-br/docs/data-apis/index.mdx
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
title: "APIs de Dados"
|
||||
---
|
||||
|
||||
A API de Dados principal está localizada em https://data.xahau.network/
|
||||
184
src/content/docs/pt-br/docs/features/amendments.mdx
Normal file
184
src/content/docs/pt-br/docs/features/amendments.mdx
Normal file
@@ -0,0 +1,184 @@
|
||||
---
|
||||
title: Amendments
|
||||
---
|
||||
Os amendments representam novos recursos ou outras mudanças no processamento de transações.
|
||||
|
||||
O sistema de amendments usa o processo de consenso para aprovar quaisquer mudanças que afetem o processamento de transações no Xahau. Mudanças totalmente funcionais no processamento de transações são introduzidas como amendments; os validadores então votam nessas mudanças. Se um amendment receber mais de 80% de suporte por cinco dias, ele é aprovado e a mudança se aplica permanentemente a todas as versões subsequentes do ledger. Desabilitar um amendment aprovado requer um novo amendment para isso.
|
||||
|
||||
**Nota:** Correções de bugs que alteram processos de transação também requerem amendments.
|
||||
|
||||
### Processo de Amendment
|
||||
|
||||
O tópico Contribuindo com Código para o Xahau percorre o fluxo de trabalho para desenvolver um amendment desde uma ideia até a ativação no Xahau.
|
||||
|
||||
Após o código de um amendment ser incorporado a uma versão do software, o processo para habilitá-lo ocorre dentro da rede Xahau, que verifica o status dos amendments a cada ledger _flag_ (geralmente com cerca de 15 minutos de intervalo).
|
||||
|
||||
Cada 256º ledger é chamado de ledger **flag**. O ledger flag não possui conteúdo especial, mas o processo de amendment ocorre em torno dele.
|
||||
|
||||
1. **Flag Ledger -1:** Quando os validadores `xahaud` enviam mensagens de validação, eles também submetem seus votos de amendment.
|
||||
2. **Flag Ledger:** Os servidores interpretam os votos dos validadores confiáveis.
|
||||
3. **Flag Ledger +1:** Os servidores inserem uma pseudo-transação `EnableAmendment` e sinalizam com base no que acreditam ter acontecido:
|
||||
|
||||
* O sinalizador `tfGotMajority` significa que o amendment tem mais de 80% de suporte.
|
||||
* O sinalizador `tfLostMajority` significa que o suporte ao amendment diminuiu para 80% ou menos.
|
||||
* Nenhum sinalizador significa que o amendment está habilitado.
|
||||
|
||||
**Nota:** É possível que um amendment perca 80% de suporte no mesmo ledger em que atinge o período necessário de cinco dias para ser habilitado. Nesses casos, uma pseudo-transação `EnableAmendment` é adicionada para ambos os cenários, mas o amendment é habilitado de qualquer forma.
|
||||
4. **Flag Ledger +2:** Os amendments habilitados se aplicam às transações a partir deste ledger em diante.
|
||||
|
||||
### Votação de Amendments
|
||||
|
||||
Cada versão do `xahaud` é compilada com uma lista de amendments conhecidos e o código para implementá-los. Os operadores de validadores `xahaud` configuram seus servidores para votar em cada amendment e podem alterar isso a qualquer momento. Se o operador não escolher um voto, o servidor usa um voto padrão definido pelo código-fonte.
|
||||
|
||||
**Nota:** O voto padrão pode mudar entre versões do software. \[Atualizado em: rippled 1.8.1]\[]
|
||||
|
||||
Os amendments devem manter cinco dias de suporte de mais de 80% dos validadores confiáveis para serem habilitados. Se o suporte cair abaixo de 80%, o amendment é temporariamente rejeitado e o período de duas semanas é reiniciado. Os amendments podem ganhar e perder a maioria qualquer número de vezes antes de se tornarem permanentemente habilitados.
|
||||
|
||||
Amendments cujo código-fonte foi removido sem serem habilitados são considerados **vetados** pela rede.
|
||||
|
||||
### Servidores Bloqueados por Amendment
|
||||
|
||||
O bloqueio por amendment é um recurso de segurança para proteger a precisão dos dados do Xahau. Quando um amendment é habilitado, os servidores que executam versões anteriores do `xahaud` sem o código-fonte do amendment não entendem mais as regras da rede. Em vez de adivinhar e interpretar incorretamente os dados do ledger, esses servidores ficam **bloqueados por amendment** e não podem:
|
||||
|
||||
* Determinar a validade de um ledger.
|
||||
* Enviar ou processar transações.
|
||||
* Participar do processo de consenso.
|
||||
* Votar em futuros amendments.
|
||||
|
||||
A configuração de votação de um servidor `xahaud` não tem impacto no bloqueio por amendment. Um servidor `xahaud` sempre segue os amendments habilitados pelo restante da rede, portanto, os bloqueios são baseados exclusivamente em ter o código para entender as mudanças de regras. Isso significa que você também pode ser bloqueado por amendment se conectar seu servidor a uma rede paralela com diferentes amendments habilitados. Por exemplo, a Testnet do Xahau geralmente tem amendments experimentais habilitados. Se você estiver usando a versão de produção mais recente, seu servidor provavelmente não terá o código para esses amendments experimentais.
|
||||
|
||||
Você pode desbloquear servidores bloqueados por amendment atualizando para a versão mais recente do `xahaud`.
|
||||
|
||||
### Aposentadoria de Amendments
|
||||
|
||||
Quando os amendments são habilitados, o código-fonte para comportamentos anteriores ao amendment permanece no `xahaud`. Embora haja casos de uso para manter o código antigo, como reconstruir resultados de ledger para verificação, rastrear amendments e código legado adiciona complexidade ao longo do tempo.
|
||||
|
||||
O [XRP Ledger Standard 11d](https://github.com/XRPLF/XRPL-Standards/discussions/19) define um processo para aposentar amendments antigos e o código pré-amendment associado. Após um amendment ter sido habilitado na Mainnet por dois anos, ele pode ser aposentado. Aposentar um amendment o torna parte do protocolo central de forma incondicional; ele não é mais rastreado ou tratado como um amendment, e todo o código pré-amendment é removido.
|
||||
|
||||
### Amendments Conhecidos
|
||||
|
||||
Os seguintes amendments foram implementados ou estão em processo de habilitação no Xahau:
|
||||
|
||||
#### Amendments de Funcionalidade
|
||||
|
||||
##### XahauGenesis
|
||||
|
||||
Permite que a conta gênesis emita XAH e o distribua via [transações GenesisMint](/pt-br/docs/protocol-reference/transactions/transaction-types/genesismint-emitted-txn).
|
||||
|
||||
##### MultiSign
|
||||
|
||||
Habilita a funcionalidade de múltiplas assinaturas, permitindo que as contas exijam várias assinaturas para transações. Este amendment introduz [transações SignerListSet](/pt-br/docs/protocol-reference/transactions/transaction-types/signerlistset) e [objetos de ledger SignerList](/pt-br/docs/protocol-reference/ledger-data/ledger-objects-types/signers-list) para suportar múltiplas assinaturas.
|
||||
|
||||
##### DepositAuth
|
||||
|
||||
Habilita a funcionalidade de autorização de depósito, permitindo que as contas exijam pré-autorização antes de receber pagamentos. Este amendment introduz [transações DepositPreauth](/pt-br/docs/protocol-reference/transactions/transaction-types/depositpreauth) e [objetos de ledger DepositPreauth](/pt-br/docs/protocol-reference/ledger-data/ledger-objects-types/deposit-pre-auth) para gerenciar pré-autorizações.
|
||||
|
||||
##### Hooks
|
||||
|
||||
Amendment principal que habilita a funcionalidade de contratos inteligentes Hook no Xahau. _(Adicionado pelo [amendment Hooks][].)_
|
||||
|
||||
##### HooksUpdate1
|
||||
|
||||
Atualizações e melhorias no sistema de Hooks.
|
||||
|
||||
##### Remit
|
||||
|
||||
Implementa o [XLS-55](https://github.com/XRPLF/XRPL-Standards/discussions/156). Um novo tipo de transação de pagamento push simples e poderoso do tipo "o que você vê é o que você obtém". Habilita [transações Remit](/pt-br/docs/protocol-reference/transactions/transaction-types/remit) que permitem pagar múltiplas moedas e URITokens na mesma transação para o mesmo destino. A transação paga automaticamente para criar trustlines ausentes, paga automaticamente as reservas em tokens transferidos e paga automaticamente para criar a conta de destino caso ela não exista. Você pode cunhar um recibo ou URIToken bônus inline dentro da transação. Opcionalmente, informe um Hook de terceiros sobre a transação. Sem pagamentos parciais e sem roteamento.
|
||||
|
||||
##### ZeroB2M
|
||||
|
||||
Desabilita o caminho de queima para cunhagem de XRP para XAH. O comportamento normal da transação Import permanece, mas o XRP queimado não é creditado. O B2M ainda está disponível para sincronização de chaves ou para ativar uma conta, mas não pode ser usado para cunhar novos ativos.
|
||||
|
||||
##### Remarks
|
||||
|
||||
O amendment Remarks permite que pares chave-valor (semelhante ao estado de hook) sejam armazenados pelos proprietários de objetos nesses objetos. Isso é como virar um documento e escrever uma nota à mão nele. Os Remarks podem ser qualquer coisa e significar coisas diferentes para partes diferentes. Os Remarks também podem ser definidos como imutáveis. Os Remarks seguem um objeto ao longo das mudanças de propriedade e podem ser usados para alcançar casos de uso inovadores, como NFTs dinâmicos e simplificar algumas operações de estado de hook que de outra forma seriam muito complicadas. Habilita [transações SetRemarks](/pt-br/docs/protocol-reference/transactions/transaction-types/setremarks).
|
||||
|
||||
##### Touch
|
||||
|
||||
Este amendment garante que todas as contas envolvidas em uma transação (todos os stakeholders transacionais) sejam forçadas a aparecer em seus metadados, incrementando um "contador de toque" mesmo que nada mais na conta tenha sido alterado. O nome é uma referência ao utilitário de arquivo unix `touch`. Isso proporciona melhor consistência de auditoria e facilidade de programação de ferramentas automatizadas.
|
||||
|
||||
##### HookCanEmit
|
||||
|
||||
Este amendment adiciona um novo campo aos objetos HookSet: `HookCanEmit` é sintaticamente idêntico ao campo `HookOn`, exceto que controla quais tipos de transação o Hook tem permissão para emitir, em vez de quais tipos de transação acionam o Hook. Observe que ele usa a mesma semântica active-low que `HookOn`, com `SetHook` sendo active-high. No entanto, se o campo estiver ausente, presume-se que o Hook pode emitir qualquer transação, incluindo `SetHook`. Adiciona o campo `HookCanEmit` aos objetos [HookDefinition](/pt-br/docs/protocol-reference/ledger-data/ledger-objects-types/hook-definition).
|
||||
|
||||
##### Clawback
|
||||
|
||||
Habilita [transações Clawback](/pt-br/docs/protocol-reference/transactions/transaction-types/clawback) que permitem aos emissores revogar tokens que foram previamente emitidos por sua conta. Este é um recurso portado do XRPL. _(Introduzido em 2025.7.9-release+1951)_
|
||||
|
||||
##### DeepFreeze
|
||||
|
||||
Habilita a funcionalidade de congelamento profundo para trustlines e ativos. Este é um recurso portado do XRPL. _(Introduzido em 2025.7.9-release+1951)_
|
||||
|
||||
##### IOUIssuerWeakTSH
|
||||
|
||||
Torna os emissores de IOU stakeholders transacionais fracos (TSH) em certos tipos de transação. Garante que os Emissores de Moeda tenham seus hooks executados em transações de terceiros que tocam ou mencionam sua moeda, se optarem pela execução fraca. Consulte [Fraco e Forte](/pt-br/docs/hooks/concepts/weak-and-strong) para detalhes. _(Introduzido em 2025.7.9-release+1951)_
|
||||
|
||||
##### Cron
|
||||
|
||||
Habilita a execução agendada de Hook via [transações CronSet](/pt-br/docs/protocol-reference/transactions/transaction-types/cronset) e [objetos de ledger Cron](/pt-br/docs/protocol-reference/ledger-data/ledger-objects-types/cron). Este recurso permite que os Hooks agendem uma série de auto-invocações futuras (semelhante a um cronjob em sistemas Linux), o que pode auxiliar os desenvolvedores de Hook a escrever estruturas de governança complexas, jogos e mais. O número máximo de repetições é 256, no entanto, emitir uma transação `CronSet` adicional pode estender esse limite quando o número de repetições ultrapassar um limite mínimo desejado. _(Introduzido em 2025.10.27-release+2405)_
|
||||
|
||||
##### ExtendedHookState
|
||||
|
||||
Estende as capacidades de gerenciamento de estado de Hook, incluindo o campo `HookStateScale` para objetos [AccountRoot](/pt-br/docs/protocol-reference/ledger-data/ledger-objects-types/accountroot) para controlar quando as entradas de estado de Hook ficam obsoletas. Este recurso expande a quantidade de dados que os Hooks podem armazenar em seu Hook State (sistema chave-valor para Hooks) para permitir que os Hooks tenham armazenamento de dados mais rico quando necessário. A escala (até 16) afeta tanto o tamanho máximo do valor que você pode armazenar em um único estado de hook, quanto o número de unidades de reserva que esse par k-v consome. Uma escala de 1 (padrão) significa que você paga 1 reserva por até 256 bytes armazenados por Hook State. Uma escala de 4 significa que você paga 4 unidades de reserva por até 1024 bytes por Hook State. É importante notar que você paga essa taxa (a taxa de escala) mesmo que todos os seus Hook States contenham apenas um único byte. É possível aumentar a escala após seu Hook já ter armazenado estado, mas não diminuí-la. Diminuir a escala requer que todo o HookState seja primeiro excluído. _(Introduzido em 2025.10.27-release+2405)_
|
||||
|
||||
#### Amendments de Correção de Bugs
|
||||
|
||||
##### fixXahauV1
|
||||
|
||||
Impõe um limite de 256 namespaces por conta. Várias correções de bugs com a lógica do URIToken. Garante que STAmounts padrão (0) sejam registrados nos metadados. Garante que OfferID possa ser usado em vez de OfferSequence ao cancelar uma oferta. Corrige um bug onde certos hooks não podem ser excluídos. Corrige um bug onde o quórum necessário para um `ttIMPORT` é acidentalmente muito alto. Permite que contas apareçam mais de uma vez em uma transação GenesisMint. Altera o Emissor de um URIToken de TSH forte para fraco quando um URIToken está sendo queimado. Garante que os TSHes em escrows criados por transações emitidas sejam acionados corretamente. Adiciona taxa de tamanho de parâmetros de hook a todas as transações (1 drop por byte). _(Introduzido em 2024.9.11-release+985)_
|
||||
|
||||
##### fixXahauV2
|
||||
|
||||
Limpa a lógica TSH e remove tabela redundante antiga. Adiciona sinalizadores informativos a cada membro de `sfHookExecutions`, descrevendo execução fraca, forte etc. Adiciona `sfEmitNonce` a cada membro de `sfHookEmissions`, para melhor desambiguação de transações emitidas. Verificações de sanidade adicionais em transações emitidas para garantir que sejam colocadas no ledger correto.
|
||||
|
||||
##### fixXahauV3
|
||||
|
||||
Correções adicionais para problemas de implementação do protocolo Xahau. Este amendment garante consistência e resultados sensatos para vários casos extremos. Este amendment está configurado com voto padrão: _sim_. Se os validadores desejarem votar contra este amendment, devem alterar manualmente seu voto para não. _(Introduzido em 2025.2.6-release+1299)_
|
||||
|
||||
##### fixNSDelete
|
||||
|
||||
Corrige o comportamento da exclusão de namespace de Hook State para garantir a consistência do ledger. Introduz um novo código tes: `tesPARTIAL`. `tesPARTIAL` é retornado se a transação foi bem-sucedida, mas deve ser reenviada pelo usuário com um novo número de sequência para concluir o trabalho amortizado até que `tesSUCCESS` seja retornado.
|
||||
|
||||
##### fix240819
|
||||
|
||||
Amendment de correção de bug de 19 de agosto de 2024.
|
||||
|
||||
##### fixPageCap
|
||||
|
||||
Corrige problemas relacionados aos limites de capacidade de página.
|
||||
|
||||
##### fix240911
|
||||
|
||||
Amendment de correção de bug de 11 de setembro de 2024.
|
||||
|
||||
##### fixFloatDivide
|
||||
|
||||
Corrige problemas com operações de divisão de ponto flutuante nos Hooks. Este amendment garante o tratamento adequado da divisão por zero e casos extremos na função `float_divide`. Altera o comportamento da API de hook `float_divide` para corrigir um pequeno erro. Este amendment está configurado com voto padrão: _sim_. Consulte [float_divide](/pt-br/docs/hooks/functions/float/float_divide) para detalhes. _(Introduzido em 2024.11.18-release+1141)_
|
||||
|
||||
##### fixReduceImport
|
||||
|
||||
Corrige problemas relacionados ao processamento da transação Import. Este amendment garante consistência e resultados sensatos para vários casos extremos. Este amendment está configurado com voto padrão: _sim_. Se os validadores desejarem votar contra este amendment, devem alterar manualmente seu voto para não. _(Introduzido em 2025.2.6-release+1299)_
|
||||
|
||||
##### fix20250131
|
||||
|
||||
Amendment de correção de bug de 31 de janeiro de 2025. Este amendment garante consistência e resultados sensatos para vários casos extremos. Este amendment está configurado com voto padrão: _sim_. Se os validadores desejarem votar contra este amendment, devem alterar manualmente seu voto para não. _(Introduzido em 2025.2.6-release+1299)_
|
||||
|
||||
##### fixRewardClaimFlags
|
||||
|
||||
Corrige problemas com os sinalizadores da transação de reivindicação de recompensa.
|
||||
|
||||
##### fixProvisionalDoubleThreading
|
||||
|
||||
Corrige problemas com o encadeamento duplo provisório no processamento de transações. Garante que o PreviousTxnID correto e os metadados de transação sejam mantidos em cenários de encadeamento duplo. _(Introduzido em 2025.7.9-release+1951)_
|
||||
|
||||
##### fixInvalidTxFlags
|
||||
|
||||
Corrige um bug que atualmente permite que sinalizadores inválidos sejam fornecidos a algumas transações. Embora esses sinalizadores inválidos atualmente não façam nada, eles deveriam produzir um erro de malformação. Após a aplicação desta correção, sinalizadores inválidos produzirão um erro de malformação conforme esperado. _(Introduzido em 2025.10.27-release+2405)_
|
||||
|
||||
##### fixCronStacking
|
||||
|
||||
Corrige problemas com o comportamento de empilhamento de transações Cron.
|
||||
|
||||
### Status dos Amendments
|
||||
|
||||
Para o status mais atualizado dos amendments (habilitados, em votação ou vetados), verifique o [repositório xahaud](https://github.com/Xahau/xahaud) ou consulte um servidor `xahaud` em execução usando o comando `feature`.
|
||||
70
src/content/docs/pt-br/docs/features/balance-adjustments.mdx
Normal file
70
src/content/docs/pt-br/docs/features/balance-adjustments.mdx
Normal file
@@ -0,0 +1,70 @@
|
||||
---
|
||||
title: Ajustes de Saldo
|
||||
description: Como reivindicar um Ajuste de Saldo no Xahau
|
||||
---
|
||||
### Adesão + Reivindicação
|
||||
|
||||
Aderir aos Ajustes de Saldo é a mesma transação que reivindicar um ajuste. Você deve fazer isso primeiro para iniciar a capacidade de reivindicar mais tarde.
|
||||
|
||||
```json
|
||||
{
|
||||
"Account": "<rAddr...>",
|
||||
"TransactionType": "ClaimReward",
|
||||
"Issuer": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
||||
"NetworkID": 21337
|
||||
}
|
||||
```
|
||||
|
||||
### Cancelar Adesão
|
||||
|
||||
Para cancelar a adesão aos Ajustes de Saldo, omita o campo Issuer e defina Flags como 1. Fazer isso excluirá suas estatísticas de saldo médio. Elas não serão restauradas. Se você aderir novamente, serão redefinidas para uma posição inicial.
|
||||
|
||||
```json
|
||||
{
|
||||
"Account": "<rAddr...>",
|
||||
"TransactionType": "ClaimReward",
|
||||
"NetworkID": 21337,
|
||||
"Flags": 1
|
||||
}
|
||||
```
|
||||
|
||||
### Detalhes Técnicos
|
||||
|
||||
Os Ajustes de Saldo são implementados como uma combinação de duas partes de código:
|
||||
|
||||
1. Amendment BalanceRewards (código nativo)
|
||||
2. Hook de Recompensa da Conta Gênesis (código de hook).
|
||||
|
||||
O BalanceRewards coleta estatísticas de saldo médio sobre as contas nas quais está ativado. Essas estatísticas são então passadas para um Hook alvo quando o usuário deseja reivindicar.
|
||||
|
||||
Todas as interações com este amendment são feitas via a transação ClaimReward:
|
||||
|
||||
```json
|
||||
{
|
||||
"Account": "<rAddr...>",
|
||||
"TransactionType": "ClaimReward",
|
||||
"Issuer": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
||||
"NetworkID": 21337
|
||||
}
|
||||
```
|
||||
|
||||
Quando uma transação ClaimReward é submetida com sucesso com o código de erro **tesSUCCESS**, as estatísticas de saldo médio da conta são redefinidas. A única outra coisa que o amendment faz é invocar os Hooks na conta do Emissor especificado.
|
||||
|
||||
O campo _Issuer_ é a conta responsável por cumprir a reivindicação. Dependendo do que está instalado na conta do Emissor, várias coisas podem acontecer:
|
||||
|
||||
* Se nenhum Hook estiver instalado na conta do Emissor, nada é feito e as estatísticas do BalanceRewards são simplesmente redefinidas.
|
||||
* Se um Hook estiver instalado na conta do Emissor e o Hook realizar um rollback, a transação falha e as estatísticas _não_ são redefinidas.
|
||||
* Se um Hook estiver instalado na conta do Emissor e o Hook realizar um accept, a transação é bem-sucedida e as estatísticas são redefinidas. Nesse caso, o Hook também deve emitir uma transação de volta para a conta do usuário contendo sua recompensa.
|
||||
|
||||
Na prática, no Xahau, o Emissor provavelmente sempre será a conta gênesis **rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh**.
|
||||
|
||||
A menos que:
|
||||
|
||||
* A Governança da Rede resulte em uma conta diferente sendo usada para os AjustesDeSaldo.
|
||||
* Uma parte não relacionada à Governança execute seu próprio sorteio de BalanceRewards com o qual o usuário deseja participar. Observe que reivindicações bem-sucedidas resultam na redefinição das estatísticas de saldo médio, portanto, apenas um tipo de recompensa pode ser reivindicado por redefinição.
|
||||
|
||||
As estatísticas de saldo médio existem como uma coleção de três novos campos no objeto AccountRoot. São eles:
|
||||
|
||||
<table><thead><tr><th width="240">Campo</th><th width="95.33333333333331">Tipo</th><th>Explicação</th></tr></thead><tbody><tr><td><code>sfRewardAccumulator</code></td><td>UINT64</td><td>A área sob o gráfico de saldo-tempo da sua conta desde a última transação ClaimReward.</td></tr><tr><td><code>sfRewardLgrFirst</code></td><td>UINT32</td><td>O número do ledger da última transação ClaimReward.</td></tr><tr><td><code>sfRewardLgrLast</code></td><td>UINT32</td><td>O número de sequência do ledger da última transação de entrada ou saída da sua conta.</td></tr><tr><td><code>sfRewardTime</code></td><td>UINT32</td><td>O tempo do ledger em que a última recompensa foi reivindicada.</td></tr></tbody></table>
|
||||
|
||||
|
||||
291
src/content/docs/pt-br/docs/features/burn-2-mint.mdx
Normal file
291
src/content/docs/pt-br/docs/features/burn-2-mint.mdx
Normal file
@@ -0,0 +1,291 @@
|
||||
---
|
||||
title: Burn 2 Mint (B2M)
|
||||
description: >-
|
||||
O Burn2Mint é um primitivo inter-chain de baixo nível destinado a usuários
|
||||
empresariais para fornecer sua própria liquidez conforme necessário.
|
||||
---
|
||||
import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
|
||||
|
||||
<Aside type="caution">
|
||||
Como o amendment ZeroB2M foi aprovado no Xahau, o Burn 2 Mint (B2M) não está mais disponível para cunhar novos ativos. O B2M ainda está disponível, mas apenas para **sincronização de chaves** ou para ativar uma conta (para os quais as informações e procedimentos abaixo ainda são relevantes).
|
||||
|
||||
[https://xahscan.com/amendment/7CA0426E7F411D39BB014E57CD9E08F61DE1750F0D41FCD428D9FB80BB7596B0](https://xahscan.com/amendment/7CA0426E7F411D39BB014E57CD9E08F61DE1750F0D41FCD428D9FB80BB7596B0)
|
||||
</Aside>
|
||||
|
||||
## Manual Técnico do Burn2Mint (Testnet do Xahau)
|
||||
|
||||
<Aside type="caution">
|
||||
**Este processo é deliberadamente não trivial e não foi projetado para usuários finais.** Erros resultam em uma queima que não pode ser convertida em uma cunhagem.
|
||||
|
||||
Este é um aviso que aparecerá na versão de produção deste documento. Você pode desconsiderá-lo porque está queimando XRP gratuito da testnet neste caso.
|
||||
</Aside>
|
||||
|
||||
O Burn2Mint é um primitivo inter-chain de baixo nível destinado a usuários empresariais para fornecer sua própria liquidez conforme necessário. Executar seus próprios nós e realizar esta operação você mesmo em seus nós significa que você e somente você arca com a responsabilidade pelo resultado do procedimento.
|
||||
|
||||
A geração e coleta de XPOPs depende fundamentalmente da coleta de mensagens de validação na rede overlay, que são efêmeras por natureza. Se seus nós não estiverem conectados de forma confiável, ou se seu hardware, conexão de rede ou sistema operacional falhar no momento errado, o XPOP de uma Transação de Queima pode não ser gerado ou pode não ser gerado corretamente. Isso pode levar à perda de fundos, pois o XPOP da Transação de Queima não foi capturado a tempo, e é possível que as mensagens de validação sejam perdidas para sempre, tornando uma Transação de Cunhagem impossível apesar de uma Transação de Queima bem-sucedida.
|
||||
|
||||
Se você não estiver confortável com esses riscos técnicos, não entender o que está fazendo, ou não for um usuário empresarial, por favor, obtenha sua liquidez por meio de outras alternativas mais amigáveis.
|
||||
|
||||
### Configuração
|
||||
|
||||
Para realizar o B2M, _dois_ nós do protocolo XRPL devem ser operados pelo usuário:
|
||||
|
||||
1. **Obter xPOP da queima**
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="xPOP Collector & Server (mais fácil)">
|
||||
Execute isso (por exemplo, usando Docker Compose; veja os Docs do repositório)\
|
||||
[**https://github.com/Xahau/Validation-Ledger-Tx-Store-to-xPOP**](https://github.com/Xahau/Validation-Ledger-Tx-Store-to-xPOP)
|
||||
|
||||
* O serviço ouve mensagens de validação do XRPL, ledgers fechados e transações.
|
||||
* Ele armazena esses dados em um sistema de arquivos organizado.
|
||||
* É essencial para gerar xPOPs, pois as mensagens de validação do XRPL são efêmeras; sem armazená-las, uma queima de transação não pode ser convertida em uma cunhagem.
|
||||
* **Como funciona**:
|
||||
* Um observador conecta-se a vários nós XRPL e escuta dados específicos.
|
||||
* Os dados capturados são então salvos, organizados e usados para gerar xPOPs.
|
||||
|
||||
Simplesmente busque o xPOP agora em:\
|
||||
`http[s]://{seu-host}:{sua-porta}/xpop/{tx-hash}`
|
||||
|
||||
Você pode facilmente buscar/criar xPOPs de um nó usando o repositório acima com este pacote NPM:
|
||||
|
||||
[**https://www.npmjs.com/package/xpop**](https://www.npmjs.com/package/xpop)
|
||||
</TabItem>
|
||||
|
||||
<TabItem label='ou: "Nó de Queima" dedicado'>
|
||||
**Nó de Queima**, composto por:
|
||||
|
||||
* Uma instância modificada do Rippled (modificada para registrar XPOPs)
|
||||
* Binário universal para Linux aqui: [https://tvntezq.dlvr.cloud/rippled_with_xpop](https://tvntezq.dlvr.cloud/rippled_with_xpop)
|
||||
* [https://github.com/RichardAH/rippled/tree/proof-of-burn](https://github.com/RichardAH/rippled/tree/proof-of-burn)
|
||||
* Executando com um rippled.cfg que tem:
|
||||
* uma stanza **\[xpop_dir]** especificando um diretório de saída para os XPOPs gerados.
|
||||
* uma stanza **\[network_id]** especificando network_id: 1
|
||||
* (em produção, seria a rede 0)
|
||||
* um `validators.txt` contendo:\\
|
||||
|
||||
```
|
||||
[validator_list_sites]
|
||||
https://vl.altnet.rippletest.net
|
||||
[validator_list_keys]
|
||||
ED264807102805220DA0F312E71FC2C69E1552C9C5790F6C25E3729DEB573D5860
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
2. **Cunhagem**
|
||||
|
||||
* Neste cenário de teste, você se conectará diretamente ao Xahau. Você não precisa executar seu próprio nó. No cenário de produção, você precisará executar um nó de Cunhagem, que é apenas um nó padrão para a rede de destino. Isso ocorre porque os nós públicos provavelmente optarão por não aceitar transações Import devido a riscos legais.
|
||||
* Conecte-se a **wss://xahau-test.net**
|
||||
* Ou baixe/execute: [**https://github.com/Xahau/Xahau-Testnet-Docker**](https://github.com/Xahau/Xahau-Testnet-Docker)
|
||||
|
||||
## Exemplo (nodejs)
|
||||
|
||||
Este exemplo cria uma conta na testnet, queima 10 XRP e então importa isso na Testnet do Xahau, usando o xPOP obtido com as ferramentas mencionadas acima.
|
||||
|
||||
```js
|
||||
import { derive, utils, signAndSubmit } from 'xrpl-accountlib'
|
||||
import { TxData } from 'xrpl-txdata'
|
||||
import { XrplClient } from 'xrpl-client'
|
||||
import { xpop, setEndpoints as xpopEndpoints } from 'xpop'
|
||||
import fetch from 'node-fetch'
|
||||
|
||||
// O acima requer:
|
||||
// npm install xrpl-accountlib xrpl-txdata xrpl-client xpop node-fetch
|
||||
|
||||
console.log('Obtendo conta na Testnet do XRPL (faucet)')
|
||||
const faucet = await (await fetch('https://faucet.altnet.rippletest.net/accounts', { method: 'POST' })).json()
|
||||
console.log(' -->', faucet.account.address)
|
||||
const account = derive.familySeed(faucet.account.secret)
|
||||
|
||||
xpopEndpoints((await (await fetch('https://xrpl.ws-stats.com/xpop/list?json=true')).json()).bestguess)
|
||||
|
||||
const nodes = {
|
||||
testnet: [
|
||||
new XrplClient('wss://s.altnet.rippletest.net:51233'),
|
||||
new XrplClient('wss://testnet.xrpl-labs.com'),
|
||||
],
|
||||
xahau: [
|
||||
new XrplClient('wss://xahau-test.net'),
|
||||
]
|
||||
}
|
||||
|
||||
console.log('Aguardando as conexões de rede ficarem prontas')
|
||||
await Promise.all(Object.keys(nodes).map(k => Promise.race(nodes[k].map(n => n.ready()))))
|
||||
|
||||
console.log('Aguardando o financiamento da conta pelo faucet e obtendo valores da rede...')
|
||||
await new Promise(resolve => setTimeout(resolve, 4000)) // Aguarda o fechamento do ledger
|
||||
|
||||
const [
|
||||
testnetParams,
|
||||
xahauParams,
|
||||
] = await Promise.all([
|
||||
Promise.race(nodes.testnet.map(n => utils.accountAndLedgerSequence(n, account))),
|
||||
Promise.race(nodes.xahau.map(n => utils.accountAndLedgerSequence(n, account))),
|
||||
])
|
||||
|
||||
const testnetTx = {
|
||||
...testnetParams.txValues,
|
||||
TransactionType: 'AccountSet',
|
||||
Fee: String(10_000_000),
|
||||
OperationLimit: xahauParams.txValues.NetworkID,
|
||||
NetworkID: undefined, // A Testnet tem NetworkID < 1024, então nenhum deve ser fornecido
|
||||
}
|
||||
|
||||
console.log('Enviando queima...', testnetTx)
|
||||
const testnetSubmitted = await Promise.race(nodes.testnet.map(n => signAndSubmit(testnetTx, n, account)))
|
||||
console.log('Queima enviada para a testnet')
|
||||
console.log(' -->', 'https://testnet.xrpl.org/transactions/' + testnetSubmitted.tx_id)
|
||||
|
||||
console.log('Obtendo dados da transação de queima...')
|
||||
|
||||
const txdata = new TxData(nodes.testnet.map(n => n.getState().server.uri), {
|
||||
AllowNoFullHistory: true,
|
||||
EndpointTimeoutMs: 2_000,
|
||||
OverallTimeoutMs: 10_000,
|
||||
})
|
||||
|
||||
const appliedtx = await txdata.getOne(testnetSubmitted.tx_id)
|
||||
console.log(' -->', 'Queima validada no ledger', appliedtx?.result?.ledger_index)
|
||||
|
||||
console.log('Aguardando ledger fechado antes de buscar o xPOP...')
|
||||
await new Promise(resolve => setTimeout(resolve, 4000)) // Aguarda o fechamento do ledger
|
||||
|
||||
console.log('Buscando xPOP...')
|
||||
|
||||
const Blob = await xpop(testnetSubmitted.tx_id, appliedtx?.result?.ledger_index, 1)
|
||||
|
||||
console.log(' -->', 'xPOP obtido, comprimento hex:', Blob.length)
|
||||
|
||||
const hooksTx = {
|
||||
...xahauParams.txValues,
|
||||
TransactionType: 'Import',
|
||||
Fee: '0',
|
||||
Blob,
|
||||
}
|
||||
|
||||
console.log('Enviando para cunhagem do xPOP...')
|
||||
|
||||
const b2mSubmitted = await Promise.race(nodes.xahau.map(n => signAndSubmit(hooksTx, n, account)))
|
||||
|
||||
console.log(' -->', 'B2M enviado! TX na Testnet do Xahau:')
|
||||
console.log(' -->', 'https://test.xahauexplorer.com/explorer/' + b2mSubmitted?.tx_id)
|
||||
console.log(' -->', b2mSubmitted.response.engine_result, b2mSubmitted.response.engine_result_message)
|
||||
|
||||
// Fechando conexões
|
||||
Object.keys(nodes).map(k => nodes[k].map(n => n.close()))
|
||||
```
|
||||
[Fonte](https://gist.github.com/WietseWind/cd8a7a8c88f218fe7b768f59a665685d)
|
||||
|
||||
## Resumo Técnico do Procedimento B2M
|
||||
|
||||
#### Novo Tipo de Transação: `Import`
|
||||
|
||||
A Testnet do Xahau (_network_id=21338_) introduz um novo tipo de transação chamado _**Import**_, que aceita um XPOP da cadeia testnet do Ripple (_network_id=1_) e fornece uma transferência de valor unidirecional "queima para cunhagem" e sincronização de chaves/contas.
|
||||
|
||||
### Transação de Queima
|
||||
|
||||
Uma _**Transação de Queima**_ é uma transação que queima XRP em uma cadeia XRPL de origem, que seria usada como prova (XPOP) para cunhar em uma cadeia XRPL de destino.
|
||||
|
||||
Os seguintes tipos de transação são suportados:
|
||||
|
||||
* AccountSet
|
||||
* SetRegularKey
|
||||
* SignerListSet.
|
||||
|
||||
<Aside type="caution">
|
||||
Tickets _**não são aceitos**_ em **nenhuma** Transação de Queima e levariam a uma Transação de Queima inválida para cunhagem. Para proteger contra spam, as transações devem ser validadas com um número de sequência real e natural.
|
||||
</Aside>
|
||||
|
||||
Observe que outros tipos de transação não são atualmente suportados e não podem ser usados para cunhar na Testnet do Xahau. (No entanto, isso pode mudar).
|
||||
|
||||
Todos os três tipos de transação podem ser usados para cunhagem. Isso significa que a _**Taxa**_ queimada pela Transação de Queima é subsequentemente cunhada na Testnet do Xahau após um `Import` bem-sucedido.
|
||||
|
||||
Se `SetRegularKey` ou `SignerListSet` for usado, a sincronização de chaves ocorre de acordo com as regras padrão do tipo de transação. Se `AccountSet` for usado, nenhuma sincronização de chaves ocorre na cadeia XRPL de destino (Testnet do Xahau).
|
||||
|
||||
Um campo chamado _**OperationLimit**_ deve estar presente na Transação de Queima para ser o ID de rede da cadeia de destino. Este campo é para prevenir ataques de replay em outras cadeias integradas ao B2M.
|
||||
|
||||
A Transação de Queima pode ser usada para Cunhagem se tiver um código de transação **tesSUCCESS** ou _qualquer_ um dos códigos de transação **tec**. Isso significa que _se_ a taxa foi queimada, a transação pode ser usada para cunhagem. No entanto, a sincronização de chaves _apenas_ ocorre quando o resultado da Transação de Queima foi tesSUCCESS.
|
||||
|
||||
Exemplo de Transação de Queima:
|
||||
|
||||
```json
|
||||
{
|
||||
"TransactionType": "AccountSet",
|
||||
"Fee": 10000000,
|
||||
"OperationLimit": 21338
|
||||
}
|
||||
```
|
||||
|
||||
### Coleta de XPOP
|
||||
|
||||
Antes de enviar a Transação de Queima, certifique-se de que seu Nó de Queima esteja sincronizado com a cadeia testnet (ID de rede: `1`).
|
||||
|
||||
Após verificar o estado do seu Nó de Queima, envie a Transação de Queima assinada para o Nó de Queima.
|
||||
|
||||
O Nó de Queima observa ledgers fechados em busca de transações contendo o campo **OperationLimit** e usa as mensagens de validação coletadas para gerar um XPOP (Prova de Queima). Estes são gravados em um arquivo no diretório especificado na stanza **\[xpop_dir]** no `rippled.cfg` do Nó de Queima.
|
||||
|
||||
Aguarde o fechamento do ledger e, em seguida, navegue pelo xpop_dir em busca do XPOP da Transação de Queima de acordo com seu TXID. O arquivo contém um documento JSON, que é o XPOP que você estará retransmitindo para a cadeia XRPL de destino (HooksV3).
|
||||
|
||||
Pegue o conteúdo bruto deste arquivo e codifique-o como HEX. Isso se tornará o conteúdo do campo \*_Blob_ na transação `Import`.
|
||||
|
||||
### Transação de Cunhagem
|
||||
|
||||
Seu codec binário estará sem os campos necessários para construir a transação `Import` (Cunhagem). Se você estiver usando ripple-binary-codec, pode atualizar seu arquivo `definitions.json` da seguinte forma:
|
||||
|
||||
1. Mude o diretório para `node_modules`
|
||||
2. Execute `find . | grep 'dist/enums/definitions.json'` para localizar o arquivo relevante a ser atualizado
|
||||
3. Conecte-se a **wss://hooks-testnet-v3.xrpl-labs.com**
|
||||
4. Solicitação: `{"command":"server_definitions"}`
|
||||
5. Despeje o conteúdo da chave `"result"` no `definitions.json` do passo 2.
|
||||
|
||||
O tipo de transação `Import` aceita apenas um campo não-comum: _**Blob**_. Este deve conter o XPOP codificado em HEX da fase de Coleta de XPOP.
|
||||
|
||||
* Você pode fazer isso com `cat xpopjsonfile | xxd -p | tr -d '\n'`
|
||||
|
||||
O campo `Account` e o campo `SigningPubKey` (ou array Signers) devem corresponder exatamente entre a Transação de Queima e a Transação de Cunhagem. Os usuários só podem cunhar para a mesma conta da qual queimaram.
|
||||
|
||||
Se o campo `Account` especificar uma conta que ainda não existe na Testnet do Xahau, ela será criada. Nesse caso, use 0 para o campo `Sequence` na Transação de Cunhagem. Se a conta já existir na Testnet do Xahau, use o próximo número de sequência disponível na conta na Testnet do Xahau.
|
||||
|
||||
Exemplo de Import:
|
||||
|
||||
```json
|
||||
{
|
||||
"Account": "<igual ao que estava na Transação de Queima>",
|
||||
"TransactionType": "Import",
|
||||
"Blob": "<XPOP codificado em HEX (maiúsculas)>",
|
||||
"Sequence": 0
|
||||
}
|
||||
```
|
||||
|
||||
IMPORTANTE: **A Transação de Cunhagem deve ser assinada exatamente da mesma forma e pela mesma conta que a Transação de Queima!**
|
||||
|
||||
Codifique e assine a transação adequadamente, produzindo um blob de transação assinada (hex).
|
||||
|
||||
Se você não estiver executando seu próprio nó de Cunhagem:
|
||||
|
||||
* Conecte-se a **wss://xahau-testn.et**
|
||||
* Envie a transação para o nó:
|
||||
|
||||
```json
|
||||
{
|
||||
"command": "submit",
|
||||
"tx_blob": "<TRANSAÇÃO IMPORT CODIFICADA EM HEX>"
|
||||
}
|
||||
```
|
||||
|
||||
Ou, se estiver executando seu próprio nó de Cunhagem:
|
||||
|
||||
* Certifique-se de que o Nó de Cunhagem esteja em execução e sincronizado com o ID de rede 21338.
|
||||
* Use a chamada RPC `submit` para enviar a Transação de Cunhagem.
|
||||
* Você pode fazer isso pela linha de comando usando `./hooksv3d submit <hex aqui>`
|
||||
|
||||
### Considerações
|
||||
|
||||
Se a Conta for criada na Testnet do Xahau, mas o keying para a conta não estiver claro a partir do contexto da Transação de Queima, a Conta será criada em modo blackholed. Ela pode ser re-keyada posteriormente usando qualquer um dos tipos de transação de keying.
|
||||
|
||||
Se a Transação de Queima for `SignerListSet` ou `SetRegularKey`, desde que tenha tido um resultado de transação tesSUCCESS na cadeia XRPL de origem (testnet), essa mesma operação de keying agora é aplicada a essa mesma conta na cadeia XRPL de destino (Testnet do Xahau).
|
||||
|
||||
Durante os testes, contas na Testnet do Xahau _podem_ ser excluídas; no entanto, na cadeia de produção com Hooks habilitados, elas não poderão ser excluídas.
|
||||
|
||||
Contas na Testnet do Xahau têm um campo opcional _**ImportSequence**_ no AccountRoot. Se o `Import` já foi usado nessa conta na Testnet do Xahau, este campo estará presente e será preenchido com o número de sequência da Transação de Queima importada mais recentemente. Isso é para prevenir ataques de replay, mas também significa que você nunca deve enviar seus Burn2Mints fora de sequência; caso contrário, as transações ignoradas nunca serão aceitas para Cunhagem.
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Bibliotecas de Cliente
|
||||
---
|
||||
Essas bibliotecas de cliente simplificam parte do trabalho comum de acesso e processamento de dados do XAH Ledger e os apresentam em um formato que corresponde às convenções nativas de suas respectivas linguagens de programação.
|
||||
|
||||
Para outras linguagens de programação, você pode acessar o XAH Ledger por meio das APIs HTTP.
|
||||
|
||||
<table><thead><tr><th width="172">Linguagem</th><th width="172">Nome da Biblioteca</th><th>Primeiros Passos</th><th>Protocolo</th><th>Código Fonte</th></tr></thead><tbody><tr><td><strong>Python</strong></td><td><code>xahau-py</code></td><td><a href="https://github.com/Xahau/xahau-py">Primeiros Passos</a></td><td>XAH / XRP</td><td><a href="https://github.com/Xahau/xahau-py">Repositório</a></td></tr><tr><td><strong>JavaScript</strong> / <strong>TypeScript</strong></td><td><code>xahau.js</code></td><td><a href="https://github.com/Xahau/xahau.js">Primeiros Passos</a></td><td>XAH / XRP</td><td><a href="https://github.com/Xahau/xahau.js">Repositório</a></td></tr><tr><td><strong>JavaScript</strong> / <strong>TypeScript</strong></td><td><a href="https://www.npmjs.com/package/xrpl-accountlib"><code>xrpl-accountlib</code></a></td><td><a href="https://www.npmjs.com/package/xrpl-accountlib">Primeiros Passos</a><br /><a href="https://github.com/WietseWind/xrpl-accountlib/blob/master/samples/prefill-sign-and-submit.mjs">Exemplo</a></td><td>XAH / XRP</td><td><a href="https://github.com/WietseWind/xrpl-accountlib">Repositório</a></td></tr></tbody></table>
|
||||
|
||||
**Dica:** Para adicionar uma biblioteca de cliente não listada aqui, por favor sugira alterações nesta página!
|
||||
@@ -0,0 +1,16 @@
|
||||
---
|
||||
title: Ferramentas Selecionadas
|
||||
---
|
||||
Essas ferramentas simplificam parte do trabalho comum de acesso e processamento de Hooks.
|
||||
|
||||
| Ferramenta | Link de Referência |
|
||||
| ----------------------- | -------------------------------------------------------------------- |
|
||||
| **Hooks Builder** | [Link do Builder](https://builder.xahau.network/develop) |
|
||||
| **Hooks Toolkit** | [Link do Toolkit](https://hooks-toolkit.com/) |
|
||||
| **Xpop Toolkit** | [Link do Toolkit](https://github.com/Transia-RnD/xpop-toolkit) |
|
||||
| **Hooks Blog** | [Link do Blog](https://dev.to/t/xrplhooks/top/infinity) |
|
||||
| **XFL Tools** | [Link da Ferramenta](https://richardah.github.io/xfl-tools/) |
|
||||
| **Binary Visualizer** | [Link da Ferramenta](https://richardah.github.io/xrpl-binary-visualizer/) |
|
||||
| **Keylet Tools** | [Link da Ferramenta](https://richardah.github.io/xrpl-keylet-tools/) |
|
||||
| **CTID Visualizer** | [Link da Ferramenta](https://transia-rnd.github.io/xrpl-ctid-visualizer/) |
|
||||
| **C Hook Tx Builder** | [Link da Ferramenta](https://transia-rnd.github.io/xrpl-tt-visualizer/) |
|
||||
@@ -0,0 +1,29 @@
|
||||
---
|
||||
title: Truques para Desenvolvedores
|
||||
---
|
||||
## Assinatura Curinga
|
||||
|
||||
Para testar e reproduzir facilmente, use `NetworkID` com o valor `65535` (config: `[network_id]`) para desabilitar a verificação de assinatura.
|
||||
|
||||
Adicionado: [https://github.com/Xahau/xahaud/pull/201](https://github.com/Xahau/xahaud/pull/201)
|
||||
|
||||
## Definições do Servidor
|
||||
|
||||
As definições do servidor podem ser facilmente obtidas a partir dos nós públicos. Essas definições incluem informações de codec binário e outros dados específicos da rede necessários para serialização e desserialização de transações.
|
||||
|
||||
### Mainnet
|
||||
- [`https://xahau.network/server_definitions.json`](https://xahau.network/server_definitions.json)
|
||||
|
||||
### Testnet
|
||||
- [`https://xahau-test.net/server_definitions.json`](https://xahau-test.net/server_definitions.json)
|
||||
|
||||
### JSHooks-Testnet
|
||||
- [`https://jshooks.xahau-test.net/server_definitions.json`](https://jshooks.xahau-test.net/server_definitions.json)
|
||||
|
||||
Essas definições de servidor são essenciais para:
|
||||
- Operações de codec binário
|
||||
- Serialização de transações
|
||||
- Definições de tipos de campo
|
||||
- Constantes específicas da rede
|
||||
|
||||
Você pode usar essas definições em suas aplicações para codificar e decodificar corretamente transações para a rede Xahau.
|
||||
27
src/content/docs/pt-br/docs/features/faucet-and-explorer.mdx
Normal file
27
src/content/docs/pt-br/docs/features/faucet-and-explorer.mdx
Normal file
@@ -0,0 +1,27 @@
|
||||
---
|
||||
title: Faucet & Explorers
|
||||
---
|
||||
O Faucet e os Explorers do Xahau podem ser encontrados aqui:
|
||||
|
||||
## Testnet
|
||||
|
||||
* **Faucet:** [**https://xahau-test.net**](https://xahau-test.net)
|
||||
* Para automatizar o financiamento de contas na testnet, faça um HTTP POST para:\
|
||||
[https://xahau-test.net/accounts](https://xahau-test.net/accounts)\
|
||||
Corpo vazio: nova conta (pré-financiada)\
|
||||
Corpo JSON com a propriedade `destination`: financia a conta `destination` mencionada.
|
||||
* **Explorers:**
|
||||
* **Xahauexplorer:** [**https://test.xahauexplorer.com**](https://test.xahauexplorer.com)
|
||||
* **InFTF:** [**https://explorer.xahau-test.net**](https://explorer.xahau-test.net)
|
||||
* **XRPL.org:** [**https://xahau-testnet.xrpl.org**](https://xahau-testnet.xrpl.org)
|
||||
* **XRPLWin:** [**https://xahau-testnet.xrplwin.com**](https://xahau-testnet.xrplwin.com/)
|
||||
|
||||
## Mainnet
|
||||
|
||||
* **Página Inicial:** [**https://xahau.network**](https://xahau.network/)
|
||||
* **Explorers:**
|
||||
* **Xahauexplorer:** [**https://xahauexplorer.com**](https://xahauexplorer.com/)
|
||||
* **Xahscan:** [**https://xahscan.com/**](https://xahscan.com/)
|
||||
* **InFTF:** [**https://explorer.xahau.network**](https://explorer.xahau.network/)
|
||||
* **XRPL.org:** [**https://xahau.xrpl.org**](https://xahau.xrpl.org)
|
||||
* **XRPLWin:** [**https://xahau.xrplwin.com**](https://xahau.xrplwin.com/)
|
||||
199
src/content/docs/pt-br/docs/features/governance-game.mdx
Normal file
199
src/content/docs/pt-br/docs/features/governance-game.mdx
Normal file
@@ -0,0 +1,199 @@
|
||||
---
|
||||
title: Jogo de Governança
|
||||
description: >-
|
||||
O Jogo de Governança é um mecanismo inovador de governança dentro do
|
||||
ecossistema Xahau para garantir uma abordagem centrada na comunidade para a
|
||||
tomada de decisões.
|
||||
---
|
||||
|
||||
### Visão Geral
|
||||
|
||||
O Jogo de Governança do Xahau permite que até 400 stakeholders participem democraticamente na gestão da rede Xahau por meio do Hook de Governança instalado na Conta Gênesis.
|
||||
|
||||
### Camada 1
|
||||
|
||||
O jogo consiste em uma mesa de "Camada 1" com 20 assentos. Uma conta Xahau (endereço-r) pode preencher cada assento, ou ele pode estar vazio. Quando um assento é preenchido, diz-se que um membro da mesa está sentado ali.
|
||||
|
||||
Para jogar o jogo, os membros da mesa votam. Os votos são sobre um de três tipos de tópicos:
|
||||
|
||||
* Tópicos de Assento
|
||||
* Tópicos de Hook
|
||||
* Tópicos de Recompensa.
|
||||
|
||||
Os tópicos de Assento são S00 a S19 e representam um voto sobre quem (se alguém) está atualmente sentado naquele assento. Um voto de 80% é suficiente para fazer uma mudança. O processo de votação é contínuo, sendo o voto final que cruza o limite que aciona a mudança.
|
||||
|
||||
Os tópicos de Hook são H0 a H9 e representam quais Hooks, incluindo o próprio Hook de Governança, estão instalados na conta da mesa. Esses tópicos requerem 100% dos membros sentados naquela mesa para concordar antes que uma mudança possa ser feita. Isso permite que o Jogo de Governança seja atualizado e que mais funcionalidades da conta Gênesis sejam adicionadas ao longo do tempo.
|
||||
|
||||
Os tópicos de Recompensa são RR e RD, que significam Taxa de Recompensa e Atraso de Recompensa, respectivamente. Esses tópicos também requerem 100% dos membros na mesa para concordar para fazer uma mudança. Esses parâmetros afetam o sistema de AjustesDeSaldo: quanto cada usuário ativo na rede pode reivindicar e com que frequência.
|
||||
|
||||
### Camada 2
|
||||
|
||||
Os membros que preenchem assentos na mesa da Camada 1 são contas Xahau (endereços-r). O jogo de governança é projetado para ser estruturalmente recursivo, de forma que uma dessas contas pode ser ela mesma uma mesa composta por outros 20 assentos. Isso é chamado de mesa da Camada 2, e os assentos são assentos da Camada 2.
|
||||
|
||||
Dentro de uma mesa da Camada 2, os mesmos tópicos de votação de assento e hook existem, com as mesmas regras de votação da mesa da Camada 1. Isso permite que uma mesa governe sua própria composição e os hooks que rodam lá.
|
||||
|
||||
Além desses tópicos, uma mesa da Camada 2 também pode, por votação de 51%, levantar um voto para a mesa da Camada 1. Este é um voto em nome do endereço-r em que a mesa da Camada 2 existe e conta como um único voto na mesa da Camada 1.
|
||||
|
||||
O voto da mesa da Camada 2 pode cair abaixo de 51%, caso em que o voto originalmente levantado para a mesa da Camada 1 **não** é retirado. Apenas um novo voto (diferente) atingindo 51% pode mudar o voto da mesa na Camada 1.
|
||||
|
||||
As mesas da Camada 2 só podem votar em tópicos de Recompensa por meio de um voto levantado para a Camada 1.
|
||||
|
||||
Em resumo, os membros da Camada 2 podem votar em:
|
||||
|
||||
* Assentos e Hooks para sua própria mesa, e
|
||||
* Assentos, Hooks e tópicos de Recompensa para a mesa L1 via o assento da Camada 1 em que sua mesa da Camada 2 reside.
|
||||
|
||||
### Restrições do Jogo
|
||||
|
||||
* Qualquer mesa pode ter pelo menos 2 membros e no máximo 20 membros.
|
||||
* Um único endereço-r pode ocupar apenas um assento em uma determinada mesa, mas pode ocupar um assento em cada uma de muitas mesas diferentes.
|
||||
* O Jogo de Governança não foi projetado para recursão além de duas camadas. Não há inviabilidade técnica em implementar uma mesa da Camada 3, mas o Hook de Governança atual não a suporta.
|
||||
|
||||
### Recompensas de Validadores
|
||||
|
||||
As recompensas de validadores são um incentivo para executar um validador na rede. As recompensas são geradas pela rede e concedidas à interseção de membros da Camada 1 e validadores UNL ativos. Para se qualificar para recompensas de validadores dentro de um dado bloco de 256 ledgers, o seguinte deve ser verdadeiro:
|
||||
|
||||
* O validador está na UNL do Xahau.
|
||||
* O validador valida com sucesso aos olhos de outros validadores UNL.
|
||||
* Quando a chave pública mestre do validador é convertida em um endereço-r, essa conta está na Mesa L1.
|
||||
|
||||
As recompensas são ad-hoc e baseadas nos Ajustes de Saldo dos usuários do Xahau. Quando um usuário realiza um Ajuste de Saldo, uma quantia igual ao seu ajuste dividido por 20 é enviada ao endereço-r de cada um dos validadores ativos que atendem aos critérios acima.
|
||||
|
||||
## Especificação Técnica
|
||||
|
||||
O Hook de Governança é instalado na conta gênesis pelo amendment XahauGenesis vários ledgers após o ledger 1 em uma nova rede. Esta é a mesa L1. Para criar uma mesa L2, instale o Hook em uma conta diferente e, em seguida, sente essa conta na mesa L1.
|
||||
|
||||
### Parâmetros do Hook de Governança
|
||||
|
||||
Quando o Hook de Governança é instalado, ele é instalado com um conjunto de HookParameters. Eles especificam a composição inicial da mesa.
|
||||
|
||||
Cada HookParameter tem um nome de 3 bytes composto por 3 caracteres Ascii ou 2 caracteres Ascii e um identificador conforme abaixo. LE = Little Endian.
|
||||
|
||||
```
|
||||
Nome do Parâmetro: {'I', 'R', 'R'}
|
||||
Valor do Parâmetro: Taxa de Recompensa Inicial <8 bytes XFL entre 0 e 1, LE>
|
||||
Nome do Parâmetro: {'I', 'R', 'D'}
|
||||
Valor do Parâmetro: Atraso de Recompensa Inicial <8 bytes LE XFL em segundos entre recompensas>
|
||||
Nome do Parâmetro: {'I', 'M', 'C'}
|
||||
Valor do Parâmetro: Contagem de Membros Inicial <1 byte>
|
||||
Nome do Parâmetro: {'I', 'S', 0x00}
|
||||
Valor do Parâmetro: ID de Conta de 20 bytes do membro do assento #0 inicial.
|
||||
Nome do Parâmetro: {'I', 'S', 0x01}
|
||||
Valor do Parâmetro: ID de Conta de 20 bytes do membro do assento #1 inicial.
|
||||
... etc ... até no máximo Assento 19.
|
||||
|
||||
```
|
||||
|
||||
Para iniciar o jogo, uma transação Invoke deve ser enviada para o Hook. Ela pode ser enviada por qualquer conta. Nenhum Blob ou HookParameters são necessários. Esta transação Invoke aciona o Hook pela primeira vez e o solicita a criar entradas de estado para cada assento inicial, taxa de recompensa e atraso de recompensa.
|
||||
|
||||
### Estado do Hook de Governança
|
||||
|
||||
O Hook State do Hook de Governança é armazenado no namespace zero: `0000000000000000000000000000000000000000000000000000000000000000.`
|
||||
|
||||
Existem vários tipos de entrada de estado. O primeiro são as chamadas chaves de membro diretas e inversas. Elas mapeiam cada número de assento para o membro que está sentado lá e cada membro para o assento em que está sentado.
|
||||
|
||||
```
|
||||
Chave: 0x0000000000000000000000000000000000000000000000000000000000000005
|
||||
Val: <ID de Conta de 20 bytes do membro no assento 5 ou todos 0s ou ausente.>
|
||||
|
||||
Chave: <ID de Conta de 20 bytes do membro no assento 3>
|
||||
Val: 0x03
|
||||
```
|
||||
|
||||
Em seguida, há algumas entradas de estado singleton. Contagem de Membros, Taxa de Recompensa e Atraso de Recompensa, respectivamente:
|
||||
|
||||
```
|
||||
Chave em Ascii: MC
|
||||
Chave: 0x0000000000000000000000000000000000000000000000000000000000004D43
|
||||
Val: <1 byte de contagem de membros (quantos assentos estão ocupados)>
|
||||
|
||||
Chave em Ascii: RR
|
||||
Chave: 0x0000000000000000000000000000000000000000000000000000000000005252
|
||||
Val: <8 bytes LE XFL taxa de recompensa (entre 0 e 1 (1 sendo 100%))>
|
||||
|
||||
Chave em Ascii: RD
|
||||
Chave: 0x0000000000000000000000000000000000000000000000000000000000005244
|
||||
Val: <8 bytes LE XFL atraso de recompensa em segundos>
|
||||
```
|
||||
|
||||
Por fim, votos e contadores de votos também são armazenados no estado do Hook. Quando um voto é emitido por um assento, ele é registrado no estado do Hook da seguinte forma:
|
||||
|
||||
```
|
||||
A chave de voto tem 32 bytes composta por:
|
||||
'V' (0x56) - voto
|
||||
'H' (0x48) ou 'R' (0x52) ou 'S' (0x53) - tipo de tópico
|
||||
'R' (0x52) ou 'D' (0x44) ou 0 (0x00) a 19 (0x13) - detalhe do tópico
|
||||
1 (0x01) ou 2 (0x02) - camada alvo para este voto
|
||||
0x00 00 00 00 00 00 00 00 - 8 bytes de preenchimento
|
||||
ID de Conta de 20 bytes - o votante
|
||||
Dados do voto:
|
||||
ID de Conta de 20 bytes ou XFL de 8 bytes
|
||||
```
|
||||
|
||||
Quando um voto é emitido, ele incrementa uma entrada de estado contador de votos. Este contador acompanha quantos votos há atualmente para este par tópico-dados e permite que o Hook execute o voto quando a votação ultrapassa o limite necessário. O estado do contador é o seguinte:
|
||||
|
||||
```
|
||||
A chave do contador tem 32 bytes composta por:
|
||||
'C' (0x43) - contagem
|
||||
'H' (0x48) ou 'R' (0x52) ou 'S' (0x53) - tipo de tópico
|
||||
'R' (0x52) ou 'D' (0x44) ou 0 (0x00) a 19 (0x13) - detalhe do tópico
|
||||
1 (0x01) ou 2 (0x02) - camada alvo para este voto
|
||||
0s para preenchimento
|
||||
dados do voto ou dados do voto truncados à esquerda
|
||||
```
|
||||
|
||||
### Transações do Hook de Governança
|
||||
|
||||
O Hook de Governança é interagido pelos seus membros usando transações ttINVOKE. Além disso, o Hook também pode emitir suas próprias transações ttINVOKE se for uma mesa L2 levantando um voto para a mesa L1.
|
||||
|
||||
Uma transação de voto contém um array HookParameters no nível superior da transação:
|
||||
|
||||
```
|
||||
{
|
||||
Account: <conta do membro>,
|
||||
TransactionType: Invoke,
|
||||
NetworkID: 21337,
|
||||
Destination: <conta da mesa>,
|
||||
HookParameters:
|
||||
[
|
||||
{
|
||||
HookParameter:
|
||||
{
|
||||
HookParameterName: "4C", // L - a camada alvo
|
||||
HookParameterValue: "01", // 01 para mesa L1, 02 para mesa L2
|
||||
// nota: esta é a mesa para a qual o voto é
|
||||
// destinado, não a mesa em que você está
|
||||
// ou seja, para uma mesa L2 você pode votar
|
||||
// em sua própria composição ou na da L1
|
||||
}
|
||||
},
|
||||
{
|
||||
HookParameter:
|
||||
{
|
||||
HookParameterName: "54", // T - tipo de tópico
|
||||
HookParameterValue: "4801", // H [0x00-0x09] ou
|
||||
// S [0x00-0x13] ou
|
||||
// RR ou RD
|
||||
}
|
||||
},
|
||||
{
|
||||
HookParameter:
|
||||
{
|
||||
HookParameterName: "56", // V - dados do voto
|
||||
HookParameterValue: <32 ou 20 ou 8 bytes de dados do voto>
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
### Limpar um Voto
|
||||
|
||||
Não há como "excluir um voto" em si. Você pode mudar seu voto de volta para refletir a posição atual. 
|
||||
|
||||
Portanto, por exemplo, se ninguém está no assento 8 e você votou para que a conta A se sente lá, e então muda de ideia, você pode fazer um voto para vacar o assento 8 (mesmo que já esteja vago), alinhando assim seu voto com o estado atual do assento. 
|
||||
|
||||
Para fazer isso, você vota com todos os 0s nos dados do voto, no mesmo comprimento que o tópico de voto normalmente requer. Portanto, para um voto de assento, isso equivale a 20 bytes de 0.
|
||||
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
---
|
||||
title: Métodos da API Administrativa
|
||||
---
|
||||
Esses métodos são destinados exclusivamente ao pessoal de confiança responsável pela manutenção das operações do servidor xahaud.
|
||||
|
||||
### Métodos de Geração de Chaves
|
||||
|
||||
|
||||
|
||||
| Método | Descrição |
|
||||
| ------------------ | --------------------------------------------------------------------------------------------------------------------------- |
|
||||
| validation_create | Gera um par de chaves formatado para nós xahaud. (Validadores devem usar tokens em vez de chaves geradas por este método.) |
|
||||
| wallet_propose | Gera chaves para uma nova conta. |
|
||||
|
||||
### Métodos de Registro e Gerenciamento de Dados
|
||||
|
||||
|
||||
|
||||
| Método | Descrição |
|
||||
| --------------- | ---------------------------------------------------------------------- |
|
||||
| can_delete | Habilita a exclusão online de ledgers até um ledger especificado. |
|
||||
| download_shard | Baixa um fragmento específico do histórico de ledgers. |
|
||||
| ledger_cleaner | Configura o limpador de ledger para detectar e resolver dados corrompidos. |
|
||||
| ledger_request | Consulta um servidor par para uma versão específica do ledger. |
|
||||
| log_level | Visualiza ou altera os níveis de verbosidade do log. |
|
||||
| logrotate | Reabre o arquivo de log. |
|
||||
| node_to_shard | Transfere dados do armazenamento de ledger para o armazenamento de fragmentos. |
|
||||
|
||||
### Métodos de Controle do Servidor
|
||||
|
||||
| Método | Descrição |
|
||||
| -------------- | ------------------------------------------------------------ |
|
||||
| ledger_accept | Fecha e avança o ledger no modo autônomo. |
|
||||
| stop | Desliga o servidor xahaud. |
|
||||
|
||||
### Métodos de Assinatura
|
||||
|
||||
| Método | Descrição |
|
||||
| --------- | ---------------------------------------------- |
|
||||
| sign | Assina criptograficamente uma transação. |
|
||||
| sign_for | Contribui para uma assinatura múltipla. |
|
||||
|
||||
### Métodos de Gerenciamento de Pares
|
||||
|
||||
| Método | Descrição |
|
||||
| ------------------------ | ------------------------------------------------------------- |
|
||||
| connect | Força o servidor a se conectar a um par específico. |
|
||||
| peer_reservations_add | Adiciona ou atualiza uma vaga reservada para um par específico. |
|
||||
| peer_reservations_del | Remove uma vaga reservada para um par específico. |
|
||||
| peer_reservations_list | Visualiza todas as vagas de pares reservadas. |
|
||||
| peers | Recupera informações sobre pares conectados. |
|
||||
|
||||
### Métodos de Status/Depuração
|
||||
|
||||
|
||||
|
||||
| Método | Descrição |
|
||||
| ---------------------- | ------------------------------------------------------------------ |
|
||||
| consensus_info | Visualiza o estado atual do processo de consenso. |
|
||||
| feature | Recupera informações sobre emendas de protocolo. |
|
||||
| fetch_info | Verifica o status de sincronização do servidor com a rede. |
|
||||
| get_counts | Visualiza estatísticas sobre os internos do servidor e uso de memória. |
|
||||
| manifest | Recupera detalhes de chave pública para um validador conhecido. |
|
||||
| print | Acessa informações sobre subsistemas internos. |
|
||||
| validator_info | Obtém os detalhes de configuração do validador do servidor. |
|
||||
| validator_list_sites | Visualiza sites que publicam listas de validadores. |
|
||||
| validators | Recupera informações sobre os validadores atuais. |
|
||||
@@ -0,0 +1,16 @@
|
||||
---
|
||||
title: Considerações
|
||||
---
|
||||
## Marcadores
|
||||
|
||||
Alguns métodos retornam mais dados do que cabem eficientemente em uma única resposta. Quando os resultados excedem o limite de resposta, um campo `marker` é incluído na resposta. Este campo permite que você recupere páginas adicionais de dados por meio de solicitações subsequentes. Para continuar buscando dados, inclua o valor `marker` da resposta anterior em sua próxima solicitação. Se uma resposta não incluir um `marker`, significa que você chegou ao final do conjunto de dados.
|
||||
|
||||
O formato do campo `marker` é intencionalmente não especificado. Cada servidor pode definir o `marker` conforme necessário, o que significa que pode ser uma string, um objeto aninhado ou outro tipo. O formato do `marker` pode variar entre servidores e até entre métodos no mesmo servidor. Cada `marker` é temporário e pode se tornar inválido após aproximadamente 10 minutos.
|
||||
|
||||
## Limite de Taxa
|
||||
|
||||
O servidor `xahaud` impõe limites de taxa em clientes de API que usam APIs públicas para evitar solicitações excessivas. O limite de taxa é aplicado com base no endereço IP do cliente, o que significa que múltiplos clientes compartilhando uma [tradução de endereço de rede (NAT)](https://en.wikipedia.org/wiki/Network_address_translation) compartilharão o mesmo limite de taxa associado ao seu IP público.
|
||||
|
||||
Quando um cliente está se aproximando do limite de taxa, o servidor inclui um campo `"warning": "load"` no nível superior de uma resposta de API. Este aviso não aparece em todas as respostas, mas pode ser enviado várias vezes antes de o servidor desconectar o cliente. Clientes conectados como administrador estão isentos de limitação de taxa.
|
||||
|
||||
Se um cliente exceder o limite de taxa, o servidor desconecta o cliente e bloqueia temporariamente novas solicitações daquele endereço IP. As APIs WebSocket e JSON-RPC lidam com desconexões de forma diferente, conforme descrito abaixo.
|
||||
@@ -0,0 +1,89 @@
|
||||
---
|
||||
title: Métodos da API Pública
|
||||
---
|
||||
Interaja diretamente com um servidor xahaud usando métodos de API pública. Esses métodos não são necessariamente destinados ao uso público geral, mas são acessíveis a qualquer cliente conectado ao servidor. 
|
||||
|
||||
### Métodos de Conta
|
||||
|
||||
|
||||
|
||||
| Método | Descrição |
|
||||
| ------------------- | -------------------------------------------------------------------------- |
|
||||
| account_channels | Lista canais de pagamento onde a conta é a origem do canal. |
|
||||
| account_currencies | Lista moedas que a conta pode enviar ou receber. |
|
||||
| account_info | Recupera informações básicas sobre uma conta. |
|
||||
| account_lines | Acessa informações de linha de confiança para uma conta. |
|
||||
| account_objects | Recupera todos os objetos do ledger pertencentes a uma conta. |
|
||||
| account_offers | Visualiza as ofertas de câmbio de moeda de uma conta. |
|
||||
| account_tx | Recupera o histórico de transações de uma conta. |
|
||||
| gateway_balances | Calcula os valores totais emitidos para uma conta. |
|
||||
| noripple_check | Sugere alterações para as configurações Default Ripple e No Ripple de uma conta. |
|
||||
|
||||
### Métodos de Ledger
|
||||
|
||||
|
||||
|
||||
| Método | Descrição |
|
||||
| --------------- | ------------------------------------------------------ |
|
||||
| ledger | Obtém informações sobre uma versão específica do ledger. |
|
||||
| ledger_closed | Recupera a versão de ledger fechada mais recentemente. |
|
||||
| ledger_current | Recupera a versão atual do ledger em funcionamento. |
|
||||
| ledger_data | Acessa o conteúdo bruto do ledger. |
|
||||
| ledger_entry | Recupera um elemento específico de uma versão do ledger. |
|
||||
|
||||
### Métodos de Transação
|
||||
|
||||
|
||||
|
||||
| Método | Descrição |
|
||||
| ------------------- | -------------------------------------------------------------- |
|
||||
| submit | Envia uma transação para a rede. |
|
||||
| submit_multisigned | Envia uma transação com múltiplas assinaturas. |
|
||||
| transaction_entry | Recupera detalhes sobre uma transação em um ledger específico. |
|
||||
| tx | Recupera informações de transação em todos os ledgers. |
|
||||
| sign | (Admin) Assina criptograficamente uma transação. |
|
||||
| sign_for | (Admin) Contribui para uma assinatura múltipla. |
|
||||
|
||||
### Métodos de Livro de Ofertas
|
||||
|
||||
| Método | Descrição |
|
||||
| ------------------- | ------------------------------------------------------------------ |
|
||||
| book_offers | Visualiza ofertas para troca de duas moedas. |
|
||||
| deposit_authorized | Verifica se uma conta pode enviar pagamentos diretamente para outra. |
|
||||
|
||||
### Métodos de Canal de Pagamento
|
||||
|
||||
|
||||
|
||||
| Método | Descrição |
|
||||
| ------------------ | -------------------------------------------------- |
|
||||
| channel_authorize | Assina uma reivindicação para um canal de pagamento. |
|
||||
| channel_verify | Verifica a assinatura de uma reivindicação de canal de pagamento. |
|
||||
|
||||
### Métodos de Assinatura
|
||||
|
||||
|
||||
|
||||
| Método | Descrição |
|
||||
| ----------- | -------------------------------------- |
|
||||
| subscribe | Escuta atualizações sobre um assunto. |
|
||||
| unsubscribe | Para de receber atualizações. |
|
||||
|
||||
### Métodos de Informações do Servidor
|
||||
|
||||
| Método | Descrição |
|
||||
| ------------- | ------------------------------------------------------ |
|
||||
| fee | Recupera informações sobre custos de transação. |
|
||||
| server_info | Obtém o status do servidor em formato legível por humanos. |
|
||||
| server_state | Obtém o status do servidor em formato legível por máquina. |
|
||||
| manifest | Recupera detalhes de chave pública para um validador. |
|
||||
|
||||
### Métodos Utilitários
|
||||
|
||||
|
||||
|
||||
| Método | Descrição |
|
||||
| ------ | ------------------------------------------------------------------------------ |
|
||||
| json | Proxy para executar comandos com parâmetros JSON. _(Somente linha de comando.)_ |
|
||||
| ping | Verifica a conectividade com o servidor. |
|
||||
| random | Gera números aleatórios. |
|
||||
@@ -0,0 +1,63 @@
|
||||
---
|
||||
title: Guia de Formatação de Requisições
|
||||
---
|
||||
### Servidores Públicos
|
||||
|
||||
* wss://xahau.network ou https://xahau.network (Mainnet)
|
||||
* wss://xahau-test.net ou https://xahau-test.net (Testnet)
|
||||
|
||||
### Exemplos de Requisições
|
||||
|
||||
Para enviar uma requisição de exemplo para a API, use os seguintes comandos.
|
||||
|
||||
### Websocket
|
||||
|
||||
```
|
||||
{
|
||||
"id": 3,
|
||||
"command": "account_info",
|
||||
"account": "rhBDFMmr3jSjgsWMqBAYaATLy3PuXy395y",
|
||||
"strict": true,
|
||||
"ledger_index": "validated",
|
||||
"api_version": 1
|
||||
}
|
||||
```
|
||||
|
||||
### Estrutura de Requisição WebSocket
|
||||
|
||||
Após estabelecer uma conexão WebSocket com o servidor `xahaud`, você pode enviar comandos como objetos JSON com estes campos:
|
||||
|
||||
<table><thead><tr><th>Campo</th><th width="220">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>command</td><td>String</td><td>O nome do método da API</td></tr><tr><td>id</td><td>(Múltiplo)</td><td><em>(Opcional)</em> Identificador único para a requisição.</td></tr><tr><td>api_version</td><td>Número</td><td><em>(Opcional)</em> Especifica a versão da API.</td></tr></tbody></table>
|
||||
|
||||
### JSON-RPC
|
||||
|
||||
```
|
||||
POST https://xahau.network/
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"method": "account_info",
|
||||
"params": [
|
||||
{
|
||||
"account": "rhBDFMmr3jSjgsWMqBAYaATLy3PuXy395y",
|
||||
"strict": true,
|
||||
"ledger_index": "validated",
|
||||
"api_version": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Estrutura de Requisição JSON-RPC
|
||||
|
||||
<table><thead><tr><th>Campo</th><th width="220">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>method</td><td>String</td><td>O nome do método da API</td></tr><tr><td>params</td><td>Array</td><td><em>(Opcional)</em> Um array de um item contendo um objeto JSON com os parâmetros do método.</td></tr></tbody></table>
|
||||
|
||||
### Linha de Comando
|
||||
|
||||
```
|
||||
xahaud account_info rhBDFMmr3jSjgsWMqBAYaATLy3PuXy395y validated strict
|
||||
```
|
||||
|
||||
### Estrutura de Requisição por Linha de Comando
|
||||
|
||||
<table><thead><tr><th>Campo</th><th width="220">Descrição</th></tr></thead><tbody><tr><td>xahaud</td><td>Inicia a chamada ao serviço xahaud</td></tr><tr><td>method</td><td>O nome do método da API</td></tr><tr><td>params</td><td>(Opcional)</td></tr></tbody></table>
|
||||
@@ -0,0 +1,29 @@
|
||||
---
|
||||
title: Guia de Formatação de Respostas
|
||||
---
|
||||
As respostas são estruturadas de forma diferente dependendo se a requisição é feita por meio das interfaces WebSocket, JSON-RPC ou Linha de Comando. As interfaces JSON-RPC e Linha de Comando compartilham o mesmo formato, pois a interface de Linha de Comando usa JSON-RPC internamente.
|
||||
|
||||
### Campos
|
||||
|
||||
| Campo | Tipo | Descrição |
|
||||
| ------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| id | (Varia) | (Para WebSocket) O ID da requisição original. |
|
||||
| status | String | (Para WebSocket) Indica `success` quando a requisição foi recebida e processada corretamente. |
|
||||
| result.status | String | (Para JSON-RPC e Linha de Comando) Indica `success` quando a requisição foi processada com sucesso. |
|
||||
| type | String | (Para WebSocket) O valor `response` é usado para respostas diretas a requisições de API. Notificações assíncronas usam outros valores, como `ledgerClosed` ou `transaction`. |
|
||||
| result | Objeto | Contém o resultado da consulta, com conteúdo que varia por comando. |
|
||||
| warning | String | _(Opcional)_ Se presente, o valor é `load`, indicando que o cliente está se aproximando do limite de taxa onde o servidor pode desconectar. |
|
||||
| warnings | Array | _(Opcional)_ Uma lista de **Objetos de Aviso** com avisos importantes do servidor. Para mais detalhes, consulte Avisos de API. |
|
||||
| forwarded | Boolean | _(Opcional)_ `true` indica que a requisição foi encaminhada de um servidor em Modo de Relatório para um servidor P2P para atender a requisição. O padrão é `false`. |
|
||||
|
||||
Avisos de API
|
||||
|
||||
Quando uma resposta contém um array `warnings`, cada entrada representa um aviso específico do servidor. Cada **Objeto de Aviso** inclui os seguintes campos:
|
||||
|
||||
|
||||
|
||||
| Campo | Tipo | Descrição |
|
||||
| ------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| id | Número | Um código numérico único que identifica esta mensagem de aviso. |
|
||||
| message | String | Uma explicação legível por humanos do aviso. Evite escrever código que dependa do conteúdo deste campo; use o `id` (e `details`, se disponível) para interpretar o aviso. |
|
||||
| details | Objeto | _(Opcional)_ Contexto adicional sobre o aviso. O conteúdo varia por tipo de aviso. |
|
||||
@@ -0,0 +1,44 @@
|
||||
---
|
||||
title: Gerenciamento de Conta
|
||||
---
|
||||
import { LinkCard } from '@astrojs/starlight/components';
|
||||
|
||||
Os recursos de Gerenciamento de Conta na rede Xahau são um componente crucial para que os usuários gerenciem suas contas de forma eficaz.
|
||||
|
||||
Isso inclui vários tipos de transação que permitem aos usuários realizar diversas operações em suas contas.
|
||||
|
||||
### Tipos de Transação
|
||||
|
||||
#### AccountSet
|
||||
|
||||
O tipo de transação `AccountSet` permite que os usuários modifiquem as propriedades de suas contas. Isso inclui configurações como taxa de transferência, flags de conta e muito mais.
|
||||
|
||||
<LinkCard title="AccountSet" href="/pt-br/docs/protocol-reference/transactions/transaction-types/accountset" />
|
||||
|
||||
#### AccountDelete
|
||||
|
||||
O tipo de transação `AccountDelete` permite que os usuários excluam suas contas da rede Xahau. Esta operação é irreversível e deve ser usada com cautela.
|
||||
|
||||
<LinkCard title="AccountDelete" href="/pt-br/docs/protocol-reference/transactions/transaction-types/accountdelete" />
|
||||
|
||||
#### SetRegularKey
|
||||
|
||||
O tipo de transação `SetRegularKey` permite que os usuários definam um par de chaves regular para sua conta. Este par de chaves pode ser usado como alternativa ao par de chaves mestre para assinar transações.
|
||||
|
||||
<LinkCard title="SetRegularKey" href="/pt-br/docs/protocol-reference/transactions/transaction-types/setregularkey" />
|
||||
|
||||
#### SignerListSet
|
||||
|
||||
O tipo de transação `SignerListSet` permite que os usuários definam uma lista de signatários para sua conta. Isso é particularmente útil para contas com múltiplas assinaturas, onde múltiplas partes precisam aprovar as transações.
|
||||
|
||||
<LinkCard title="SignerListSet" href="/pt-br/docs/protocol-reference/transactions/transaction-types/signerlistset" />
|
||||
|
||||
#### Import
|
||||
|
||||
O tipo de transação `Import` é usado para importar transações de outras redes. Esse recurso é especialmente útil para emissores que precisam importar transações para seus detentores de ativos. Recomenda-se configurar as chaves de suas contas antes de tentar importar transações.
|
||||
|
||||
Observe que o processo de importação para o emissor envolve tipos de transação específicos e requer configuração cuidadosa. Sempre certifique-se de que os hooks estejam configurados corretamente e que as transações sejam válidas para as operações pretendidas.
|
||||
|
||||
<LinkCard title="Import" href="/pt-br/docs/protocol-reference/transactions/transaction-types/import" />
|
||||
|
||||
Esses tipos de transação fornecem aos usuários um conjunto abrangente de ferramentas para gerenciar suas contas na rede Xahau. Como em todas as operações, os usuários devem garantir que compreendem as implicações de cada tipo de transação antes de usá-los.
|
||||
@@ -0,0 +1,20 @@
|
||||
---
|
||||
title: Recompensas de Saldo
|
||||
---
|
||||
import { LinkCard } from '@astrojs/starlight/components';
|
||||
|
||||
O recurso de Recompensas de Saldo é um aspecto único da rede Xahau que permite aos usuários acumular e reivindicar recompensas com base no saldo de sua conta. Esse recurso é implementado por meio de uma combinação de código nativo (Emenda BalanceRewards) e código de hook (Hook de Recompensa da Conta Gênesis).
|
||||
|
||||
### Tipos de Transação
|
||||
|
||||
#### ClaimReward
|
||||
|
||||
Uma transação `ClaimReward` permite que uma conta reivindique as recompensas acumuladas. As recompensas podem ser reivindicadas pelo proprietário da conta ou por um emissor especificado. A conta também pode optar por não receber recompensas definindo o campo Flags como 1.
|
||||
|
||||
<LinkCard title="ClaimReward" href="/pt-br/docs/protocol-reference/transactions/transaction-types/claimreward" />
|
||||
|
||||
#### GenesisMint
|
||||
|
||||
O tipo de transação `GenesisMint` também está associado ao recurso de Recompensas de Saldo. Esta é uma transação Emitida que é executada por meio do Hook de Recompensa toda vez que um usuário reivindica recompensas de saldo.
|
||||
|
||||
<LinkCard title="GenesisMint - (Txn Emitida)" href="/pt-br/docs/protocol-reference/transactions/transaction-types/genesismint-emitted-txn" />
|
||||
@@ -0,0 +1,26 @@
|
||||
---
|
||||
title: Cheque
|
||||
---
|
||||
import { LinkCard } from '@astrojs/starlight/components';
|
||||
|
||||
O recurso Cheque na rede Xahau é um sistema de pagamento diferido que permite a criação, cancelamento e compensação de cheques dentro do ledger. Esse recurso é projetado para facilitar transações seguras e eficientes entre partes.
|
||||
|
||||
### Tipos de Transação
|
||||
|
||||
#### CheckCreate
|
||||
|
||||
A transação `CheckCreate` é usada para criar um objeto Cheque no ledger. Isso representa um pagamento diferido que pode ser compensado pelo destinatário pretendido.
|
||||
|
||||
<LinkCard title="CheckCreate" href="/pt-br/docs/protocol-reference/transactions/transaction-types/checkcreate" />
|
||||
|
||||
#### CheckCancel
|
||||
|
||||
A transação `CheckCancel` é usada para cancelar um Cheque que foi criado mas ainda não compensado. Isso permite que o remetente interrompa o processamento do pagamento, se necessário.
|
||||
|
||||
<LinkCard title="CheckCancel" href="/pt-br/docs/protocol-reference/transactions/transaction-types/checkcancel" />
|
||||
|
||||
#### CheckCash
|
||||
|
||||
A transação `CheckCash` é usada para compensar um Cheque que foi criado. Isso permite que o destinatário receba os fundos que foram diferidos.
|
||||
|
||||
<LinkCard title="CheckCash" href="/pt-br/docs/protocol-reference/transactions/transaction-types/checkcash" />
|
||||
@@ -0,0 +1,28 @@
|
||||
---
|
||||
title: Escrow
|
||||
---
|
||||
import { LinkCard } from '@astrojs/starlight/components';
|
||||
|
||||
O recurso Escrow é uma parte crucial da rede Xahau. Ele fornece um método seguro e sem necessidade de confiança para transações entre partes. O recurso Escrow garante que os ativos envolvidos em uma transação sejam mantidos em segurança até que todas as condições da transação sejam atendidas.
|
||||
|
||||
### Tipos de Transação
|
||||
|
||||
O recurso Escrow inclui três tipos de transação:
|
||||
|
||||
#### EscrowCreate
|
||||
|
||||
A transação `EscrowCreate` é usada para criar um novo acordo de escrow. Esta transação especifica os termos do escrow, incluindo as partes envolvidas, os ativos a serem mantidos em escrow e as condições sob as quais os ativos serão liberados.
|
||||
|
||||
<LinkCard title="EscrowCreate" href="/pt-br/docs/protocol-reference/transactions/transaction-types/escrowcreate" />
|
||||
|
||||
#### EscrowFinish
|
||||
|
||||
A transação `EscrowFinish` é usada para concluir um acordo de escrow. Esta transação é executada quando todas as condições do escrow são atendidas. Após a execução, os ativos mantidos em escrow são liberados para a parte apropriada.
|
||||
|
||||
<LinkCard title="EscrowFinish" href="/pt-br/docs/protocol-reference/transactions/transaction-types/escrowfinish" />
|
||||
|
||||
#### EscrowCancel
|
||||
|
||||
A transação `EscrowCancel` é usada para cancelar um acordo de escrow. Esta transação pode ser executada se as condições do escrow não forem atendidas dentro de um prazo especificado. Após o cancelamento, os ativos mantidos em escrow são devolvidos à parte que iniciou o escrow.
|
||||
|
||||
<LinkCard title="EscrowCancel" href="/pt-br/docs/protocol-reference/transactions/transaction-types/escrowcancel" />
|
||||
@@ -0,0 +1,22 @@
|
||||
---
|
||||
title: Hooks
|
||||
---
|
||||
import { LinkCard } from '@astrojs/starlight/components';
|
||||
|
||||
Os Hooks são um recurso poderoso da rede XRPL, fornecendo funcionalidade robusta de contratos inteligentes. São módulos WebAssembly pequenos e eficientes projetados especificamente para o XRPL, e podem ser referidos como Contratos Inteligentes para o Protocolo XRP Ledger. Os Hooks podem ser escritos em qualquer linguagem compilável com WebAssembly, permitindo que uma ampla gama de lógicas de negócios e conceitos de contratos inteligentes seja implementada.
|
||||
|
||||
### Tipos de Transação
|
||||
|
||||
O recurso Hooks inclui dois tipos de transação:
|
||||
|
||||
**SetHook**
|
||||
|
||||
Este tipo de transação é usado para configurar um hook em uma conta.
|
||||
|
||||
<LinkCard title="SetHook" href="/pt-br/docs/protocol-reference/transactions/transaction-types/sethook" />
|
||||
|
||||
**Invoke**
|
||||
|
||||
Este tipo de transação é usado para chamar ou invocar a funcionalidade de um hook.
|
||||
|
||||
<LinkCard title="Invoke" href="/pt-br/docs/protocol-reference/transactions/transaction-types/invoke" />
|
||||
@@ -0,0 +1,20 @@
|
||||
---
|
||||
title: Oferta
|
||||
---
|
||||
import { LinkCard } from '@astrojs/starlight/components';
|
||||
|
||||
O recurso Oferta na rede Xahau é um componente crucial do sistema de câmbio descentralizado. Ele permite que os usuários criem e cancelem ofertas, facilitando um ambiente de negociação dinâmico e responsivo.
|
||||
|
||||
### Tipos de Transação
|
||||
|
||||
#### OfferCreate
|
||||
|
||||
A transação `OfferCreate` é usada para colocar uma oferta na exchange descentralizada.
|
||||
|
||||
<LinkCard title="OfferCreate" href="/pt-br/docs/protocol-reference/transactions/transaction-types/offercreate" />
|
||||
|
||||
#### OfferCancel
|
||||
|
||||
A transação `OfferCancel` é usada para cancelar uma oferta existente. A documentação para este tipo de transação é referenciada na Documentação Xahau, mas não foi fornecida no contexto dado.
|
||||
|
||||
<LinkCard title="OfferCancel" href="/pt-br/docs/protocol-reference/transactions/transaction-types/offercancel" />
|
||||
@@ -0,0 +1,46 @@
|
||||
---
|
||||
title: Pagamentos
|
||||
---
|
||||
import { LinkCard } from '@astrojs/starlight/components';
|
||||
|
||||
O recurso Pagamentos na rede Xahau é um componente crucial que permite a transferência de ativos e fundos dentro da rede. Esse recurso é projetado para facilitar transações contínuas, garantindo uma operação suave e eficiente da rede.
|
||||
|
||||
### Tipos de Transação
|
||||
|
||||
O recurso Pagamentos compreende vários tipos de transação, cada um servindo a um propósito único na rede. Aqui está uma breve visão geral de cada tipo de transação:
|
||||
|
||||
**DepositPreauth**
|
||||
|
||||
Este tipo de transação permite que uma conta pré-autorize transações recebidas de uma fonte especificada. É uma forma de adicionar contas a uma lista de permissões, garantindo que apenas transações autorizadas sejam processadas.
|
||||
|
||||
<LinkCard title="DepositPreauth" href="/pt-br/docs/protocol-reference/transactions/transaction-types/depositpreauth" />
|
||||
|
||||
**TrustSet**
|
||||
|
||||
Este tipo de transação permite que os usuários criem uma linha de confiança com outra conta. É uma forma de estabelecer confiança entre duas contas, permitindo que elas transacionem entre si.
|
||||
|
||||
<LinkCard title="TrustSet" href="/pt-br/docs/protocol-reference/transactions/transaction-types/trustset" />
|
||||
|
||||
**Payment**
|
||||
|
||||
Este é o tipo de transação básico que permite a transferência de ativos entre contas. É o tipo de transação fundamental para qualquer operação de pagamento na rede.
|
||||
|
||||
<LinkCard title="Payment" href="/pt-br/docs/protocol-reference/transactions/transaction-types/payment" />
|
||||
|
||||
**PaymentChannelCreate**
|
||||
|
||||
Este tipo de transação permite a criação de um canal de pagamento entre duas contas. Os canais de pagamento são soluções de escalabilidade fora do ledger que possibilitam transações de alta frequência e baixo custo entre duas partes.
|
||||
|
||||
<LinkCard title="PaymentChannelCreate" href="/pt-br/docs/protocol-reference/transactions/transaction-types/paymentchannelcreate" />
|
||||
|
||||
**PaymentChannelFund**
|
||||
|
||||
Este tipo de transação permite que uma conta financie um canal de pagamento existente. É uma forma de adicionar mais ativos a um canal de pagamento, possibilitando mais transações.
|
||||
|
||||
<LinkCard title="PaymentChannelFund" href="/pt-br/docs/protocol-reference/transactions/transaction-types/paymentchannelfund" />
|
||||
|
||||
**PaymentChannelClaim**
|
||||
|
||||
Este tipo de transação permite que uma conta reivindique os fundos de um canal de pagamento. É uma forma de fechar um canal de pagamento e recuperar os ativos restantes.
|
||||
|
||||
<LinkCard title="PaymentChannelClaim" href="/pt-br/docs/protocol-reference/transactions/transaction-types/paymentchannelclaim" />
|
||||
@@ -0,0 +1,32 @@
|
||||
---
|
||||
title: URIToken
|
||||
---
|
||||
import { LinkCard } from '@astrojs/starlight/components';
|
||||
|
||||
Os URITokens são a implementação de Token Não Fungível (NFT) nativa da rede Xahau. Eles existem como objetos de primeira classe no ledger, identificados de forma única pelo hash de seu emissor e Identificador de Recurso Uniforme (URI). Os URITokens podem apontar para qualquer conteúdo digital, com apenas um objeto por URI por conta existindo no ledger.
|
||||
|
||||
O emissor tem a capacidade de definir um flag para habilitar a queima do objeto no futuro. A reserva de cada proprietário também fica bloqueada mediante a propriedade do URIToken.
|
||||
|
||||
### Tipos de Transação
|
||||
|
||||
#### URITokenMint
|
||||
|
||||
A transação URITokenMint cunha um novo URIToken e atribui a propriedade à conta especificada. O URIToken cunhado representa um ativo digital único que pode ser usado em várias aplicações. O emissor pode optar por permitir que o URIToken cunhado seja destruído no futuro.
|
||||
|
||||
<LinkCard title="URITokenMint" href="/pt-br/docs/protocol-reference/transactions/transaction-types/uritokenmint" />
|
||||
|
||||
#### URITokenBurn
|
||||
|
||||
A transação URITokenBurn é usada para queimar um URIToken no Xahau. Queimar um URIToken o remove permanentemente de circulação. A transação não possui requisitos especiais de custo de transação. A conta que possui o URIToken a ser queimado é necessária para esta transação.
|
||||
|
||||
<LinkCard title="URITokenBurn" href="/pt-br/docs/protocol-reference/transactions/transaction-types/uritokenburn" />
|
||||
|
||||
#### URITokenBuy
|
||||
|
||||
A transação URITokenBuy permite que um usuário compre um URIToken do emissor. Esta transação é usada para transferir a propriedade de um URIToken do emissor para o comprador. A conta do comprador, o identificador único do URIToken a ser comprado e o valor da moeda a pagar pelo URIToken são necessários para esta transação.
|
||||
|
||||
<LinkCard title="URITokenBuy" href="/pt-br/docs/protocol-reference/transactions/transaction-types/uritokenbuy" />
|
||||
|
||||
<LinkCard title="URITokenCreateSellOffer" href="/pt-br/docs/protocol-reference/transactions/transaction-types/uritokencreateselloffer" />
|
||||
|
||||
<LinkCard title="URITokenCancelSellOffer" href="/pt-br/docs/protocol-reference/transactions/transaction-types/uritokencancelselloffer" />
|
||||
34
src/content/docs/pt-br/docs/features/public-nodes-rpc.mdx
Normal file
34
src/content/docs/pt-br/docs/features/public-nodes-rpc.mdx
Normal file
@@ -0,0 +1,34 @@
|
||||
---
|
||||
title: Nós Públicos (RPC)
|
||||
description: >-
|
||||
Executar seu próprio nó: incrível. Quer começar rapidamente? Use os nós RPC
|
||||
públicos do Xahau.
|
||||
---
|
||||
## Mainnet (rede 21337)
|
||||
|
||||
* Websocket
|
||||
* `wss://xahau.network`
|
||||
* `wss://xahau.org` (alias; alguns bloqueadores de anúncios bloqueiam .network)
|
||||
* HTTP POST RPC
|
||||
* `https://xahau.network`
|
||||
* `https://xahau.org` (alias; alguns bloqueadores de anúncios bloqueiam .network)
|
||||
* Definições de Rede (Binary Codec, ...)
|
||||
* [`https://xahau.network/server_definitions.json`](https://xahau.network/server_definitions.json)
|
||||
|
||||
## Testnet (rede 21338)
|
||||
|
||||
* Websocket
|
||||
* `wss://xahau-test.net`
|
||||
* HTTP POST RPC
|
||||
* `https://xahau-test.net`
|
||||
* Definições de Rede (Binary Codec, ...)
|
||||
* [`https://xahau-test.net/server_definitions.json`](https://xahau-test.net/server_definitions.json)
|
||||
|
||||
## JSHooks-Testnet (rede 31338)
|
||||
|
||||
* Websocket
|
||||
* `wss://jshooks.xahau-test.net`
|
||||
* HTTP POST RPC
|
||||
* `https://jshooks.xahau-test.net`
|
||||
* Definições de Rede (Binary Codec, ...)
|
||||
* [`https://jshooks.xahau-test.net/server_definitions.json`](https://jshooks.xahau-test.net/server_definitions.json)
|
||||
@@ -0,0 +1,65 @@
|
||||
---
|
||||
title: Assinatura de Transações
|
||||
description: >-
|
||||
Como as redes habilitadas para Hooks exigem campos de transação específicos e
|
||||
oferecem mais tipos de transação, nem todos os clientes funcionarão imediatamente.
|
||||
`xrpl-accountlib`
|
||||
---
|
||||
## Principais Diferenças
|
||||
|
||||
1. Redes habilitadas para Hooks permitem obter definições de rede dinamicamente. Isso permite que os clientes se adaptem aos tipos de transação, objetos de ledger, propriedades e tipos de valor disponíveis. Quando implementado corretamente, as bibliotecas de assinatura e codificação não precisam ser atualizadas quando a rede adiciona tipos/propriedades de transação/objeto. <mark style="color:blue;">**As bibliotecas abaixo implementam isso e cuidarão disso por você.**</mark>
|
||||
2. Redes habilitadas para Hooks exigem um **NetworkID** em cada transação para evitar a repetição de transações em outra cadeia. O **NetworkID** também será retornado por um comando RPC `server_info` no campo `network_id` (ex: **`21338`** para Hooks V3 testnet)
|
||||
3. Transações em uma rede habilitada para Hooks podem precisar de taxas mais altas para entregar uma transação a outra conta, com base nos Hooks que serão executados ao sair da conta de envio e ao receber na conta de destino. Uma taxa razoável para satisfazer a execução dos Hooks pode ser obtida dinamicamente de um nó emitindo o comando `fee` enquanto fornece uma transação como `tx_blob`. <mark style="color:blue;">**As bibliotecas abaixo implementam isso e cuidarão disso por você.**</mark>
|
||||
|
||||
## JavaScript/Typescript
|
||||
|
||||
O [**pacote npm `xrpl-accountlib`**](https://www.npmjs.com/package/xrpl-accountlib) pode assinar transações para redes habilitadas para Hooks, pois oferece suporte completo a recursos de rede dinâmicos, buscando definições de rede em tempo de execução.
|
||||
|
||||
O [**pacote npm `xrpl-client`**](https://www.npmjs.com/package/xrpl-client) se integra perfeitamente com `xrpl-accountlib` (e vem como dependência) para buscar dinamicamente as definições de rede e valores de conta mencionados acima, auxiliando no envio da transação.
|
||||
|
||||
### Exemplo de Código
|
||||
|
||||
```javascript
|
||||
import {
|
||||
derive,
|
||||
utils,
|
||||
signAndSubmit,
|
||||
} from "xrpl-accountlib"
|
||||
|
||||
const wss = 'wss://xahau-test.net'
|
||||
const account = derive.familySeed("s...")
|
||||
|
||||
const networkInfo = await utils.txNetworkAndAccountValues(wss, account)
|
||||
|
||||
const tx = {
|
||||
TransactionType: "SetHook",
|
||||
Hooks: [ { Hook: {
|
||||
CreateCode: "0061736D01000000011C0460057F7F7F7F7F017E60037F7F7E017E60027F7F017F60017F017E02230303656E76057472616365000003656E7606616363657074000103656E76025F670002030201030503010002062B077F0141B088040B7F004180080B7F0041A6080B7F004180080B7F0041B088040B7F0041000B7F0041010B07080104686F6F6B00030AC4800001C0800001017F230041106B220124002001200036020C41920841134180084112410010001A410022002000420010011A41012200200010021A200141106A240042000B0B2C01004180080B254163636570742E633A2043616C6C65642E00224163636570742E633A2043616C6C65642E22",
|
||||
Flags: 1,
|
||||
HookApiVersion: 0,
|
||||
HookNamespace: "F".repeat(64),
|
||||
HookOn: "F".repeat(58) + "BFFFFE",
|
||||
}
|
||||
}],
|
||||
...networkInfo.txValues,
|
||||
// ^^ Isso adiciona valores buscados automaticamente para você:
|
||||
// Sequence, Account, LastLedgerSequence,
|
||||
// Fee (Hooks habilitado: detecção automática (do ledger))
|
||||
}
|
||||
|
||||
/**
|
||||
* Nota: o código acima e `signAndSubmit` resultam na busca e definição
|
||||
* automática de uma taxa para você. Se quiser verificar a taxa
|
||||
* para mín/máx/..., obtenha sua própria taxa (string em drops) usando:
|
||||
* utils.networkTxFee(wss, tx)
|
||||
*
|
||||
* ex:
|
||||
* const Fee = await utils.networkTxFee(wss, tx)
|
||||
* assert(Number(Fee) < 50_000, "Taxa automática acima de 50k drops, abortar")
|
||||
* Object.assign(tx, { Fee, })
|
||||
*/
|
||||
|
||||
const submitted = await signAndSubmit(tx, wss, account)
|
||||
|
||||
console.log(submitted)
|
||||
```
|
||||
@@ -0,0 +1,56 @@
|
||||
---
|
||||
title: Taxas de Transação
|
||||
description: >-
|
||||
Os contratos inteligentes Xahau (Hooks) precisam de taxas específicas por transação
|
||||
e destino. Você pode facilmente obter a taxa necessária pelo comando RPC `fee`.
|
||||
---
|
||||
import { Aside } from '@astrojs/starlight/components';
|
||||
|
||||
Embora as bibliotecas possam lidar com a determinação de taxas para você, ao construir suas próprias integrações com a Rede Xahau, pode ser necessário implementar a determinação dinâmica de taxas com base na transação e nas contas de origem e destino.
|
||||
|
||||
Como o remetente de uma transação terá que pagar as taxas exigidas pelos Hooks invocados para o tipo de transação específico, onde os Hooks podem estar tanto na conta de origem quanto na de destino, você pode enviar um TX Blob (assinado com uma conta fictícia) para o comando `fee`, após o qual o Xahau retornará as taxas específicas necessárias para a transação.
|
||||
|
||||
### Helper RPC de Taxa
|
||||
|
||||
As taxas de transação em um ledger com a Emenda Hooks habilitada tornam-se não triviais para calcular por usuários finais e/ou aplicações de carteira. Isso ocorre porque hooks fortes devem ser pagos pelo originador de uma transação, e pode haver até 4 hooks fortes na conta de envio e 4 na conta de recebimento, além de outros stakeholders transacionais fortes envolvidos (como pode ser o caso com alguns tipos de transação exóticos). Além disso, se a transação for um SetHook, o tamanho dos parâmetros, o tamanho do código e se é uma operação de _criação_ ou _instalação_ determinam o tamanho da taxa.
|
||||
|
||||
Portanto, é altamente recomendado que **todas** as transações sejam processadas pela chamada RPC de taxa atualizada antes de serem enviadas ao ledger.
|
||||
|
||||
#### Para invocar a chamada RPC:
|
||||
|
||||
1. Abra uma conexão WebSocket com o nó Hooks com o qual você trabalhará.
|
||||
2. Componha a transação serializada para a qual deseja saber a taxa com o seguinte:
|
||||
|
||||
* `Fee: 0`
|
||||
* `SigningPubKey: ""` (Ou seja: VL de 0 byte do tipo 0x73. Em hex:`0x7300`.)
|
||||
* **Não** assine a transação.
|
||||
|
||||
3. Envie-a como um blob hexadecimal para o RPC da seguinte forma:
|
||||
|
||||
```json
|
||||
{"command":"fee", "tx_blob":"<hex blob>"}
|
||||
```
|
||||
|
||||
Para HTTP POST RPC, envie da seguinte forma:
|
||||
|
||||
```json
|
||||
{"method":"fee", "params": [{"tx_blob":"<hex blob>"}] }
|
||||
```
|
||||
|
||||
A resposta deve ser algo como
|
||||
|
||||
```json
|
||||
{
|
||||
result: {
|
||||
drops: {
|
||||
base_fee: '130520',
|
||||
},
|
||||
//...
|
||||
},
|
||||
type: 'response'
|
||||
}
|
||||
```
|
||||
|
||||
Pegue a taxa base e defina-a como o campo `Fee` na transação. Agora assine e envie conforme o processo normal de envio de transações.
|
||||
|
||||
Se houver um valor inválido para `tx_blob` ou `tx_blob` estiver ausente, um resultado JSON regular será retornado com uma `base_fee` de 10.
|
||||
64
src/content/docs/pt-br/docs/features/versioning-process.mdx
Normal file
64
src/content/docs/pt-br/docs/features/versioning-process.mdx
Normal file
@@ -0,0 +1,64 @@
|
||||
---
|
||||
title: Processo de Versionamento
|
||||
description: >-
|
||||
Este documento descreve nosso fluxo de trabalho de versionamento no GitHub,
|
||||
para agilizar o desenvolvimento, testes e implantação de novas funcionalidades
|
||||
e correções.
|
||||
---
|
||||
import { Aside } from '@astrojs/starlight/components';
|
||||
|
||||
Este documento descreve o processo de versionamento que usamos em nosso repositório no GitHub. Utilizamos um fluxo de trabalho com três branches: `dev`, `candidate` e `release`. Esse processo garante que todas as novas funcionalidades e correções sejam cuidadosamente testadas antes do lançamento.
|
||||
|
||||
### Branch Dev
|
||||
|
||||
O branch dev é o branch principal para o desenvolvimento contínuo. Todas as novas funcionalidades, correções de bugs e melhorias são mescladas neste branch. É o branch mais ativo e é onde os desenvolvedores devem basear seu trabalho.
|
||||
|
||||
Para contribuir com o branch dev, siga estes passos:
|
||||
|
||||
1. Faça um fork do repositório para sua própria conta no GitHub.
|
||||
2. Clone o repositório forkado para sua máquina local.
|
||||
3. Crie um novo branch para sua funcionalidade ou correção de bug.
|
||||
4. Faça suas alterações e faça commit delas no seu branch.
|
||||
5. Faça push do seu branch para o repositório forkado no GitHub.
|
||||
6. Crie um pull request do seu branch para o branch dev no repositório principal.
|
||||
|
||||
<Aside type="caution">
|
||||
Todos os merges no branch dev devem ser feitos com squash
|
||||
</Aside>
|
||||
|
||||
Os mantenedores do código revisarão seu pull request e fornecerão feedback. Uma vez que o código for aprovado, ele será mesclado no branch dev.
|
||||
|
||||
### Branches Candidate
|
||||
|
||||
Assim que as funcionalidades no branch `dev` estiverem prontas para testes, elas são mescladas em um branch `candidate`. Este branch serve como área de preparação para código que está quase pronto para lançamento.
|
||||
|
||||
O código no branch `candidate` é testado minuciosamente. Quaisquer bugs ou problemas encontrados são corrigidos no branch `dev` e então mesclados de volta no branch `candidate`.
|
||||
|
||||
O branch `candidate` normalmente fica nessa fase de testes por cerca de 2 semanas. No entanto, esse período pode ser maior ou menor, dependendo da urgência das correções ou do tamanho das novas funcionalidades.
|
||||
|
||||
1. Crie um novo branch `candidate` a partir do `dev`.
|
||||
2. Crie um PR do branch `candidate` para o branch `release` com um nome como "Proposto."
|
||||
3. Atualize a "Visão Geral de Alto Nível da Mudança" para incluir os Pull Requests do `candidate`. Atualize o "Contexto da Mudança" para incluir quaisquer notas adicionais sobre os PRs.
|
||||
|
||||
### Branch Release
|
||||
|
||||
Após o código no branch `candidate` ter sido testado minuciosamente e todos os problemas terem sido resolvidos, ele é mesclado no branch `release`. Esta é a etapa final antes do lançamento do código.
|
||||
|
||||
O branch `release` contém o código que está atualmente em produção ou está prestes a ser lançado. Somente código totalmente testado e estável deve estar neste branch.
|
||||
|
||||
Uma vez que o código esteja no branch `release`, ele é marcado com um número de versão. Este número de versão é usado para rastrear o lançamento e também é usado ao criar notas de lançamento.
|
||||
|
||||
No branch `release`, um binário é construído e publicado em https://build.xahau.tech/. Este binário é o produto final entregue aos usuários finais.
|
||||
|
||||
Para lançar o código, siga estes passos:
|
||||
|
||||
1. Mescle o pull request do `candidate` no branch release.
|
||||
2. Exclua o branch `candidate`.
|
||||
|
||||
<Aside type="caution">
|
||||
Todos os merges no branch release devem ser feitos com \`git merge --ff-only candidate\`
|
||||
</Aside>
|
||||
|
||||
### Resumo
|
||||
|
||||
Este fluxo de trabalho com três branches garante que todo o código seja testado minuciosamente antes do lançamento. Ele nos permite detectar e corrigir problemas antes que cheguem à produção e fornece um caminho claro para mover o código do desenvolvimento ao lançamento. O uso de uma LAN personalizada para testes e métricas de perfil garante que nosso código não seja apenas funcional, mas também eficiente e performático.
|
||||
47
src/content/docs/pt-br/docs/hooks/concepts/chaining.mdx
Normal file
47
src/content/docs/pt-br/docs/hooks/concepts/chaining.mdx
Normal file
@@ -0,0 +1,47 @@
|
||||
---
|
||||
title: Encadeamento
|
||||
description: Encadeie múltiplos hooks para realizar tarefas mais úteis
|
||||
---
|
||||
import { Aside } from '@astrojs/starlight/components';
|
||||
|
||||
<Aside type="tip" title="Filosofia de Design dos Hooks">
|
||||
_Cada Hook deve fazer uma coisa, e fazê-la muito bem._
|
||||
</Aside>
|
||||
|
||||
### Histórico
|
||||
|
||||
Nos primórdios dos Hooks, era possível instalar apenas um Hook por conta. Isso significava que os usuários eram obrigados a criar Hooks genéricos se quisessem fazer mais de uma coisa: por exemplo, compensar carbono e usar firewall ao mesmo tempo.
|
||||
|
||||
Isso ia contra a Filosofia de Design dos Hooks, então o Encadeamento de Hooks foi introduzido.
|
||||
|
||||
### Encadeamento
|
||||
|
||||
Uma Cadeia de Hooks é uma sequência de até **10** Hooks instalados em uma conta Xahau.
|
||||
|
||||
* Uma Cadeia de Hooks é executada com sucesso quando cada Hook da cadeia foi executado individualmente e, em seguida, chama [accept](/pt-br/docs/hooks/functions/control/accept).
|
||||
* A execução de cada cadeia começa na posição 0 e termina na posição 9. Se uma posição estiver vazia (porque nunca foi preenchida ou porque o hook instalado nela foi removido), essa posição é ignorada e tratada como bem-sucedida.
|
||||
* Para que uma transação seja bem-sucedida, ambos os lados da transação (lado do remetente e lado do destinatário) devem ter executado com sucesso. Isso significa que, se houver uma Cadeia de Hooks instalada em ambos os lados, ambas as cadeias devem ser executadas com sucesso para que a transação seja concluída.
|
||||
|
||||
Os Hooks são instalados na cadeia usando a [Transação SetHook](/pt-br/docs/hooks/concepts/sethook-transaction). Quando instalados, o instalador pode especificar [Parâmetros](/pt-br/docs/hooks/concepts/parameters) de tempo de instalação, que podem alterar o comportamento do Hook instalado.
|
||||
|
||||
<figure>
|
||||

|
||||
<figcaption>*Exemplo: Fluxo de execução de uma transação passando por duas Cadeias de Hooks*</figcaption>
|
||||
</figure>
|
||||
|
||||
### Manipulação da Cadeia
|
||||
|
||||
Além das operações de _tempo de instalação_ especificadas na [Transação SetHook](/pt-br/docs/hooks/concepts/sethook-transaction), os Hooks têm algum controle em tempo de execução sobre a execução da cadeia:
|
||||
|
||||
* Um Hook pode determinar seu próprio `HookHash` chamando [hook_hash](/pt-br/docs/hooks/functions/hook-context/hook_hash).
|
||||
* Um Hook pode determinar sua localização na Cadeia de Hooks usando [hook_pos](/pt-br/docs/hooks/functions/hook-context/hook_pos).
|
||||
* Um Hook pode ignorar (ou reativar) outro Hook mais adiante na cadeia usando [hook_skip](/pt-br/docs/hooks/functions/hook-context/hook_skip).
|
||||
* Um Hook pode modificar os [Parâmetros](/pt-br/docs/hooks/concepts/parameters) de um Hook mais adiante na cadeia usando [hook_param_set](/pt-br/docs/hooks/functions/hook-context/hook_param_set).
|
||||
|
||||
### Execuções Fracas
|
||||
|
||||
As Cadeias de Hooks são [Fortemente Executadas](/pt-br/docs/hooks/concepts/weak-and-strong). No entanto, qualquer Hook em qualquer cadeia pode sinalizar que requer uma segunda Execução Fraca chamando [hook_again](/pt-br/docs/hooks/functions/hook-context/hook_again). Se todas as Cadeias de Hooks forem executadas com sucesso, a transação de origem é aplicada. Uma vez aplicada a transação de origem, quaisquer Execuções Fracas podem ocorrer, na seguinte ordem:
|
||||
|
||||
1. Execução de `cbak` se esta for uma Transação Emitida.
|
||||
2. Partes Interessadas Transacionais Fracas que optaram por permitir uma [Chamada Coletiva](/pt-br/docs/hooks/concepts/collect-call). A ordem de execução é por ordem de chegada, de acordo com o evento que causou a sinalização da TSH (como roteamento).
|
||||
3. Quaisquer Hooks _Again as Weak_ (AAW). A ordem de execução para AAW é primeiro numericamente pelo ID da Conta e depois numericamente pela posição do Hook.
|
||||
27
src/content/docs/pt-br/docs/hooks/concepts/collect-call.mdx
Normal file
27
src/content/docs/pt-br/docs/hooks/concepts/collect-call.mdx
Normal file
@@ -0,0 +1,27 @@
|
||||
---
|
||||
title: Chamada Coletiva
|
||||
---
|
||||
import { Card, Aside } from '@astrojs/starlight/components';
|
||||
|
||||
<Card title="Filosofia de Design dos Hooks">
|
||||
_Toda parte afetada por uma transação deve ter a oportunidade de ter seus hooks executados._
|
||||
</Card>
|
||||
|
||||
Quando os hooks não são Fortemente Executados, não é justo cobrar da transação de origem o custo de sua execução. Por exemplo, um _OfferCreate_ que cruza 20 ofertas na DEX não deve ser obrigado a pagar pela execução dos Hooks de cada uma dessas contas.
|
||||
|
||||
Portanto, durante uma execução Fraca típica, a taxa de execução é cobrada do proprietário do Hook. Para habilitar isso:
|
||||
|
||||
* O proprietário do Hook deve ter definido `asfTshCollect` em sua conta Xahau usando a transação AccountSet.
|
||||
* O proprietário do Hook deve ter definido `hsfCollect` no Hook específico que deseja que seja chamado como um TSH Fraco.
|
||||
|
||||
### Tabela de Responsabilidade de Taxa
|
||||
|
||||
| Tipo de Execução Fraca | Taxa |
|
||||
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| <p><strong>Again As Weak</strong><br />- Ocorre quando um Hook Fortemente Executado chama <a href="/pt-br/docs/hooks/functions/hook-context/hook_again">hook_again</a></p> | Gratuita (já paga pela Execução Forte). |
|
||||
| <p><strong>Callback</strong><br />- Ocorre quando uma transação emitida entra em um ledger ou é sinalizada como impossível de entrar em qualquer ledger.</p> | Gratuita (já paga durante a Emissão). |
|
||||
| <p><strong>Parte Interessada Transacional Fraca</strong><br />- Ocorre quando uma transação afeta levemente sua conta de alguma forma.</p> | Paga pela sua conta (não pela transação de origem) se e somente se sua conta estiver marcada com o flag `asfTshCollect` e seu Hook estiver marcado com o flag `hsfCollect`. |
|
||||
|
||||
<Aside type="caution">
|
||||
Este é um recurso avançado que a maioria dos desenvolvedores de Hooks provavelmente não utilizará.
|
||||
</Aside>
|
||||
228
src/content/docs/pt-br/docs/hooks/concepts/compiling-hooks.mdx
Normal file
228
src/content/docs/pt-br/docs/hooks/concepts/compiling-hooks.mdx
Normal file
@@ -0,0 +1,228 @@
|
||||
---
|
||||
title: Compilando Hooks
|
||||
---
|
||||
import { Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### Restrições
|
||||
|
||||
Todos os Hooks são compilados em um único [módulo webassembly](https://webassembly.github.io/spec/core/syntax/modules.html) antes de poderem ser instalados em uma conta Xahau.
|
||||
|
||||
Um Hook sempre implementa e exporta exatamente uma ou ambas das seguintes funções:
|
||||
|
||||
`int64_t hook(uint32_t ctx) { ... }` _obrigatória_
|
||||
|
||||
* Executada sempre que uma transação chega ou sai da conta onde o Hook está instalado (`ctx = 0`) ou
|
||||
* Executada quando executada como uma [Parte Interessada Transacional Fraca](/pt-br/docs/hooks/concepts/weak-and-strong) (`ctx > 0`).
|
||||
|
||||
`int64_t cbak(uint32_t ctx) { ... }` _opcional_
|
||||
|
||||
* Executada quando uma transação emitida é aceita com sucesso em um ledger (`ctx = 0`) ou
|
||||
* Executada quando uma transação emitida não pode ser aceita em nenhum ledger (`ctx = 1`).
|
||||
|
||||
Os Hooks não podem especificar outras funções. Em vez disso, devem usar macros de forma inteligente para realizar todos os cálculos dentro dessas duas funções. Essa é parte de uma restrição computacional dos hooks para manter seus tempos de execução previsíveis.
|
||||
|
||||
Adicionalmente, os Hooks não têm acesso a memória _heap_. Toda a memória necessária deve ser reservada e utilizada na pilha.
|
||||
|
||||
### Exemplo
|
||||
|
||||
Aqui está um exemplo de Hook escrito em C. O Hook imprime 0...3 no log de rastreamento antes de aceitar a transação de origem.
|
||||
|
||||
```c
|
||||
#include <stdint.h>
|
||||
#define GUARD(maxiter) _g(__LINE__, (maxiter)+1)
|
||||
extern int32_t _g (uint32_t id, uint32_t maxiter);
|
||||
extern int64_t accept (uint32_t read_ptr, uint32_t read_len, int64_t error_code);
|
||||
extern int64_t trace_num (uint32_t read_ptr, uint32_t read_len, int64_t number);
|
||||
|
||||
int64_t hook(uint32_t ctx)
|
||||
{
|
||||
for (int i = 0; GUARD(3), i < 3; ++i)
|
||||
{
|
||||
trace_num("test", 4, i);
|
||||
}
|
||||
accept (0,0,0);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
<Aside type="tip">
|
||||
Para fins educacionais, o exemplo acima deliberadamente não inclui `hookapi.h` (que os desenvolvedores normalmente utilizariam.)
|
||||
</Aside>
|
||||
|
||||
### Compilação
|
||||
|
||||
Uma [variedade de compiladores](https://www.google.com/search?q=webassembly+compiler+C) irá gerar webassembly válido a partir de um arquivo fonte C. Uma vez compilado, um Hook existe como um arquivo binário `.wasm`. Este contém um módulo webassembly. Usando `wasmcc` para compilar e a ferramenta `wasm2wat` para converter para webassembly legível, essa forma binária pode ser renderizada para a forma legível. Abaixo aparece o resultado da compilação do exemplo acima.
|
||||
|
||||
```
|
||||
(module
|
||||
(type (;0;) (func (param i32 i32) (result i32)))
|
||||
(type (;1;) (func (param i32 i32 i64) (result i64)))
|
||||
(type (;2;) (func))
|
||||
(type (;3;) (func (param i32) (result i64)))
|
||||
(import "env" "_g" (func $_g (type 0)))
|
||||
(import "env" "trace_num" (func $trace_num (type 1)))
|
||||
(import "env" "accept" (func $accept (type 1)))
|
||||
(func $__wasm_call_ctors (type 2))
|
||||
(func $cbak (type 3) (param i32) (result i64)
|
||||
(local i32 i32 i32 i64)
|
||||
global.get 0
|
||||
local.set 1
|
||||
i32.const 16
|
||||
local.set 2
|
||||
local.get 1
|
||||
local.get 2
|
||||
i32.sub
|
||||
local.set 3
|
||||
i64.const 0
|
||||
local.set 4
|
||||
local.get 3
|
||||
local.get 0
|
||||
i64.store offset=8
|
||||
local.get 4
|
||||
return)
|
||||
(func $hook (type 3) (param i32) (result i64)
|
||||
(local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i64 i32 i32 i32 i64 i32 i32 i32)
|
||||
global.get 0
|
||||
local.set 1
|
||||
i32.const 16
|
||||
local.set 2
|
||||
local.get 1
|
||||
local.get 2
|
||||
i32.sub
|
||||
local.set 3
|
||||
local.get 3
|
||||
global.set 0
|
||||
i32.const 0
|
||||
local.set 4
|
||||
local.get 3
|
||||
local.get 0
|
||||
i64.store offset=8
|
||||
local.get 3
|
||||
local.get 4
|
||||
i32.store offset=4
|
||||
block ;; label = @1
|
||||
loop ;; label = @2
|
||||
i32.const 3
|
||||
local.set 5
|
||||
i32.const 14
|
||||
local.set 6
|
||||
i32.const 4
|
||||
local.set 7
|
||||
local.get 6
|
||||
local.get 7
|
||||
call $_g
|
||||
drop
|
||||
local.get 3
|
||||
i32.load offset=4
|
||||
local.set 8
|
||||
local.get 8
|
||||
local.set 9
|
||||
local.get 5
|
||||
local.set 10
|
||||
local.get 9
|
||||
local.get 10
|
||||
i32.lt_s
|
||||
local.set 11
|
||||
i32.const 1
|
||||
local.set 12
|
||||
local.get 11
|
||||
local.get 12
|
||||
i32.and
|
||||
local.set 13
|
||||
local.get 13
|
||||
i32.eqz
|
||||
br_if 1 (;@1;)
|
||||
i32.const 1024
|
||||
local.set 14
|
||||
i32.const 4
|
||||
local.set 15
|
||||
local.get 3
|
||||
i32.load offset=4
|
||||
local.set 16
|
||||
local.get 16
|
||||
local.set 17
|
||||
local.get 17
|
||||
i64.extend_i32_s
|
||||
local.set 18
|
||||
local.get 14
|
||||
local.get 15
|
||||
local.get 18
|
||||
call $trace_num
|
||||
drop
|
||||
local.get 3
|
||||
i32.load offset=4
|
||||
local.set 19
|
||||
i32.const 1
|
||||
local.set 20
|
||||
local.get 19
|
||||
local.get 20
|
||||
i32.add
|
||||
local.set 21
|
||||
local.get 3
|
||||
local.get 21
|
||||
i32.store offset=4
|
||||
br 0 (;@2;)
|
||||
end
|
||||
end
|
||||
i64.const 0
|
||||
local.set 22
|
||||
i32.const 0
|
||||
local.set 23
|
||||
local.get 23
|
||||
local.get 23
|
||||
local.get 22
|
||||
call $accept
|
||||
drop
|
||||
i32.const 16
|
||||
local.set 24
|
||||
local.get 3
|
||||
local.get 24
|
||||
i32.add
|
||||
local.set 25
|
||||
local.get 25
|
||||
global.set 0
|
||||
local.get 22
|
||||
return)
|
||||
(table (;0;) 1 1 funcref)
|
||||
(memory (;0;) 2)
|
||||
(global (;0;) (mut i32) (i32.const 66576))
|
||||
(global (;1;) i32 (i32.const 1029))
|
||||
(global (;2;) i32 (i32.const 1024))
|
||||
(global (;3;) i32 (i32.const 66576))
|
||||
(global (;4;) i32 (i32.const 1024))
|
||||
(export "memory" (memory 0))
|
||||
(export "__wasm_call_ctors" (func $__wasm_call_ctors))
|
||||
(export "__data_end" (global 1))
|
||||
(export "__global_base" (global 2))
|
||||
(export "__heap_base" (global 3))
|
||||
(export "__dso_handle" (global 4))
|
||||
(export "cbak" (func $cbak))
|
||||
(export "hook" (func $hook))
|
||||
(data (;0;) (i32.const 1024) "test\00"))
|
||||
```
|
||||
|
||||
O desenvolvedor médio de Hooks nunca precisará examinar o webassembly diretamente. No entanto, é um exercício conceitual útil revisar o conteúdo do Hook de exemplo.
|
||||
|
||||
Acima podemos ver:
|
||||
|
||||
* Três funções são importadas da API de Hooks (`_g`, `accept`, `trace_num`)
|
||||
* Duas funções são definidas pelo hook (`cbak`, `hook`)
|
||||
* Duas funções são exportadas pelo hook (novamente: `cbak`, `hook`)
|
||||
* Alguns dados estáticos (constantes) são registrados no hook (veja `data` no final).
|
||||
|
||||
É muito importante notar que um Hook _deve apenas_ importar funções disponíveis para ele da API de Hooks e _deve_ apenas exportar as funções `cbak` e `hook`. Adicionalmente, todos os hooks devem importar `_g` da API de Hooks, que é a função `guard`.
|
||||
|
||||
<Aside type="tip">
|
||||
Webassembly é uma linguagem de `bytecode` de computação geral independente de plataforma. Ela tem um mapeamento um-para-um com um equivalente legível por humanos. Estes são usados de forma intercambiável.
|
||||
</Aside>
|
||||
|
||||
### Exportações Indesejadas
|
||||
|
||||
A maioria dos compiladores webassembly (incluindo o acima) produz exportações adicionais para seus próprios propósitos de vinculação. Em muitos casos, a geração dessas é difícil ou impossível de desativar.
|
||||
|
||||
Exportações indesejadas levarão a um Hook de outra forma válido ser rejeitado. Portanto, após a compilação, os desenvolvedores devem usar o [Hook Cleaner Utility](https://github.com/XRPLF/hook-cleaner-c) para removê-las. Deixar de fazer isso resultará na rejeição do seu Hook.
|
||||
|
||||
|
||||
<Aside type="caution">
|
||||
Não se esqueça de usar o [Hook Cleaner Utility](https://github.com/XRPLF/hook-cleaner-c) ou seus Hooks serão rejeitados.
|
||||
</Aside>
|
||||
@@ -0,0 +1,70 @@
|
||||
---
|
||||
title: Depurando Hooks
|
||||
description: Como imprimir "hello world" a partir do seu Hook!
|
||||
---
|
||||
import { Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### Como posso depurar um Hook?
|
||||
|
||||
A API de Hooks fornece um conjunto de funções no namespace `trace` que gravam saída no arquivo de log do `xrpld` quando o xrpld está configurado com o nível de log _trace_. Essas funções, em geral, permitem que você veja o valor de variáveis, buffers e rastreie a execução e o estado de um Hook em tempo de execução.
|
||||
|
||||
<Aside type="tip">
|
||||
No momento da escrita, não existe um Depurador Interativo de Hook. Você deve usar as funções de rastreamento.
|
||||
</Aside>
|
||||
|
||||
### APIs de Rastreamento
|
||||
|
||||
As seguintes funções `trace` estão disponíveis na API de Hooks
|
||||
|
||||
| API de Hook | O que faz |
|
||||
| ----------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
|
||||
| [trace](/pt-br/docs/hooks/functions/trace-debug/trace) | Imprime uma mensagem utf-8, seguida por um buffer especificado pelo usuário (opcionalmente como hex.) |
|
||||
| [trace_num](/pt-br/docs/hooks/functions/trace-debug/trace_num) | Imprime uma mensagem utf-8, seguida por um inteiro. |
|
||||
| [trace_float](/pt-br/docs/hooks/functions/trace-debug/trace_float) | Imprime uma mensagem utf-8, seguida por um número de ponto flutuante XFL. |
|
||||
|
||||
### Exemplo
|
||||
|
||||
O código a seguir imprimirá uma única linha de rastreamento e então aceitará a Transação de Origem.
|
||||
|
||||
```c
|
||||
#include "../hookapi.h"
|
||||
int64_t hook(int64_t reserved)
|
||||
{
|
||||
trace_num(SBUF("A number"), 10);
|
||||
accept(0,0,0);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
Um exemplo da linha de log produzida pelo `xahaud` quando um pagamento é enviado para fora ou para dentro da Conta Hook:
|
||||
|
||||
```
|
||||
2021-Apr-13 13:59:11.083700726 UTC View:TRC
|
||||
HookTrace[rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh-rE3SfnjwfzZFL3JK9cLVfJuy8Ar1XnCqPw]:
|
||||
A number 10
|
||||
```
|
||||
|
||||
O acima aparece no log como uma única linha, mas foi dividido aqui para melhor visibilidade.
|
||||
|
||||
<Aside type="tip" title="Use a testnet">
|
||||
A [Xahau Testnet](https://xahau-test.net/) é o lugar perfeito para testar seus Hooks.
|
||||
</Aside>
|
||||
|
||||
### Formato do Log
|
||||
|
||||
Uma análise do formato de log aparece na tabela abaixo
|
||||
|
||||
| Parte | Descrição | # |
|
||||
| ------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - |
|
||||
| 2021-Apr-13 13:59:11.083700726 UTC View:TRC | Prefixo do `xahaud` para a linha de log | 1 |
|
||||
| HookTrace | Este é um rastreamento iniciado pelo próprio Hook, não alguma outra informação sobre o Hook. Outras informações estão disponíveis nas tags `HookError`, `HookEmit` e `HookInfo`. | 2 |
|
||||
| \[rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh | A primeira conta entre colchetes é a Conta Hook. | 3 |
|
||||
| -rE3SfnjwfzZFL3JK9cLVfJuy8Ar1XnCqPw]: | A segunda conta entre colchetes é a Conta de Origem. | 4 |
|
||||
| A number | Esta é a mensagem que o Hook foi instruído a entregar antes da carga de rastreamento | 5 |
|
||||
| 10 | Esta é a carga de rastreamento | 6 |
|
||||
|
||||
<Aside type="tip">
|
||||
O `Xahaud` produz muita saída. Portanto, geralmente é aconselhável filtrar os logs pela(s) conta(s) de seu interesse.
|
||||
|
||||
Por exemplo: `tail -f log | grep HookTrace | grep <conta>`
|
||||
</Aside>
|
||||
@@ -0,0 +1,64 @@
|
||||
---
|
||||
title: Transações Emitidas
|
||||
description: Seu Hook pode fazer muito mais do que apenas bloquear ou permitir transações!
|
||||
---
|
||||
import { Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### Contexto
|
||||
|
||||
**Todas** as mudanças feitas no Xahau _devem_ ser resultado da aplicação de uma transação válida ao ledger. Assim, se alguma mudança _X_ é feita, então alguma transação _Y_ é responsável.
|
||||
|
||||
Ao projetar a API de Hooks, precisávamos de uma forma para que os Hooks fizessem mudanças no ledger _além_ de simplesmente aceitar ou rejeitar uma transação. No entanto, anexar essas mudanças à Transação de Origem era confuso e resultava em um grande aumento na complexidade geral do sistema.
|
||||
|
||||
Suponha, por exemplo, que um Hook precise enviar alguns fundos para você... a operação de envio seria efetivamente aplicada ao ledger pela Transação de Origem, que poderia ser algo completamente não relacionado, como uma transação AccountSet. Adicionalmente, essa operação de envio precisaria ser capaz de potencialmente acionar outro Hook no lado receptor de um pagamento.
|
||||
|
||||
A solução: **Transações Emitidas**. Permitimos que a Transação de Origem faça exatamente o que o conteúdo da Transação diz que fará. Se nosso Hook precisar fazer uma mudança adicional no ledger, como enviar um pagamento, ele cria e então _emite_ uma nova transação.
|
||||
|
||||
### O que são Transações Emitidas?
|
||||
|
||||
Transações Emitidas são _novas_ transações criadas pela execução de um Hook e inseridas no consenso para processamento no próximo ledger. A transação pode ser de qualquer Tipo de Transação, mas deve seguir regras de emissão estritas.
|
||||
|
||||
Para emitir uma transação, o Hook primeiro prepara a transação serializada e então chama [emit](/pt-br/docs/hooks/functions/emitted-transaction/emit-1).
|
||||
|
||||
Como as transações emitidas podem acionar Hooks no próximo ledger que, por sua vez, podem emitir mais transações, todas as transações emitidas carregam um campo `burden` e um campo `generation` em seu bloco `EmitDetails`. O bloco `EmitDetails` substitui o campo de assinatura em uma transação tradicional.
|
||||
|
||||
Os campos `burden` e `generation` coletivamente previnem ataques de [Fork bomb](https://en.wikipedia.org/wiki/Fork_bomb) ao ledger, aumentando exponencialmente o custo de transações emitidas em expansão exponencial.
|
||||
|
||||
É importante notar que a API de Hooks segue a regra estrita de _nenhuma reescrita_. Você _deve_ apresentar uma transação emitida de forma completa, válida e canônica ao xahaud para emissão, ou ela será rejeitada. Não é responsabilidade do xahaud construir sua transação. O Hook deve fazer isso por conta própria.
|
||||
|
||||
### Callbacks
|
||||
|
||||
Como introduzido em [Introdução e Terminologia](/pt-br/docs/hooks/concepts/terminology), as transações emitidas acionam callbacks quando são aceitas em um ledger. Devido à natureza descentralizada do consenso, a aceitação em um ledger de uma transação emitida **não é uma garantia**, embora seja geralmente quase garantida.
|
||||
|
||||
Se uma transação emitida expirar antes de ser aceita em um ledger (por qualquer número de razões: os ledgers podem estar cheios, a taxa pode ser muito alta para a transação emitida, ou a transação emitida pode ser de alguma forma inválida), então uma _pseudo transação_ é criada no ledger para limpar a transação emitida. Essa pseudo transação também chama o callback do seu hook, com `parameter = 1` para indicar que a transação emitida de fato falhou.
|
||||
|
||||
### Regras de Emissão
|
||||
|
||||
A [emit](/pt-br/docs/hooks/functions/emitted-transaction/emit-1) Hook API aplicará as seguintes regras em uma transação proposta (a ser emitida).
|
||||
|
||||
| # | Regra de Emissão | Explicação |
|
||||
| - | ------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 1 | `sfSequence` = 0 | Transações Emitidas _não_ incrementam o número de sequência da Conta Hook. Deve ser sempre definido como zero. |
|
||||
| 2 | `sfPubSigningKey` = 0 | Transações Emitidas não são assinadas, mas este é um campo obrigatório para o processamento pelo xrpld. Deve ser definido como todos zeros. |
|
||||
| 3 | `sfEmitDetails` presente e válido | Transações Emitidas requerem um bloco `sfEmitDetails` que deve ser preenchido corretamente. Veja a seção EmitDetails abaixo. |
|
||||
| 4 | `sfSignature` ausente | Este campo deve estar ausente na transação emitida, pois caso contrário a transação seria ambígua. |
|
||||
| 5 | `LastLedgerSequence` válido e no futuro | Todas as transações emitidas devem ter um last ledger sequence definido para que o Hook saiba se a transação emitida falhou (pois não recebeu um callback a tempo). Atualmente está definido com um máximo de 5 ledgers após o ledger atual. |
|
||||
| 6 | `FirstLedgerSequence` válido e definido para o próximo ledger | Todas as transações emitidas devem ter um first ledger sequence definido para o próximo ledger (após o ledger atual) para que os Hooks não entrem em cascata recursiva dentro de um único ledger. Atualmente é aplicado como o próximo ledger após o ledger atual. |
|
||||
| 7 | Taxa calculada e definida adequadamente | A taxa depende do tamanho da transação emitida e da carga na rede (ou seja, se essa transação emitida foi resultado de outra transação emitida.) |
|
||||
| 8 | Limite de geração não excedido | Uma transação emitida pode produzir outras transações emitidas, e estas podem formar uma cadeia. O comprimento da cadeia é o `sfEmitGeneration`. Atualmente está limitado a 10. |
|
||||
|
||||
### Bloco EmitDetails
|
||||
|
||||
Todas as transações emitidas devem conter um objeto `sfEmitDetails` corretamente preenchido com os campos da tabela abaixo.
|
||||
|
||||
| Campo | Valor Necessário | Descrição |
|
||||
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| sfEmitGeneration | <p>Se a Transação de Origem foi ela própria uma transação emitida, então um a mais que o <code>sfEmitGeneration</code> dessa transação.<br /><br />Se a Transação de Origem não foi uma transação emitida, então <code>1</code>.<br /><br />Deve ser preenchido usando <a href="/pt-br/docs/hooks/functions/emitted-transaction/etxn_generation">etxn_generation</a>.</p> | Este campo rastreia uma cadeia de transações emitidas que, por sua vez, causam a emissão de outras transações. |
|
||||
| sfEmitBurden | <p>Se a Transação de Origem foi ela própria uma transação emitida, então o <code>burden</code> da Transação de Origem multiplicado pelo número máximo de transações que o Hook declarou que emitirá usando <a href="/pt-br/docs/hooks/functions/emitted-transaction/etxn_reserve">etxn_reserve</a>.<br /><br />Se a Transação de Origem não foi uma transação emitida, então <code>1</code>.<br /><br />Deve ser preenchido usando <a href="/pt-br/docs/hooks/functions/emitted-transaction/etxn_burden">etxn_burden</a>.</p> | Este campo é uma heurística para detectar forkbombs. As taxas são baseadas no burden e aumentarão exponencialmente quando uma reação em cadeia é iniciada, para evitar que a rede seja sobrecarregada por transações emitidas auto-reforçadas. |
|
||||
| sfEmitParentTxnID | O ID da transação de origem | A Execução do Hook que emitiu a transação está conectada à Transação de Origem. Portanto, este campo é sempre necessário para o rastreamento eficiente do comportamento. |
|
||||
| sfEmitNonce | Um nonce determinístico especial produzido por uma chamada a [nonce](/pt-br/docs/hooks/functions/emitted-transaction/etxn_nonce) | Transações Emitidas seriam idênticas com os mesmos campos e, portanto, teriam hashes de transação idênticos se um nonce não fosse usado. No entanto, cada nó da rede precisa concordar com o nonce, então uma API especial de Hook para produzir um nonce determinístico é disponibilizada. |
|
||||
| sfEmitCallback | O ID de 20 bytes da Conta Hook | Este campo é usado pelo xahaud quando precisa iniciar um callback, para que saiba qual Hook e conta iniciar o callback. Callbacks ocorrem quando uma transação emitida é aceita em um ledger. |
|
||||
|
||||
<Aside type="tip" title="Confira os exemplos">
|
||||
Os [Hooks de Exemplo](https://github.com/XRPL-Labs/xrpld-hooks/tree/hooks-ssvm/hook-api-examples), em particular Peggy, Carbon e Doubler, demonstram como emitir transações simples e mais complexas.
|
||||
</Aside>
|
||||
@@ -0,0 +1,20 @@
|
||||
---
|
||||
title: Metadados de Execução
|
||||
description: O que esperar quando seu Hook é executado.
|
||||
---
|
||||
|
||||
Quando os Hooks são executados, deixam para trás informações sobre o status dessa execução. Isso aparece nos metadados da Transação de Origem como um bloco `sfHookExecutions`. Esse bloco contém os seguintes campos:
|
||||
|
||||
|
||||
|
||||
| Campo | Descrição |
|
||||
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| sfHookResult | <p>Os Hooks podem terminar de três formas: <code>accept</code>, <code>rollback</code> e <code>error</code>.<br />Isso <em>não</em> é o mesmo que sfHookReturnCode!</p> |
|
||||
| sfHookHash | O SHA512H do Hook no momento em que foi executado. |
|
||||
| sfHookAccount | A conta onde o Hook foi executado. |
|
||||
| sfHookReturnCode | O inteiro retornado como o terceiro parâmetro de `accept` ou `rollback`. |
|
||||
| sfHookReturnString | A string retornada nos dois primeiros parâmetros de `accept` ou `rollback`, se houver. |
|
||||
| sfHookInstructionCount | O número total de instruções webassembly executadas quando o Hook rodou. |
|
||||
| sfHookEmitCount | O número total de [Transações Emitidas](/pt-br/docs/hooks/concepts/emitted-transactions) produzidas pelo Hook. |
|
||||
| sfHookExecutionIndex | A ordem em que o Hook foi executado (distinto de outras Execuções de Hook na mesma Transação de Origem.) |
|
||||
| sfHookStateChangeCount | O número de mudanças de [Estado do Hook](/pt-br/docs/hooks/concepts/state-management) que o Hook realizou durante a execução. |
|
||||
@@ -0,0 +1,97 @@
|
||||
---
|
||||
title: Números de Ponto Flutuante (XFL)
|
||||
description: Cálculos de alta precisão são nativos dos Hooks.
|
||||
---
|
||||
import { Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### Contexto
|
||||
|
||||
[Números de ponto flutuante](https://en.wikipedia.org/wiki/Floating-point_arithmetic) são amplamente usados em ciência da computação para realizar cálculos de precisão finita mas escala arbitrária.
|
||||
|
||||
A maioria das CPUs modernas é capaz de realizar operações de ponto flutuante rápidas usando o [padrão IEEE de ponto flutuante binário](https://en.wikipedia.org/wiki/Double-precision_floating-point_format), no entanto o `xahaud` **não** usa esse formato. Em vez disso, o Xahau usa um [padrão de ponto flutuante decimal personalizado](/pt-br/docs/protocol-reference/binary-format).
|
||||
|
||||
Esse formato personalizado tem três propriedades básicas:
|
||||
|
||||
1. O formato é inerentemente decimal, expresso como uma `mantissa` decimal multiplicada por `10` elevado à potência de um `expoente`.
|
||||
2. Todos os valores expressos têm 16 algarismos significativos (decimais).
|
||||
3. O intervalo de expoentes é de `-96` a `+80`
|
||||
|
||||
Quando serializado, a mantissa tem 54 bits e o expoente tem 8 bits, com um bit de sinal final trazendo o tamanho total do ponto flutuante serializado para 63 bits.
|
||||
|
||||
### O que é XFL?
|
||||
|
||||
[XLS-17d](https://github.com/XRPLF/XRPL-Standards/discussions/39) é uma proposta de padrões XRPL que define uma forma eficiente de empacotar e armazenar números de ponto flutuante do xrpld (conforme descrito acima).
|
||||
|
||||
Os XFLs armazenam os bits do número de ponto flutuante dentro de um _número envolvente_. Este é sempre um `int64_t`. Números envolventes negativos representam XFLs inválidos (por exemplo, como resultado de uma divisão por zero.)
|
||||
|
||||
<Aside type="tip">
|
||||
Use a ferramenta XFL <a href="https://richardah.github.io/xfl-tools/" target="_blank" rel="noopener">aqui</a> para compor e decompor XFLs no seu navegador!
|
||||
</Aside>
|
||||
|
||||
Alguns exemplos de XFLs a seguir
|
||||
|
||||
| Valor de Ponto Flutuante | Número Envolvente | Representação |
|
||||
| ------------------- | ------------------- | ----------------------------- |
|
||||
| -1 | 1478180677777522688 | -1000000000000000 \* 10^(-15) |
|
||||
| 0 | 0 | 0 (_zero canônico_) |
|
||||
| 1 | 6089866696204910592 | +1000000000000000 \* 10^(-15) |
|
||||
| _PI_ | 6092008288858500385 | +3141592653589793 \* 10^(-15) |
|
||||
| -_PI_ | 1480322270431112481 | -3141592653589793 \* 10^(-15) |
|
||||
|
||||
Este formato é muito conveniente para Hooks, pois os Hooks só podem trocar valores _inteiros_ com o xrpld. Ao encapsular o ponto flutuante dentro de um inteiro de forma bem definida, torna-se possível realizar computações complexas de ponto flutuante a partir de um Hook. Isso é útil para calcular taxas de câmbio.
|
||||
|
||||
### Zero Canônico
|
||||
|
||||
Regimes de ponto flutuante tipicamente têm várias formas de expressar zero, o que pode ser um problema ao testar por zero. Por exemplo, `0 x 10 ^ 1` é zero e `0 x 10 ^ 2` também é zero. Por essa razão, há um zero canônico imposto pelo padrão e pela API de Hooks. O zero canônico é também o número envolvente zero (`0`).
|
||||
|
||||
### API Float de Hooks
|
||||
|
||||
Uma vez que você tem um XFL, pode usar a API Float para fazer várias computações. A API Float aparece na tabela abaixo. Cada API aceita um ou mais números envolventes XFL e retorna um número envolvente XFL. Valores de retorno negativos _sempre_ representam um erro computacional (como divisão por zero). Não existem números envolventes negativos válidos.
|
||||
|
||||
| API de Hook | O que faz |
|
||||
| ----------------------------------------------------------------------- | --------------------------------------------------------------------- |
|
||||
| [float_set](/pt-br/docs/hooks/functions/float/float_set) | Cria um float a partir de um expoente e mantissa |
|
||||
| [float_multiply](/pt-br/docs/hooks/functions/float/float_multiply) | Multiplica dois números XFL |
|
||||
| [float_mulratio](/pt-br/docs/hooks/functions/float/float_mulratio) | Multiplica um XFL por um numerador e denominador não-XFL |
|
||||
| [float_negate](/pt-br/docs/hooks/functions/float/float_negate) | Nega um número XFL de ponto flutuante |
|
||||
| [float_compare](/pt-br/docs/hooks/functions/float/float_compare) | Realiza uma comparação entre dois números XFL de ponto flutuante |
|
||||
| [float_sum](/pt-br/docs/hooks/functions/float/float_sum) | Soma dois números XFL |
|
||||
| [float_sto](/pt-br/docs/hooks/functions/float/float_sto) | Gera um XFL como um objeto serializado |
|
||||
| [float_sto_set](/pt-br/docs/hooks/functions/float/float_sto_set) | Lê um valor serializado em um XFL |
|
||||
| [float_invert](/pt-br/docs/hooks/functions/float/float_invert) | Divide 1 por um número XFL de ponto flutuante |
|
||||
| [float_divide](/pt-br/docs/hooks/functions/float/float_divide) | Divide um XFL por outro número XFL de ponto flutuante |
|
||||
| [float_one](/pt-br/docs/hooks/functions/float/float_one) | Retorna o número 1 representado em um número envolvente XFL |
|
||||
| [float_exponent](/pt-br/docs/hooks/functions/float/float_exponent) | Obtém o expoente de um número envolvente XFL |
|
||||
| [float_mantissa](/pt-br/docs/hooks/functions/float/float_mantissa) | Obtém a mantissa de um número envolvente XFL |
|
||||
| [float_sign](/pt-br/docs/hooks/functions/float/float_sign) | Obtém o sinal de um número envolvente XFL |
|
||||
| float_exponent_set | Define o expoente de um número envolvente XFL |
|
||||
| float_mantissa_set | Define a mantissa de um número envolvente XFL |
|
||||
| float_sign_set | Define o sinal de um número envolvente XFL |
|
||||
| [float_int](/pt-br/docs/hooks/functions/float/float_int) | Converte um XFL de ponto flutuante em um inteiro (floor) |
|
||||
| [float_root](/pt-br/docs/hooks/functions/float/float_root) | Calcula a n-ésima raiz de um XFL |
|
||||
| [float_log](/pt-br/docs/hooks/functions/float/float_log) | Calcula o logaritmo decimal de um XFL |
|
||||
|
||||
<Aside type="caution">
|
||||
Você nunca deve fazer nenhuma matemática direta ou comparação no _número envolvente_. Isso quase sempre resultará em computações incorretas.
|
||||
|
||||
A _única exceção_ é verificar o zero canônico.
|
||||
</Aside>
|
||||
|
||||
### Exemplo
|
||||
|
||||
No exemplo abaixo, uma conversão de taxa de câmbio é realizada, seguida por uma multiplicação de fração de alta precisão.
|
||||
|
||||
```c
|
||||
int64_t max_vault_pusd =
|
||||
float_multiply(vault_xrp, exchange_rate);
|
||||
|
||||
max_vault_pusd =
|
||||
float_mulratio(max_vault_pusd, 0,
|
||||
NEW_COLLATERALIZATION_NUMERATOR, NEW_COLLATERALIZATION_DENOMINATOR);
|
||||
```
|
||||
|
||||
<Aside type="tip">
|
||||
Se uma API float retorna um valor negativo e você não verifica por negativos, então passar esse valor negativo para outra API float também produzirá um valor negativo. Dessa forma, os erros se propagam de forma similar ao `NaN` (não é um número) em outras linguagens.
|
||||
|
||||
Se você terminar com um número envolvente negativo, ocorreu um erro em algum lugar nos seus cálculos de ponto flutuante.
|
||||
</Aside>
|
||||
90
src/content/docs/pt-br/docs/hooks/concepts/grants.mdx
Normal file
90
src/content/docs/pt-br/docs/hooks/concepts/grants.mdx
Normal file
@@ -0,0 +1,90 @@
|
||||
---
|
||||
title: Concessões
|
||||
description: Concessões de Hook
|
||||
---
|
||||
import { Aside } from '@astrojs/starlight/components';
|
||||
|
||||
<Aside type="caution">
|
||||
A maioria dos desenvolvedores de Hooks raramente precisará usar HookGrants, e deve exercer extrema cautela ao conceder permissão de mutação de estado a Hooks e contas externas.
|
||||
|
||||
Embora uma HookGrant não possa ser usada para roubar fundos diretamente, a modificação externa intencional do Estado de um Hook pode levar o Hook a se comportar de forma não intencional, o que em alguns casos poderia levar a um roubo.
|
||||
|
||||
Se você acha que precisa usar uma Concessão, por favor verifique novamente seu design primeiro para garantir que realmente precisa usar uma antes de continuar.
|
||||
</Aside>
|
||||
|
||||
### Concessões
|
||||
|
||||
As Concessões fornecem uma maneira para um Instalador de Hook atribuir permissões de [Gerenciamento de Estado](/pt-br/docs/hooks/concepts/state-management) a um Hook _externo_ em outras contas Xahau.
|
||||
|
||||
Uma [Transação SetHook](/pt-br/docs/hooks/concepts/sethook-transaction) pode especificar um array `HookGrants` dentro de qualquer objeto `Hook` em seu array `Hooks`. O array `HookGrants` contém um ou mais objetos `HookGrant` (até 8).
|
||||
|
||||
Ao contrário dos [Parâmetros](/pt-br/docs/hooks/concepts/parameters), o array `HookGrants` é sempre definido exatamente como especificado na [Transação SetHook](/pt-br/docs/hooks/concepts/sethook-transaction). Portanto, se você deseja atualizar um `HookGrant` específico enquanto mantém múltiplas outras entradas `HookGrant` que foram definidas anteriormente, você deve primeiro obter o antigo array `HookGrants`, modificá-lo e depois reenviar o array completo em uma [_Operação de Atualização_](/pt-br/docs/hooks/concepts/sethook-transaction).
|
||||
|
||||
Para excluir todas as Concessões, envie um array `HookGrants` vazio.
|
||||
|
||||
<Aside type="caution">
|
||||
Ao contrário dos [Parâmetros](/pt-br/docs/hooks/concepts/parameters), o array `HookGrants` é sempre definido exatamente como especificado na [Transação SetHook](/pt-br/docs/hooks/concepts/sethook-transaction).
|
||||
</Aside>
|
||||
|
||||
Uma Concessão permite que uma conta XRPL externa ou um Hook modifique o Estado do Hook dentro do namespace do Hook específico para o qual a Concessão é definida.
|
||||
|
||||
A HookGrant deve especificar pelo menos:
|
||||
|
||||
* `HookHash`\
|
||||
E também pode especificar uma conta:
|
||||
* `Authorize`
|
||||
|
||||
Somente o Hook especificado por HookHash pode modificar o Estado do Hook dentro do namespace do Hook para o qual a HookGrant é especificada. Se `Authorize` for especificado, então essa permissão é restringida ainda mais apenas ao Hook especificado pelo HookHash quando instalado na conta especificada por `Authorize`.
|
||||
|
||||
<Aside type="tip">
|
||||
As Concessões se aplicam apenas a Hooks externos e nunca limitam a operação dos Hooks em relação ao Estado do Hook na conta em que estão instalados.
|
||||
</Aside>
|
||||
|
||||
### Exemplo
|
||||
|
||||
```json
|
||||
Account: "rALicebv3hMYNBWtu1VEEWkToArgYsYERs",
|
||||
TransactionType: "SetHook",
|
||||
Hooks:
|
||||
[
|
||||
{
|
||||
Hook: {
|
||||
...,
|
||||
HookNamespace: "3963ADEB1B0E8934C0963680531202FD511FF1E16D5864402C2DA63861C420A8",
|
||||
HookGrants:
|
||||
[
|
||||
{
|
||||
HookGrant: // primeira concessão
|
||||
{
|
||||
HookHash: "78CAF69EEE950A6C55A450AC2A980DE434D624CD1B13148E007E28B7B6461CC8"
|
||||
},
|
||||
HookGrant: // segunda concessão
|
||||
{
|
||||
Authorize: "rCLairev2ma2gNZdcHJeTk7fCQ1ki84vr9",
|
||||
HookHash: "A5B8D62154DA1C329BE13582086B52612476720CEBD097EB85CEE1455E1C70A6"
|
||||
}
|
||||
},
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
...
|
||||
```
|
||||
|
||||
A _primeira concessão_ acima permite:
|
||||
|
||||
* qualquer instância do Hook cujo código gera o hash `78CAF69EEE950A6C55A450AC2A980DE434D624CD1B13148E007E28B7B6461CC8`
|
||||
* executando em **qualquer conta**
|
||||
* modificar o Estado do Hook da conta `rALicebv3hMYNBWtu1VEEWkToArgYsYERs`
|
||||
* dentro do Namespace `3963ADEB1B0E8934C0963680531202FD511FF1E16D5864402C2DA63861C420A8`
|
||||
|
||||
A _segunda concessão_ acima permite:
|
||||
|
||||
* qualquer instância do Hook cujo código gera o hash `A5B8D62154DA1C329BE13582086B52612476720CEBD097EB85CEE1455E1C70A6`
|
||||
* mas somente quando executado na conta `rCLairev2ma2gNZdcHJeTk7fCQ1ki84vr9`
|
||||
* modificar o Estado do Hook da conta `rALicebv3hMYNBWtu1VEEWkToArgYsYERs`
|
||||
* dentro do Namespace `3963ADEB1B0E8934C0963680531202FD511FF1E16D5864402C2DA63861C420A8`
|
||||
|
||||
### Usando a Concessão
|
||||
|
||||
Para fazer uso de uma concessão, um Hook modifica objetos de Estado em uma conta externa chamando [state_foreign_set](/pt-br/docs/hooks/functions/state/state_foreign_set).
|
||||
64
src/content/docs/pt-br/docs/hooks/concepts/hook-fees.mdx
Normal file
64
src/content/docs/pt-br/docs/hooks/concepts/hook-fees.mdx
Normal file
@@ -0,0 +1,64 @@
|
||||
---
|
||||
title: Taxas de Hook
|
||||
description: O que esperar quando seu Hook é executado.
|
||||
---
|
||||
### Taxas de Criação de Hook
|
||||
|
||||
As transações SetHook são cobradas por byte de webassembly criado. A taxa é de 500 drops por byte. Assim, um Hook de 1kib custará 0,5 XAH para criar.
|
||||
|
||||
### Taxas de Execução de Hook
|
||||
|
||||
Quando os Hooks são [Fortemente Executados](/pt-br/docs/hooks/concepts/weak-and-strong), a transação de origem deve pagar pelas Execuções Fortes na taxa da transação de origem.
|
||||
|
||||
As taxas de execução de Hook são cobradas a uma taxa de 1 drop por instrução web assembly na execução de pior caso da função `hook` (ou `cbak` no caso de um callback). Assim, um Hook pequeno com muito looping pode acabar atraindo taxas de execução altas.
|
||||
|
||||
### Auxiliar RPC de Taxa
|
||||
|
||||
As taxas de transação em um ledger com a Emenda de Hooks habilitada tornam-se não triviais de calcular para usuários finais e/ou aplicações de carteira. Isso ocorre porque os hooks fortes devem ser pagos pelo originador de uma transação, e pode haver até 4 hooks fortes na conta de envio e 4 na conta de recebimento, além de quaisquer outras partes interessadas transacionais fortes envolvidas (como pode ser o caso com alguns tipos de transação exóticos). Além disso, se a transação for um SetHook, o tamanho dos parâmetros, o tamanho do código e se é uma operação de _criação_ ou _instalação_ determinam o tamanho da taxa.
|
||||
|
||||
Portanto, é altamente recomendável que **todas** as transações sejam processadas pela chamada RPC de taxa atualizada antes de serem enviadas ao ledger.
|
||||
|
||||
Para invocar a chamada RPC:
|
||||
|
||||
1. Abra uma conexão websocket com o nó Hooks com o qual você trabalhará.
|
||||
2. Componha a transação serializada para a qual deseja saber a taxa com o seguinte:
|
||||
|
||||
* `Fee: "0"`
|
||||
* `SigningPubKey: ""` (Ou seja: VL de 0 bytes do tipo 0x73. Em hex:`0x7300`.)
|
||||
* **Não** assine a transação.
|
||||
|
||||
3. Envie como um blob hexadecimal para o RPC da seguinte forma:
|
||||
|
||||
```json
|
||||
{"command":"fee", "tx_blob":"<hex blob>"}
|
||||
```
|
||||
|
||||
Para HTTP POST RPC, envie da seguinte forma:
|
||||
|
||||
```json
|
||||
{"method":"fee", "params": [{"tx_blob":"<hex blob>"}] }
|
||||
```
|
||||
|
||||
A resposta deve parecer algo como
|
||||
|
||||
```json
|
||||
{
|
||||
result: {
|
||||
drops: {
|
||||
base_fee: '130520',
|
||||
},
|
||||
//...
|
||||
},
|
||||
type: 'response'
|
||||
}
|
||||
```
|
||||
|
||||
Pegue a taxa base e defina-a como o campo `Fee` na transação. Agora assine e envie conforme o processo normal de envio de transação.
|
||||
|
||||
Se houver um valor inválido para `tx_blob` ou `tx_blob` estiver ausente, um resultado JSON regular será retornado com um `base_fee` de 10.
|
||||
|
||||
### Taxas de Emissão
|
||||
|
||||
Os Hooks têm acesso ao mesmo cálculo que o _Auxiliar RPC de Taxa_ faz. Para usar isso, basta chamar [etxn_fee_base](/pt-br/docs/hooks/functions/emitted-transaction/etxn_fee_base) com um buffer contendo a transação serializada como argumentos. Assim como na chamada RPC, você deve garantir que o campo `Fee` esteja presente na transação serializada. O valor é irrelevante.
|
||||
|
||||
Quando `etxn_fee_base` retornar a taxa recomendada, você pode usar [sto_emplace](/pt-br/docs/hooks/functions/serialization/sto_emplace) para inseri-la na transação serializada antes da emissão. O campo relevante é `sfFee`.
|
||||
44
src/content/docs/pt-br/docs/hooks/concepts/hookon-field.mdx
Normal file
44
src/content/docs/pt-br/docs/hooks/concepts/hookon-field.mdx
Normal file
@@ -0,0 +1,44 @@
|
||||
---
|
||||
title: Campo HookOn
|
||||
description: Especifique em quais tipos de transação um Hook deve ser acionado
|
||||
---
|
||||
import { LinkCard } from '@astrojs/starlight/components';
|
||||
|
||||
### Entendendo o campo HookOn
|
||||
|
||||
Cada bit nesse inteiro sem sinal de 256 bits indica se o Hook deve ser executado em um tipo de transação específico. Todos os bits são _ativos em baixo_ **exceto** o bit 22, que é _ativo em alto_. Como 22 é ttHOOK_SET, isso significa que o valor padrão de todos os 0s não será disparado em uma transação SetHook, mas será disparado em todos os outros tipos de transação. Esta é uma escolha de design deliberada para ajudar as pessoas a evitar bloquear sua conta Xahau com um hook com mau funcionamento.
|
||||
|
||||
Os bits são numerados da direita para a esquerda:
|
||||
|
||||
* bit 0 - mais à direita, ou seja, o bit menos significativo.
|
||||
* bit 63 - mais à esquerda, ou seja, o bit mais significativo.
|
||||
|
||||
Exemplos (assumindo um tipo inteiro sem sinal de 256 bits):
|
||||
|
||||
1. Se quisermos desativar completamente o hook:
|
||||
|
||||
```c
|
||||
~(1ULL << 22) /* todo bit é 1 exceto o bit 22 que é 0 */
|
||||
```
|
||||
|
||||
2. Se quisermos desativar o hook em tudo exceto ttPAYMENT:
|
||||
|
||||
```c
|
||||
~(1ULL << 22) & ~(1ULL)
|
||||
```
|
||||
|
||||
3. Se quisermos habilitar o hook em tudo exceto ttHOOK_SET
|
||||
|
||||
```c
|
||||
0
|
||||
```
|
||||
|
||||
4. Se quisermos habilitar o disparo do hook em ttHOOK_SET (perigoso) e em todos os outros tipos de transação:
|
||||
|
||||
```c
|
||||
(1ULL << 22)
|
||||
```
|
||||
|
||||
### Calculadora HookOn
|
||||
|
||||
<LinkCard title="Calculadora HookOn" href="https://richardah.github.io/xrpl-hookon-calculator/" />
|
||||
@@ -0,0 +1,24 @@
|
||||
---
|
||||
title: Exemplo de Uso
|
||||
---
|
||||
Por favor, leia [a introdução sobre Hooks neste blog](https://coil.com/p/XUMM/XRPL-Labs-is-working-on-the-transaction-HOOKS-amendment-for-the-XRP-Ledger-Supporting-business-logic/kEmqhoqMW).
|
||||
|
||||
Durante o desenvolvimento dos Hooks, publicamos uma série de artigos sobre nosso progresso, aprendizados e conceitos relacionados. Você pode [ler tudo isso em nossos blogs no Dev.to](https://dev.to/t/xrplhooks/top/infinity).
|
||||
|
||||
### Exemplos (cenários)
|
||||
|
||||
#### 1. Hook de recebimento executa lógica adicional
|
||||
|
||||

|
||||
|
||||
#### 2. Hook de recebimento bloqueia transação de entrada
|
||||
|
||||

|
||||
|
||||
#### 3. Hook de envio bloqueia transação de saída
|
||||
|
||||

|
||||
|
||||
#### 4. Hook controla uma conta institucional
|
||||
|
||||

|
||||
@@ -0,0 +1,33 @@
|
||||
---
|
||||
title: Introdução
|
||||
---
|
||||
|
||||
import { Aside } from '@astrojs/starlight/components';
|
||||
|
||||
Os Hooks adicionam funcionalidade de contratos inteligentes ao Xahau: código personalizado na _camada um_ para influenciar o comportamento e o fluxo das transações. Hooks são pequenos e eficientes trechos de código definidos em uma conta Xahau, permitindo que lógica seja executada antes e/ou depois das transações Xahau.
|
||||
|
||||
<Aside type="note">
|
||||
Atenção: você está lendo a **documentação técnica** dos Hooks. Esta documentação é altamente técnica e pressupõe conhecimento prévio de programação e da Rede Xahau. Se você está procurando exemplos do que são os Hooks, o que trarão para a Rede Xahau e o que podem fazer, [acesse esta página](/pt-br/docs/hooks/concepts/introduction/example-usage).
|
||||
</Aside>
|
||||
|
||||
O Xahau é reconhecido e valorizado pelo seu throughput de transações, velocidade e taxas baixas. Combinado com tipos avançados de transações disponíveis como multi-assinatura, escrows, canais de pagamento e até uma exchange descentralizada (tudo no ledger, pronto para uso, sem necessidade de contratos inteligentes), o Xahau tem muito a oferecer a empresas e desenvolvedores criativos.
|
||||
|
||||
Os Hooks adicionam funcionalidade de contratos inteligentes ao Xahau: código personalizado na _camada um_ para influenciar o comportamento e o fluxo das transações. Hooks são pequenos e eficientes trechos de código definidos em uma conta Xahau, permitindo que lógica seja executada antes e/ou depois das transações Xahau. Esses Hooks podem ser bem simples, como: “rejeitar pagamentos menores que 10 XAH", ou “para todos os pagamentos de saída, enviar 10% para minha conta poupança", ou mais avançados.
|
||||
|
||||
<figure>
|
||||

|
||||
<figcaption>*Conceito de alto nível dos Hooks*</figcaption>
|
||||
</figure>
|
||||
|
||||
Ao permitir que os Hooks não apenas executem lógica eficiente, mas também armazenem objetos de dados simples e pequenos, é possível definir um Hook como: “para transações de pagamentos recebidos, verificar se a conta remetente está em uma lista mantida por outro Hook e, se estiver, rejeitar a transação".
|
||||
|
||||
Os Hooks são deliberadamente não Turing-Completos. Embora frequentemente anunciada como o santo graal dos contratos inteligentes, a Completude de Turing é, na verdade, inadequada para contratos inteligentes. (Veja o [Blog 2](https://dev.to/wietse/hooked-2-hooks-security-smart-contracts-on-the-xrp-ledger-83e).)
|
||||
|
||||
Os Hooks estão atualmente disponíveis em uma testnet pública. É hora de testar, programar, se divertir e quebrar coisas, para que uma futura emenda para adicionar os Hooks à rede principal do Xahau possa ser elaborada com confiança.
|
||||
|
||||
### Recursos
|
||||
|
||||
* [Xahau Testnet](https://xahau-test.net/)
|
||||
* [Xahau Testnet Explorer](https://explorer.xahau-test.net/)
|
||||
* [Exemplos (código-fonte)](https://github.com/XRPL-Labs/xrpld-hooks/tree/hooks-ssvm/hook-api-examples)
|
||||
* [Blogs sobre conceitos](https://dev.to/t/xrplhooks/top/infinity)
|
||||
@@ -0,0 +1,90 @@
|
||||
---
|
||||
title: Loops e Guardas
|
||||
description: Guardas são necessárias para realizar loops em um Hook.
|
||||
---
|
||||
import { Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### O que são guardas?
|
||||
|
||||
Os Hooks deliberadamente não são [Turing Completos](https://en.wikipedia.org/wiki/Turing_completeness). Isso significa que loops arbitrários são proibidos. Em vez disso, você deve _guardar_ seus loops com um limite rígido de "iteração máxima".
|
||||
|
||||
Uma guarda é um marcador colocado no seu código no início de cada loop. O marcador informa ao Xahau qual é o limite superior do seu loop _em todos os cenários possíveis_. Assim, se o seu loop normalmente executa duas vezes, mas às vezes executa _500_ vezes, sua guarda dirá 500.
|
||||
|
||||
As guardas são usadas pelo Xahau para determinar o _pior tempo de execução_ (em instruções) do seu Hook antes da execução. Esta é a base para a taxa que o Xahau cobra pela execução de um Hook e torna os tempos de execução previsíveis e controláveis.
|
||||
|
||||
<Aside type="tip">
|
||||
Desenvolvedores experientes migrando de outras plataformas de contratos inteligentes podem achar as guardas irritantes no início, mas uma vez que se acostumam, elas não são mais difíceis de usar do que um for-loop normal.
|
||||
</Aside>
|
||||
|
||||
### A função guard
|
||||
|
||||
A função guard informa ao ledger o **número máximo de iterações** que um loop realizará. Especificamente, a função aceita dois argumentos:
|
||||
|
||||
```c
|
||||
int32_t _g (uint32_t id, uint32_t maxiter);
|
||||
```
|
||||
|
||||
O primeiro argumento `id` é o identificador para esta guarda. Esta é uma constante única escolhida pelo desenvolvedor; tipicamente o número da linha no arquivo fonte é usado.
|
||||
|
||||
O segundo argumento `maxiter` é uma promessa que o desenvolvedor faz ao ledger de que esta guarda não será _acionada_ mais de `maxiter` vezes durante a execução do Hook. Se a chamada da guarda for executada mais do que esse número de vezes, o Hook fará automaticamente rollback com um `GUARD_VIOLATION` ([códigos de retorno da API de Hook](/pt-br/docs/hooks/functions/overview/return-codes)). Como a guarda será acionada _antes_ que a condição do loop seja verificada, é importante adicionar um ao número total de iterações esperadas. (Nota: A macro GUARD() já adiciona um).
|
||||
|
||||
<Aside type="caution">
|
||||
As guardas devem ser definidas usando literais numéricos. Você não pode usar uma variável ou valor de tempo de execução em uma Guarda.
|
||||
</Aside>
|
||||
|
||||
### Aplicação das guardas
|
||||
|
||||
Considere o seguinte for-loop em C:
|
||||
|
||||
```c
|
||||
#define GUARD(maxiter) _g(__LINE__, (maxiter)+1)
|
||||
for (int i = 0; GUARD(3), i < 3; ++i)
|
||||
{
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
Em C, o operador vírgula executa cada expressão em uma lista de expressões (por exemplo, `A, B, C`) e retorna a última expressão (por exemplo, `C`). Assim, a condição acima ainda é `i < 3`, mas a guarda é chamada antes que a condição seja verificada. Esta é a única forma de satisfazer a _regra da guarda_ ao usar um for-loop em C.
|
||||
|
||||
<Aside type="tip" title="A Regra da Guarda">
|
||||
Uma chamada a <code>_g</code> (a função guard) deve ser a primeira instrução de branch após uma instrução de loop.
|
||||
</Aside>
|
||||
|
||||
Abaixo aparece a saída webassembly quando o código acima é compilado. Note a função guard sendo chamada no início do loop. As únicas instruções permitidas antes desta chamada são instruções sem branch (tipicamente manipulando constantes).
|
||||
|
||||
```
|
||||
block ;; label = @1
|
||||
loop ;; label = @2
|
||||
i32.const 3
|
||||
i32.const 14
|
||||
=====> call $_g <=====
|
||||
drop
|
||||
...
|
||||
```
|
||||
|
||||
### Loops Aninhados
|
||||
|
||||
Ao usar loops aninhados, o argumento `maxiter` deve refletir o número total de vezes que a guarda será _acionada_. Isso significa que você deve multiplicar os aninhamentos juntos.
|
||||
|
||||
Considere o exemplo abaixo:
|
||||
|
||||
```c
|
||||
#define GUARD(maxiter) _g(__LINE__, (maxiter)+1)
|
||||
for (int i = 0; GUARD(3), i < 3; ++i)
|
||||
{
|
||||
for (int j = 0; GUARD(15), j < 5; ++j)
|
||||
{
|
||||
...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Note que a guarda do loop interno está definida como **15**. Você deve multiplicar os loops juntos para calcular o número máximo de vezes que uma guarda interna será acionada durante a execução do Hook.
|
||||
|
||||
### Sem recursão
|
||||
|
||||
Chamadas a funções que não são da API de Hook são proibidas na emenda de Hooks. Todo o código do usuário deve caber dentro das duas funções Hook permitidas `cbak` e `hook`.
|
||||
|
||||
<Aside type="caution">
|
||||
O não uso correto das guardas causará a rejeição de uma tentativa de transação <code>SetHook</code>.
|
||||
</Aside>
|
||||
41
src/content/docs/pt-br/docs/hooks/concepts/namespaces.mdx
Normal file
41
src/content/docs/pt-br/docs/hooks/concepts/namespaces.mdx
Normal file
@@ -0,0 +1,41 @@
|
||||
---
|
||||
title: Namespaces
|
||||
description: Evite colisão de estado usando o namespace correto
|
||||
---
|
||||
### Namespaces
|
||||
|
||||
Para evitar que dois ou mais Hooks instalados na mesma conta se sobreponham inadvertidamente ao [Estado do Hook](/pt-br/docs/hooks/concepts/state-management) um do outro, um namespace de 32 bytes deve ser fornecido ao criar ou instalar cada Hook.
|
||||
|
||||
O namespace pode ser qualquer valor arbitrário de 32 bytes que o desenvolvedor escolher. Desde que o namespace seja único na cadeia de Hooks, nenhuma colisão de estado ocorrerá.
|
||||
|
||||
Recomendamos fortemente o uso de `SHA256` sobre o nome de trabalho do desenvolvedor para o Hook. O SHA256 é um dos dois algoritmos de hash usados na derivação de endereços Xahau (a partir de uma chave mestre de conta) e, como tal, deve estar prontamente disponível para o desenvolvedor.
|
||||
|
||||
O campo `HookNamespace` é fornecido como um blob _hex_ de 32 bytes dentro de cada objeto `Hook` em um array `Hooks` ao [executar uma transação SetHook](/pt-br/docs/hooks/concepts/sethook-transaction).
|
||||
|
||||
O Namespace configurado sob o qual um Hook opera altera os [Keylets](/pt-br/docs/hooks/concepts/slots-and-keylets) sob os quais seu [Estado](/pt-br/docs/hooks/concepts/state-management) é armazenado. Portanto, dois Hooks sob dois Namespaces diferentes instalados na mesma conta Xahau podem usar a mesma chave de estado para se referir a objetos de estado diferentes. Por outro lado, dois Hooks diferentes usando o mesmo Namespace na mesma conta Xahau podem acessar e modificar os objetos de estado um do outro usando as mesmas chaves de estado.
|
||||
|
||||
### Exemplo
|
||||
|
||||
Em javascript, importar o `ripple-address-codec` fornece acesso ao SHA256.\
|
||||
(Também é possível usar `crypto.subtle` no navegador, ou `crypto.createHash` no node para acessar este algoritmo de hash.)
|
||||
|
||||
```js
|
||||
HookNamespace: addr.codec.sha256('carbon').toString('hex')
|
||||
```
|
||||
|
||||
### Namespace Padrão
|
||||
|
||||
O primeiro usuário a [definir um novo Hook](/pt-br/docs/hooks/concepts/sethook-transaction) define um `HookNamespace` que se torna o _Namespace Padrão_ para aquele Hook. Isso significa que qualquer usuário subsequente que [referenciar a mesma _HookDefinition_](/pt-br/docs/hooks/concepts/reference-counted-hook-definitions) receberá este Namespace originalmente definido por padrão.
|
||||
|
||||
O usuário subsequente pode especificar seu próprio Namespace, substituindo o Namespace Padrão apenas para sua instalação.
|
||||
|
||||
### APIs de Hook Afetadas
|
||||
|
||||
A escolha do HookNamespace afeta o comportamento das seguintes APIs de Hook:
|
||||
|
||||
* [state](/pt-br/docs/hooks/functions/state/state)
|
||||
* [state_set](/pt-br/docs/hooks/functions/state/state_set)
|
||||
|
||||
### Auxiliar de API de Namespace
|
||||
|
||||
Veja [account_info](/pt-br/docs/hooks/functions/websocket-apis/account_info) e [account_namespace](/pt-br/docs/hooks/functions/websocket-apis/account_namespace) para informações sobre como consultar o ledger em relação a namespaces.
|
||||
57
src/content/docs/pt-br/docs/hooks/concepts/parameters.mdx
Normal file
57
src/content/docs/pt-br/docs/hooks/concepts/parameters.mdx
Normal file
@@ -0,0 +1,57 @@
|
||||
---
|
||||
title: Parâmetros
|
||||
description: Parâmetros de tempo de instalação permitem que Hooks sejam genéricos e flexíveis
|
||||
---
|
||||
### Parâmetros
|
||||
|
||||
Os desenvolvedores de Hooks podem optar por usar _parâmetros de tempo de instalação_ (chamados Parâmetros de Hook) em seu Hook. Isso permite que instaladores subsequentes do Hook alterem certos comportamentos definidos pelo programador sem recompilar ou re-enviar o Hook (assumindo que pelo menos uma conta ainda [referencie](/pt-br/docs/hooks/concepts/reference-counted-hook-definitions) a definição de Hook existente).
|
||||
|
||||
Os Parâmetros de Hook são um conjunto de pares Chave-Valor definidos durante a [Transação SetHook](/pt-br/docs/hooks/concepts/sethook-transaction) e recuperáveis pelo Hook durante a execução. Tanto a chave `ParameterName` quanto o `ParameterValue` são definidos como blobs _hex_, com comprimento máximo de 32 bytes e 256 bytes, respectivamente.
|
||||
|
||||
Uma [Transação SetHook](/pt-br/docs/hooks/concepts/sethook-transaction) pode definir até _16_ Parâmetros de Hook por Hook instalado.
|
||||
|
||||
### Definindo Parâmetros
|
||||
|
||||
O array `HookParameters` é opcionalmente definido dentro de cada `Hook` no array `Hooks` conforme mostrado abaixo:
|
||||
|
||||
```json
|
||||
TransactionType: "SetHook",
|
||||
Hooks:
|
||||
[
|
||||
{
|
||||
Hook: {
|
||||
...,
|
||||
HookParameters:
|
||||
[
|
||||
{
|
||||
HookParameter:
|
||||
{
|
||||
HookParameterName: "ABCDEF12",
|
||||
HookParameterValue: "12345678"
|
||||
}
|
||||
},
|
||||
... // opcionalmente até mais 15 Parâmetros de Hook
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
...
|
||||
```
|
||||
|
||||
### Parâmetros Padrão
|
||||
|
||||
O primeiro usuário a [definir um novo Hook](/pt-br/docs/hooks/concepts/sethook-transaction) pode definir Parâmetros de Hook que então se tornam os _Parâmetros Padrão_ para aquele Hook. Isso significa que qualquer usuário subsequente que [referenciar a mesma _HookDefinition_](/pt-br/docs/hooks/concepts/reference-counted-hook-definitions) receberá esses Parâmetros de Hook originalmente definidos por padrão.
|
||||
|
||||
O usuário subsequente pode especificar seus próprios Parâmetros, substituindo os Parâmetros Padrão para sua instalação.
|
||||
|
||||
Para apagar um Parâmetro em uma instalação subsequente, especifique a chave `ParameterName` sem especificar uma chave `ParameterValue`.
|
||||
|
||||
### Usando Parâmetros em Hooks
|
||||
|
||||
Os parâmetros podem ser lidos pelos Hooks nos quais estão definidos usando [hook_param](/pt-br/docs/hooks/functions/hook-context/hook_param).
|
||||
|
||||
Se mais de um Hook estiver instalado em uma Cadeia de Hooks, então [hook_param_set](/pt-br/docs/hooks/functions/hook-context/hook_param_set) pode ser usado em circunstâncias limitadas para modificar os Parâmetros de Hook de um Hook mais adiante na cadeia na mesma conta.
|
||||
|
||||
### Parâmetros de Tempo de Execução
|
||||
|
||||
No Xahau e na testnet Xahau, os HookParameters também podem ser incluídos no nível superior de qualquer tipo de transação de acordo com as regras e limites de tamanho anteriores. Esses parâmetros podem ser acessados dentro de um hook usando a API [otxn_param](/pt-br/docs/hooks/functions/originating-transaction/otxn_param).
|
||||
@@ -0,0 +1,14 @@
|
||||
---
|
||||
title: Definições de Hook com Contagem de Referência
|
||||
description: Evite re-enviar o mesmo bytecode ao ledger
|
||||
---
|
||||
Quando o bytecode de web assembly de um novo Hook é enviado ao Xahau, uma carga significativa de armazenamento é imposta à rede. Essa carga de armazenamento se reflete nas [Taxas de Hook](/pt-br/docs/hooks/concepts/hook-fees) cobradas pela rede.
|
||||
|
||||
Para evitar essa carga (e taxas altas para usuários finais), a contagem de referência é utilizada:
|
||||
|
||||
* Na primeira vez que um novo Hook é instalado, a [Transação SetHook](/pt-br/docs/hooks/concepts/sethook-transaction) deve fornecer uma taxa significativa.
|
||||
* O bytecode de web assembly do Hook torna-se um objeto não proprietário com contagem de referência no ledger (chamado de `HookDefinition`).
|
||||
* Instalações subsequentes pelo mesmo ou outros usuários para um Hook idêntico (ou seja, com bytecode idêntico) incrementam a contagem de referência. Essas instalações apontam para o mesmo objeto no ledger. Essas transações são cobradas de forma similar à definição de uma Trust Line, pois a carga de armazenamento para o Hook já foi paga na transação Set Hook original.
|
||||
* Enquanto a contagem de referência na Definição do Hook for maior que zero (significando que uma ou mais contas ainda têm o Hook instalado), o objeto permanece no ledger.
|
||||
|
||||

|
||||
@@ -0,0 +1,54 @@
|
||||
---
|
||||
title: Objetos Serializados
|
||||
description: Manipule objetos xahaud serializados brutos!
|
||||
---
|
||||
### O que são Objetos Serializados?
|
||||
|
||||
O Xahau tem formas [serializadas](/pt-br/docs/protocol-reference/binary-format) canônicas de todos os objetos sujeitos ao consenso. Ao escrever um Hook, é inevitável que você se depare com objetos serializados. Estes se manifestam como buffers contendo o que pode parecer ao desenvolvedor como blobs binários opacos. Na verdade, você pode lê-los com o [XRPL-Binary-Visualiser](https://richardah.github.io/xrpl-binary-visualizer/).
|
||||
|
||||
Por exemplo, um campo `sfAmount` serializa para uma coleção de bytes como `61D50F26109A32B7EC`
|
||||
|
||||
### API de Objetos Serializados
|
||||
|
||||
Para auxiliar os desenvolvedores de Hooks a trabalhar com objetos serializados, o namespace `sto` foi criado dentro da API de Hooks. Essas funções manipulam ponteiros dentro de um buffer fornecido pelo Hook. Veja a tabela abaixo.
|
||||
|
||||
| API de Hook | O que faz |
|
||||
| --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
|
||||
| [sto_subfield](/pt-br/docs/hooks/functions/serialization/sto_subfield) | Indexa em um objeto serializado xrpld e retorna a localização e comprimento de um subcampo |
|
||||
| [sto_subarray](/pt-br/docs/hooks/functions/serialization/sto_subarray) | Indexa em um array serializado xrpld e retorna a localização e comprimento de um índice |
|
||||
| [sto_emplace](/pt-br/docs/hooks/functions/serialization/sto_emplace) | Insere um campo em um STObject existente em seu posicionamento canônico |
|
||||
| [sto_erase](/pt-br/docs/hooks/functions/serialization/sto_erase) | Remove um campo de um STObject |
|
||||
| [sto_validate](/pt-br/docs/hooks/functions/serialization/sto_validate) | Valida um STObject |
|
||||
|
||||
Onde aplicável, essas APIs retornam um _offset_ e um _comprimento_ codificados em um único int64_t. Veja a documentação individual para detalhes.
|
||||
|
||||
### Exemplo
|
||||
|
||||
Um cenário típico no qual você usaria a API STO é no processamento de memos em uma Transação de Origem. Como você provavelmente precisará de acesso ao memo completo de qualquer forma, uma forma eficiente de processar um conjunto de memos é simplesmente despejar o campo `sfMemos` inteiro em um buffer e então indexar dentro dele. Embora também seja possível usar a API de slot para fazer isso inserindo a Transação de Origem em um slot, isso resultaria em código adicional e cópia adicional.
|
||||
|
||||
```c
|
||||
#define SUB_OFFSET(x) ((int32_t)(x >> 32))
|
||||
#define SUB_LENGTH(x) ((int32_t)(x & 0xFFFFFFFFULL))
|
||||
#define SBUF(str) (uint32_t)(str), sizeof(str)
|
||||
|
||||
uint8_t memos[2048];
|
||||
int64_t memos_len = otxn_field(SBUF(memos), sfMemos);
|
||||
for (int i = 0; GUARD(3), i < 3; ++i)
|
||||
{
|
||||
int64_t memo_lookup = sto_subarray(memos, memos_len, i);
|
||||
if (memo_lookup < 0)
|
||||
rollback(SBUF("Memo lookup error"), 1);
|
||||
uint8_t* memo_ptr = SUB_OFFSET(memo_lookup) + memos;
|
||||
uint32_t memo_len = SUB_LENGTH(memo_lookup);
|
||||
// o acima agora aponta para o memo ... faça algo aqui
|
||||
}
|
||||
```
|
||||
|
||||
### Sobreposição com slots
|
||||
|
||||
Você pode notar alguma sobreposição entre as APIs de slot e as APIs STO. A diferença principal aqui é quem _possui_ os dados subjacentes:
|
||||
|
||||
* Se você estiver usando _slots_, então o xrpld possui o objeto com o qual você está interagindo.
|
||||
* Se você estiver usando a _API STO_, então o **Hook** possui o buffer com o qual você está interagindo.
|
||||
|
||||
Ambos os conjuntos de funções indexam em um Objeto Serializado sem cópias desnecessárias.
|
||||
@@ -0,0 +1,314 @@
|
||||
---
|
||||
title: Transação SetHook
|
||||
---
|
||||
### Transação SetHook
|
||||
|
||||
O bytecode webassembly de um Hook é instalado em uma conta Xahau usando a transação `SetHook`.
|
||||
|
||||
Um exemplo aparece abaixo:
|
||||
|
||||
```js
|
||||
{
|
||||
Account: "r4GDFMLGJUKMjNhhycgt2d5LXCdXzCYPoc",
|
||||
TransactionType: "SetHook",
|
||||
Fee: "2000000",
|
||||
Hooks:
|
||||
[
|
||||
{
|
||||
Hook: {
|
||||
CreateCode: fs.readFileSync('accept.wasm').toString('hex').toUpperCase(),
|
||||
HookOn: '0000000000000000',
|
||||
HookNamespace: addr.codec.sha256('accept').toString('hex').toUpperCase(),
|
||||
HookApiVersion: 0
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
A transação é enganosamente simples, mas esconde uma complexidade significativa, descrita abaixo.
|
||||
|
||||
### Array Hooks
|
||||
|
||||
O corpo principal da transação SetHook é o array hooks:
|
||||
|
||||
```js
|
||||
{
|
||||
Account: "r4GDFMLGJUKMjNhhycgt2d5LXCdXzCYPoc",
|
||||
TransactionType: "SetHook",
|
||||
Hooks: // Este é o Array Hooks
|
||||
[
|
||||
{ Hook: { ... } }, // Objeto HookSet (posição 0)
|
||||
{ Hook: { ... } },
|
||||
{ Hook: { ... } },
|
||||
{ Hook: { ... } }. // Objeto HookSet (posição 3)
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Este array _espelha_ a [Cadeia de Hooks](/pt-br/docs/hooks/concepts/chaining) instalada na conta:
|
||||
|
||||
* A posição 0 no array _corresponde_ à posição 0 na Cadeia de Hooks.
|
||||
* A posição 3 no array _corresponde_ à posição 3 na Cadeia de Hooks, etc.
|
||||
|
||||
### Objeto HookSet e Hook Correspondente
|
||||
|
||||
Cada entrada no Array Hooks (na Transação SetHook) é chamada de _Objeto HookSet_, e seu Hook correspondente na Cadeia de Hooks da conta é chamado de _Hook Correspondente_.
|
||||
|
||||
<figure>
|
||||

|
||||
<figcaption>*Exemplo: Um usuário realiza uma operação em cada Hook de sua Cadeia de Hooks com uma transação SetHook.*</figcaption>
|
||||
</figure>
|
||||
|
||||
### HookDefinition
|
||||
|
||||
Cada Hook Correspondente é um objeto contendo uma _referência_ (ponteiro) para um objeto `HookDefinition`.
|
||||
|
||||
O objeto HookDefinition é um objeto de ledger não proprietário com contagem de referência que permite a desduplicação de bytecode webassembly idêntico. Dois usuários usando um hook idêntico apontarão para a mesma HookDefinition.
|
||||
|
||||
<figure>
|
||||

|
||||
<figcaption>*Exemplo: Definições de Hook no Xahau*</figcaption>
|
||||
</figure>
|
||||
|
||||
Para mais informações veja: [Contagem de Referência](/pt-br/docs/hooks/concepts/reference-counted-hook-definitions)
|
||||
|
||||
### Padrões do Hook
|
||||
|
||||
Quando uma `HookDefinition` é criada, ela contém os [Parâmetros](/pt-br/docs/hooks/concepts/parameters), [Namespace](/pt-br/docs/hooks/concepts/namespaces) e [Concessões](/pt-br/docs/hooks/concepts/grants) iniciais fornecidos pelo usuário. Estes se tornam os Padrões do Hook. Qualquer Hook que referencie esta Definição de Hook usará esses padrões _a menos que_ a Transação SetHook que cria essa referência substitua explicitamente esses padrões, ou uma Operação de Atualização subsequente os substitua.
|
||||
|
||||
### Operações HookSet
|
||||
|
||||
Existem seis operações possíveis: Nenhuma Operação, Criar, Atualizar, Excluir, Instalar e Exclusão de Namespace
|
||||
|
||||
Cada operação é especificada pela inclusão ou omissão de determinados campos do Objeto HookSet. Isso pode parecer confuso no início, mas ao trabalhar com alguns exemplos o leitor achará intuitivo; Essencialmente as operações HookSet são um tipo de **diff** entre os _padrões_, _existentes_ e os campos recém-especificados de um Hook específico.
|
||||
|
||||
A realização de cada tipo de operação é explicada em uma subseção abaixo.
|
||||
|
||||
### Nenhuma Operação
|
||||
|
||||
**Ocorre quando**:
|
||||
|
||||
* O Objeto HookSet está vazio
|
||||
|
||||
**Comportamento**:
|
||||
|
||||
* Nenhuma mudança de qualquer tipo é feita.
|
||||
|
||||
**Exemplo**:
|
||||
|
||||
```json
|
||||
{
|
||||
Account: "r4GDFMLGJUKMjNhhycgt2d5LXCdXzCYPoc",
|
||||
TransactionType: "SetHook",
|
||||
Fee: "2000000",
|
||||
Hooks:
|
||||
[
|
||||
{
|
||||
Hook: {}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Operação de Criação
|
||||
|
||||
**Ocorre quando**:
|
||||
|
||||
_Todas_ as seguintes condições são atendidas:
|
||||
|
||||
* O Hook Correspondente não existe _ou_ `FLAG_OVERRIDE` é especificado.
|
||||
* O campo `CreateCode` é especificado, não está em branco e contém o bytecode webassembly válido para um Hook válido.
|
||||
* Nenhuma instância do mesmo bytecode webassembly já existe no Xahau. (Se existir e todos os outros requisitos forem atendidos, interprete como uma Operação de Instalação — veja abaixo.)
|
||||
|
||||
**Comportamento**:
|
||||
|
||||
* Um objeto `HookDefinition` com contagem de referência é criado no Xahau contendo os campos no Objeto HookSet, com todos os campos especificados (Namespace, Parâmetros, HookOn) tornando-se padrões (mas não Concessões).
|
||||
* Um array `Hooks` é criado na conta em execução, se ainda não existir. (Esta é a estrutura que contém os Hooks Correspondentes.)
|
||||
* Um objeto `Hook` é criado na posição do Hook Correspondente se ainda não existir.
|
||||
* O objeto `Hook` aponta para a `HookDefinition`.
|
||||
* O objeto `Hook` não contém campos exceto `HookHash` que aponta para a `HookDefinition` criada.
|
||||
* Se o flag `hsfNSDELETE` for especificado, quaisquer entradas HookState no namespace de destino serão excluídas se atualmente existirem.
|
||||
|
||||
**Exemplo**:
|
||||
|
||||
```json
|
||||
{
|
||||
Account: "r4GDFMLGJUKMjNhhycgt2d5LXCdXzCYPoc",
|
||||
TransactionType: "SetHook",
|
||||
Fee: "2000000",
|
||||
Hooks:
|
||||
[
|
||||
{
|
||||
Hook: {
|
||||
CreateCode: fs.readFileSync('accept.wasm').toString('hex').toUpperCase(),
|
||||
HookOn: '0000000000000000',
|
||||
HookNamespace: addr.codec.sha256('accept').toString('hex').toUpperCase(),
|
||||
HookApiVersion: 0
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Operação de Instalação
|
||||
|
||||
**Ocorre quando**:
|
||||
|
||||
_Todas_ as seguintes condições são atendidas:
|
||||
|
||||
* O Hook Correspondente não existe _ou_ `FLAG_OVERRIDE` é especificado.
|
||||
* O campo `HookHash` é especificado e não está em branco e contém o hash de um Hook que já existe como uma `HookDefinition` no ledger _ou_ o campo `CreateCode` é especificado e não está em branco e contém o bytecode webassembly válido para um hook válido que já existe no ledger como uma `HookDefinition`.
|
||||
|
||||
**Comportamento**:
|
||||
|
||||
* A contagem de referência do objeto `HookDefinition` é incrementada.
|
||||
* Um array `Hooks` é criado na conta em execução, se ainda não existir. (Esta é a estrutura que contém os Hooks Correspondentes.)
|
||||
* Um objeto `Hook` é criado na posição do Hook Correspondente se ainda não existir.
|
||||
* O objeto `Hook` aponta para a `HookDefinition`.
|
||||
* O objeto `Hook` contém todos os campos no Objeto HookSet, exceto quando:
|
||||
* Um campo ou par de chave dentro de um campo é idêntico aos Padrões do Hook definidos na `HookDefinition`, caso em que é omitido devido aos padrões.
|
||||
* Se o flag `hsfNSDELETE` for especificado, quaisquer entradas HookState no namespace de destino serão excluídas se atualmente existirem.
|
||||
|
||||
**Exemplo**:
|
||||
|
||||
```json
|
||||
{
|
||||
Account: "r4GDFMLGJUKMjNhhycgt2d5LXCdXzCYPoc",
|
||||
TransactionType: "SetHook",
|
||||
Fee: "2000000",
|
||||
Hooks:
|
||||
[
|
||||
{
|
||||
Hook: {
|
||||
HookHash: "A5663784D04ED1B4408C6B97193464D27C9C3334AAF8BBB4FA5EB8E557FC4A2C",
|
||||
HookOn: '0000000000000000',
|
||||
HookNamespace: addr.codec.sha256('accept').toString('hex').toUpperCase(),
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Operação de Atualização
|
||||
|
||||
**Ocorre quando**:
|
||||
|
||||
_Todas_ as seguintes condições são atendidas:
|
||||
|
||||
* O Hook Correspondente existe.
|
||||
* `HookHash` está ausente.
|
||||
* `CreateCode` está ausente.
|
||||
* Um ou mais de `HookNamespace`, `HookParameters` ou `HookGrants` está presente.
|
||||
|
||||
**Comportamento Geral**:
|
||||
|
||||
* O Hook Correspondente é atualizado de forma que as mudanças desejadas sejam refletidas no Hook Correspondente.
|
||||
|
||||
**Comportamento Específico**:
|
||||
|
||||
Se `HookNamespace` for especificado e diferir do Namespace do Hook Correspondente:
|
||||
|
||||
* o `HookNamespace` do Hook Correspondente é atualizado, e
|
||||
* se o flag `hsfNSDELETE` for especificado, todas as entradas HookState no namespace antigo são excluídas.
|
||||
|
||||
Se `HookParameters` for especificado, então para cada entrada:
|
||||
|
||||
* Se `HookParameterName` existir mas `HookParameterValue` estiver ausente e os Parâmetros do Hook Correspondente (seja especificamente ou via padrões) contiverem este `HookParameterName`, então o parâmetro é marcado como excluído no Hook Correspondente.
|
||||
* Se `HookParameterName` existir e `HookParameterValue` existir, então os Parâmetros do Hook Correspondente são modificados para incluir o parâmetro novo ou atualizado.
|
||||
|
||||
Se `HookGrants` for especificado então:
|
||||
|
||||
* O array `HookGrants` do Hook Correspondente é substituído pelo array.
|
||||
|
||||
**Exemplo**:
|
||||
|
||||
```json
|
||||
{
|
||||
Account: "r4GDFMLGJUKMjNhhycgt2d5LXCdXzCYPoc",
|
||||
TransactionType: "SetHook",
|
||||
Fee: "2000000",
|
||||
Hooks:
|
||||
[
|
||||
{
|
||||
Hook: {
|
||||
HookNamespace: addr.codec.sha256('new_accept').toString('hex').toUpperCase(),
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Operação de Exclusão
|
||||
|
||||
**Ocorre quando**:
|
||||
|
||||
_Todas_ as seguintes condições são atendidas:
|
||||
|
||||
* O Hook Correspondente existe.
|
||||
* `hsfOVERRIDE` é especificado.
|
||||
* opcionalmente `hsfNSDELETE` também é especificado.
|
||||
* `HookHash` está ausente.
|
||||
* `CreateCode` está presente mas vazio.
|
||||
|
||||
**Comportamento**:
|
||||
|
||||
* A contagem de referência do objeto `HookDefinition` é decrementada.
|
||||
* Se a contagem de referência agora for zero, a `HookDefinition` é removida do ledger.
|
||||
* O objeto `Hook` na posição do Hook Correspondente é excluído, deixando uma posição vazia.
|
||||
* Se `hsfNSDELETE` for especificado, o namespace e todas as entradas HookState também são excluídas.
|
||||
|
||||
**Exemplo**:
|
||||
|
||||
```json
|
||||
{
|
||||
Account: "r4GDFMLGJUKMjNhhycgt2d5LXCdXzCYPoc",
|
||||
TransactionType: "SetHook",
|
||||
Fee: "2000000",
|
||||
Hooks:
|
||||
[
|
||||
{
|
||||
Hook: {
|
||||
CreateCode: "",
|
||||
Flags: 1,
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Redefinição de Namespace
|
||||
|
||||
**Ocorre quando**:
|
||||
|
||||
_Todas_ as seguintes condições são atendidas:
|
||||
|
||||
* `flags` está presente e `hsfNSDELETE` está definido. `hsfOVERRIDE` também pode ser opcionalmente especificado se o Hook nesta posição deve ser excluído.
|
||||
* `HookNamespace` é especificado.
|
||||
* `CreateCode` está ausente.
|
||||
* `HookHash` está ausente.
|
||||
* `HookGrants`, `HookParameters`, `HookOn` e `HookApiVersion` estão ausentes.
|
||||
|
||||
**Comportamento**:
|
||||
|
||||
* Se o Hook Correspondente existir, ele permanece, nada acontece com ele.
|
||||
* Um subconjunto de objetos HookState e o diretório HookState para o namespace especificado são removidos do ledger, até o limite definido de 512. Transações adicionais são necessárias para continuar o processo de exclusão até que todos os registros relevantes sejam removidos.
|
||||
|
||||
**Exemplo**:
|
||||
|
||||
```json
|
||||
{
|
||||
Account: "r4GDFMLGJUKMjNhhycgt2d5LXCdXzCYPoc",
|
||||
TransactionType: "SetHook",
|
||||
Fee: "2000000",
|
||||
Hooks:
|
||||
[
|
||||
{
|
||||
Hook: {
|
||||
HookNamespace: addr.codec.sha256('accept').toString('hex').toUpperCase(),
|
||||
Flags: 3,
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,62 @@
|
||||
---
|
||||
title: Slots e Keylets
|
||||
description: Inspecione e manipule objetos no ledger.
|
||||
---
|
||||
import { Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### Contexto
|
||||
|
||||
O Xahau contém numerosos tipos de objetos heterogêneos aos quais um Hook tem acesso de leitura. Por exemplo: _transações_, _contas_, _ledgers_ e os subcomponentes de cada um desses, para citar apenas alguns.
|
||||
|
||||
É muito fácil programar descuidadamente um computador para realizar muitas operações de cópia desnecessárias quando o acesso disciplinado aos mesmos dados subjacentes (ou seja, através de uma visão) seria suficiente. A evitação deliberada de operações de cópia na programação é referida como [Zero copy](https://en.wikipedia.org/wiki/Zero-copy) em programação.
|
||||
|
||||
Com os Hooks o mesmo princípio se aplica. Queremos evitar cópias sempre que possível. Em particular, queremos evitar ao máximo a cópia desnecessária de objetos grandes como ledgers inteiros, e também queremos evitar serializar e desserializar esses objetos sempre que possível.
|
||||
|
||||
### O que são slots?
|
||||
|
||||
Slots fazem parte da API de Hooks e fornecem um sistema de acesso _heterogêneo_ de zero cópia para objetos e transações no ledger.
|
||||
|
||||
* Cada Hook tem acesso a 255 slots durante a execução.
|
||||
* Cada slot pode estar vazio ou pode conter um objeto _inserido no slot_.
|
||||
* A API de slot permite percorrer objetos internos e permite que esses objetos internos sejam inseridos em slots.
|
||||
* A API de slot permite que objetos inseridos sejam despejados em um buffer ou de outra forma lidos pelo Hook.
|
||||
|
||||
As APIs de slot disponíveis são:
|
||||
|
||||
| API de Hook | O que faz |
|
||||
| -------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
|
||||
| [slot](/pt-br/docs/hooks/functions/slot/slot) | Serializa e gera um objeto inserido em slot |
|
||||
| [slot_clear](/pt-br/docs/hooks/functions/slot/slot_clear) | Libera um slot atualmente ocupado |
|
||||
| [slot_count](/pt-br/docs/hooks/functions/slot/slot_count) | Conta os elementos de um objeto array em um slot |
|
||||
| slot_id | Calcula o hash canônico do objeto inserido e o retorna |
|
||||
| [slot_set](/pt-br/docs/hooks/functions/slot/slot_set) | Localiza um objeto com base em seu keylet e o coloca em um slot |
|
||||
| [slot_subarray](/pt-br/docs/hooks/functions/slot/slot_subarray) | Indexa em um array inserido em slot e atribui um sub-objeto a outro slot |
|
||||
| [slot_subfield](/pt-br/docs/hooks/functions/slot/slot_subfield) | Indexa em um objeto inserido em slot e atribui um sub-objeto a outro slot |
|
||||
| [slot_type](/pt-br/docs/hooks/functions/slot/slot_type) | Recupera o código de campo de um objeto em um slot e, opcionalmente, outras informações |
|
||||
| [slot_float](/pt-br/docs/hooks/functions/slot/slot_float) | Analisa o STI_AMOUNT no slot especificado e o retorna como um número XFL encapsulado |
|
||||
| [slot_size](/pt-br/docs/hooks/functions/slot/slot_size) | Calcula o tamanho serializado de um objeto em um slot |
|
||||
|
||||
### O que são keylets?
|
||||
|
||||
Keylets são usados para localizar (apontar para) objetos no ledger. Resumidamente, são um _hash_ de informações de identificação do objeto, que é o _identificador_ canônico para aquele objeto.
|
||||
|
||||
Os Hooks usam um formato de keylet serializado de 34 bytes que pode ser derivado usando a importante função [util_keylet](/pt-br/docs/hooks/functions/utilities/util_keylet). Sem isso, pesquisar e inserir objetos em slots seria geralmente impossível.
|
||||
|
||||
<Aside type="tip">
|
||||
As APIs de Hook que aceitam um keylet de 34 bytes também geralmente aceitarão um hash de transação canônico de 32 bytes.
|
||||
</Aside>
|
||||
|
||||
### Exemplo
|
||||
|
||||
No exemplo a seguir, um keylet de 34 bytes para um objeto `signers` é usado para inserir esse objeto em um slot.
|
||||
|
||||
```c
|
||||
uint8_t keylet[34];
|
||||
if (util_keylet(SBUF(keylet), KEYLET_SIGNERS, SBUF(hook_accid), 0, 0, 0, 0) != 34)
|
||||
rollback(SBUF("Notary: Internal error, could not generate keylet"), 10);
|
||||
|
||||
// então solicitando que o XRPLD insira aquele keylet em um novo slot para nós
|
||||
int64_t slot_no = slot_set(SBUF(keylet), 0);
|
||||
if (slot_no < 0)
|
||||
rollback(SBUF("Notary: Could not set keylet in slot"), 10);
|
||||
```
|
||||
@@ -0,0 +1,65 @@
|
||||
---
|
||||
title: Gerenciamento de Estado
|
||||
description: Hooks podem ler e salvar pequenos pedaços de dados no ledger 🚀
|
||||
---
|
||||
import { Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### O que é Estado do Hook?
|
||||
|
||||
[Estado](https://en.wikipedia.org/wiki/State_\(computer_science\)) em ciência da computação descreve informações mantidas por um sistema entre execuções (distinto de entradas e saídas). Por exemplo, seu navegador mantém você logado em um site mesmo após você fechá-lo e reabri-lo. O cookie de login é mantido no _estado_ do navegador.
|
||||
|
||||
**Estado do Hook** refere-se a um mapeamento chave-valor que logicamente existe para cada conta no Xahau, independentemente de quaisquer chaves estarem atualmente presentes. As chaves são sempre 32 bytes (inteiro unsigned de 256 bits) e os valores são de comprimento variável com tamanho máximo determinado pela votação dos validadores, no momento da escrita 256 bytes.
|
||||
|
||||
O Gerenciamento de Estado é alcançado usando
|
||||
|
||||
* [state](/pt-br/docs/hooks/functions/state/state)
|
||||
* [state_set](/pt-br/docs/hooks/functions/state/state_set)
|
||||
* [state_foreign](/pt-br/docs/hooks/functions/state/state_foreign)
|
||||
|
||||
### Armazenando e buscando
|
||||
|
||||
O exemplo abaixo usa a API de Hook [state_set](/pt-br/docs/hooks/functions/state/state_set) para atribuir o valor `0xC001CAFE` à chave `0x0..000001` (uint256 = 1) no Estado do Hook da Conta Hook.
|
||||
|
||||
```c
|
||||
uint8_t key[32] = {
|
||||
0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U,
|
||||
0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U,
|
||||
0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U,
|
||||
0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x01U
|
||||
};
|
||||
uint8_t value[4] = { 0xC0U, 0x01U, 0xCAU, 0xFEU };
|
||||
if (state_set(value, 4, key, 32) == 4)
|
||||
{
|
||||
// ... estado salvo com sucesso
|
||||
}
|
||||
```
|
||||
|
||||
Em uma execução subsequente do Hook, este valor agora pode ser recuperado usando a mesma chave:
|
||||
|
||||
```c
|
||||
uint8_t value[4];
|
||||
uint8_t key[32] = {
|
||||
0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U,
|
||||
0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U,
|
||||
0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U,
|
||||
0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x01U
|
||||
};
|
||||
if (state(value, 4, key, 32) < 0)
|
||||
{
|
||||
// ... busca de estado falhou
|
||||
}
|
||||
```
|
||||
|
||||
Após a execução do código acima, o buffer `value` será preenchido com o valor encontrado na chave.
|
||||
|
||||
<Aside type="tip">
|
||||
O buffer no qual <code>state()</code> lê (<code>writeptr</code>) deve ser grande o suficiente para armazenar o valor atualmente mantido naquela chave. Se não for, a API de Hook retorna com um erro <code>TOO_SMALL</code>.
|
||||
</Aside>
|
||||
|
||||
### Estado externo
|
||||
|
||||
De tempos em tempos pode ser vantajoso para um Hook rodando em uma conta ler o Estado do Hook de outro Hook rodando em outra conta. A API de Hook [state_foreign](/pt-br/docs/hooks/functions/state/state_foreign) faz exatamente isso. Como o ledger é público, não há expectativa razoável de privacidade de qualquer forma. Qualquer Hook pode, portanto, _ler_ (mas não escrever) o Estado do Hook de qualquer outro Hook.
|
||||
|
||||
### Namespaces e consultas
|
||||
|
||||
Por favor, veja [Namespaces](/pt-br/docs/hooks/concepts/namespaces)
|
||||
37
src/content/docs/pt-br/docs/hooks/concepts/terminology.mdx
Normal file
37
src/content/docs/pt-br/docs/hooks/concepts/terminology.mdx
Normal file
@@ -0,0 +1,37 @@
|
||||
---
|
||||
title: Terminologia
|
||||
description: Bem-vindo aos Hooks 👋
|
||||
---
|
||||
### O que são Hooks?
|
||||
|
||||
Hooks são módulos de web assembly pequenos e eficientes projetados especificamente para o Xahau. Os Hooks podem ser escritos em qualquer linguagem (compilável para WebAssembly) e a maioria das lógicas de negócios e conceitos de contratos inteligentes podem ser implementados em um hook. Tipicamente os Hooks são escritos em C.
|
||||
|
||||
Os Hooks são instalados em uma conta Xahau usando uma transação `SetHook`. Uma vez instalado em uma conta, um hook pode:
|
||||
|
||||
1. Bloquear ou permitir transações de entrada e saída na conta,
|
||||
2. Modificar e manter estado interno e lógica específicos ao hook naquela conta, e
|
||||
3. Emitir novas transações em nome da conta.
|
||||
|
||||
### Glossário
|
||||
|
||||
Esta documentação de Hooks e a API de Hooks usam um conjunto de termos não familiares. Use a tabela de consulta abaixo se se encontrar perdido.
|
||||
|
||||
| Termo | Explicação |
|
||||
| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Hook | <p><em>Este termo se refere a um conjunto de coisas dependendo do contexto</em><br />1. Um binário webassembly que pode ser enviado ao Xahau com o tipo <a href="/pt-br/docs/hooks/concepts/sethook-transaction">Transação SetHook</a>.<br />2. Um binário webassembly já enviado e instalado ou configurado em uma conta Xahau.<br />3. O <a href="/pt-br/docs/hooks/concepts/compiling-hooks">código fonte</a> de tal binário.</p> |
|
||||
| Transação de Origem | A transação que acionou o Hook. Esta pode ser uma transação enviada para fora ou para dentro de uma conta com um Hook instalado. |
|
||||
| Conta de Origem | A conta que enviou uma Transação de Origem. |
|
||||
| Conta Hook | A conta onde o Hook atualmente em execução está. Esta é a conta que possui o Hook, a conta que realizou a [Transação SetHook](/pt-br/docs/hooks/concepts/sethook-transaction) que criou o Hook e a conta à qual pertence o Estado do Hook para o Hook atualmente em execução. |
|
||||
| Instalador | A conta que está atualmente instalando um Hook usando a transação SetHook. |
|
||||
| Transação Emitida | Uma nova transação criada por um Hook durante a execução do Hook que não é a Transação de Origem. Estas são tipicamente usadas para enviar fundos de volta para a Conta de Origem. Veja: [Transações Emitidas](/pt-br/docs/hooks/concepts/emitted-transactions). |
|
||||
| Estado | Um mapa chave-valor por conta de chaves de 32 bytes para dados arbitrários. Todos os Hooks presentes em uma conta têm acesso ao mesmo Estado do Hook e podem modificá-lo. Note que o Estado do Hook vive na Conta Hook **não** na Conta de Origem. Veja: [Gerenciamento de Estado](/pt-br/docs/hooks/concepts/state-management). |
|
||||
| SetHook | Um novo Tipo de Transação introduzido na emenda de Hooks que instala um Hook em uma conta Xahau. Veja: [Transação SetHook](/pt-br/docs/hooks/concepts/sethook-transaction). |
|
||||
| Guardas | Um mecanismo de controle especial que você precisa usar se escrever um loop em um Hook. Veja: [Loops e Guardas](/pt-br/docs/hooks/concepts/loops-and-guarding). |
|
||||
| Concessões | Permissão especial que um Instalador de Hook pode dar a outra conta ou a um Hook específico (independentemente de onde está instalado) para modificar o Estado do Hook na conta do Instalador. |
|
||||
| Namespace | Um código único de 32 bytes delimitando um conjunto de chaves de estado de outro. A mesma chave de estado pode ser usada por dois Hooks diferentes sem interferir um com o outro se os namespaces definidos nos Hooks forem diferentes. |
|
||||
| Parâmetros | Parâmetros de tempo de instalação que podem ser opcionalmente definidos em um Hook. |
|
||||
| Contagem de Referência | Um objeto não proprietário no ledger pode ter contagem de referência, significando que é excluído quando a última conta que o referenciou (usou) remove sua referência a ele. |
|
||||
| XFL ou Ponto Flutuante | Uma forma de fazer matemática de alta precisão em Hooks, como para cálculo de taxas de câmbio. Veja: [Números de Ponto Flutuante (XFL)](/pt-br/docs/hooks/concepts/floating-point-numbers-xfl). |
|
||||
| Objetos Serializados (STO) | A forma como o xahaud transmite e armazena objetos do ledger. Veja: [Objetos Serializados](/pt-br/docs/hooks/concepts/serialized-objects). |
|
||||
| Slots e Keylets | Slots podem conter objetos do ledger e keylets identificam esses objetos. Veja: [Slots e Keylets](/pt-br/docs/hooks/concepts/slots-and-keylets). |
|
||||
| Trace | Uma forma de imprimir uma linha de log para a saída do xrpld a partir de um Hook. Veja: [Depurando Hooks](/pt-br/docs/hooks/concepts/debugging-hooks). |
|
||||
242
src/content/docs/pt-br/docs/hooks/concepts/weak-and-strong.mdx
Normal file
242
src/content/docs/pt-br/docs/hooks/concepts/weak-and-strong.mdx
Normal file
@@ -0,0 +1,242 @@
|
||||
---
|
||||
title: Fraco e Forte
|
||||
description: Quais Hooks têm permissão para rodar e quando?
|
||||
---
|
||||
import { Aside } from '@astrojs/starlight/components';
|
||||
|
||||
<Aside type="tip" title="Filosofia de Design dos Hooks">
|
||||
Toda parte afetada por uma transação deve ter a oportunidade de ter seus Hooks executados.
|
||||
</Aside>
|
||||
|
||||
Partes Interessadas Transacionais (TSH, do inglês Transactional Stake Holders) são partes que de alguma forma têm interesse ou são afetadas por uma transação. Seu interesse particular pode ser _fraco_ ou _forte_. O grau de conexão com a transação determina se a parte tem o direito de ter seus Hooks executados e quem deve pagar por essa execução.
|
||||
|
||||
Por exemplo:
|
||||
|
||||
* Em uma transação de **Pagamento** XAH direta convencional, os dois TSH são a _conta de origem_ e a _conta de destino_.
|
||||
* Em uma transação **SetSignerList**, os TSH são a _conta de origem_ e cada conta cujo endereço aparece na lista de signatários, onde tais contas estão ativas no ledger.
|
||||
* Em uma transação **OfferCreate**, as ofertas de outras contas que são cruzadas pela transação de origem são todas TSH fracas e podem optar pela execução fraca.
|
||||
* Com a emenda **IOUIssuerWeakTSH**, os emissores de moeda têm seus hooks executados em transações de terceiros que tocam ou mencionam sua moeda, se optaram pela execução fraca.
|
||||
|
||||
Devido à natureza heterogênea das transações no Xahau, os TSH vêm em todas as formas e tamanhos e podem ser exóticos e não intuitivos. Isso se torna mais verdadeiro à medida que o tempo passa e mais tipos de transação são adicionados ao Ledger.
|
||||
|
||||
### Fraco e Forte
|
||||
|
||||
Cada TSH tem uma conexão fraca ou forte com a transação.
|
||||
|
||||
Uma conexão **Forte** significa:
|
||||
|
||||
1. A transação de origem deve pagar a taxa pela execução da Cadeia de Hooks do TSH
|
||||
2. O TSH tem o direito de reverter toda a transação chamando `rollback()` de seu Hook durante a execução.
|
||||
|
||||
Uma conexão **Fraca** significa:
|
||||
|
||||
1. A transação de origem **não** paga pela execução da Cadeia de Hooks do TSH.
|
||||
2. O TSH paga pela execução de sua própria Cadeia de Hooks através de um recurso chamado [Chamada Coletiva de Hooks](/pt-br/docs/hooks/concepts/collect-call).
|
||||
3. O TSH deve ter definido um flag de conta `asfTshCollect` antes da execução da transação de origem.
|
||||
4. O TSH **não** tem o direito de reverter toda a transação chamando `rollback()` de seu Hook durante a execução (mas ainda pode modificar seu próprio estado de Hook e emitir transações).
|
||||
|
||||
### Antes ou Depois
|
||||
|
||||
Os TSH Fortes têm seus hooks executados _antes_ de a transação de origem ser aplicada ao ledger. Isso significa que têm a capacidade de [reverter](/pt-br/docs/hooks/functions/control/rollback) a transação (porque ainda não foi aplicada). Isso dá aos hooks fortemente executados a capacidade de bloquear completamente uma transação de ocorrer.
|
||||
|
||||
Os TSH Fracos têm seus hooks executados _após_ a transação de origem ter sido aplicada ao ledger. Isso significa que têm acesso aos [metadados da transação](/pt-br/docs/hooks/functions/originating-transaction/meta_slot), mas não podem impedir que a transação ocorra.
|
||||
|
||||
<Aside type="tip">
|
||||
Hooks fortemente executados podem chamar <a href="ref:hook_again">hook_again</a> para serem executados uma segunda vez como uma execução fraca após a transação de origem ter sido aplicada.
|
||||
</Aside>
|
||||
|
||||
### Contexto de Execução
|
||||
|
||||
O parâmetro `uint32_t` em `hook(uint32_t)` e `cbak(uint32_t)` carrega informações importantes de contexto da Emenda de Hooks para seu Hook.
|
||||
|
||||
Durante a execução de `hook`:
|
||||
|
||||
* 0 significa que o Hook está sendo executado _fortemente_
|
||||
* 1 significa que o Hook está sendo executado _fracamente_
|
||||
* 2 significa que o Hook está sendo executado _fracamente_ após ter sido executado _fortemente_ devido a uma chamada [hook_again](/pt-br/docs/hooks/functions/hook-context/hook_again).
|
||||
|
||||
Durante a execução de `cbak`:
|
||||
|
||||
* 0 significa que o Hook está sendo chamado de volta após uma transação que emitiu ter sido aceita com sucesso em um ledger.
|
||||
* 1 significa que o Hook está sendo chamado de volta após uma transação que emitiu ter sido marcada como nunca podendo ser aplicada a qualquer ledger (EmitFailure).
|
||||
|
||||
### Tabela de Referência
|
||||
|
||||
Se um Tipo de Transação não aparece na tabela, então ele não tem TSHes **além de sua conta de origem.**
|
||||
|
||||
|
||||
|
||||
| Tipo de Transação | Tipo TSH | Quem é o TSH |
|
||||
| ----------------------- | ------------- | -------------------------------------------------------------------------------------------- |
|
||||
| AccountDelete | Forte | Conta de destino para a qual os fundos são pagos após a exclusão |
|
||||
| AccountSet | Nenhum | N/A |
|
||||
| CheckCancel | Fraco | Conta de destino |
|
||||
| CheckCash | Nenhum | N/A |
|
||||
| CheckCreate | Forte | Conta de destino |
|
||||
| ClaimReward | Forte | Conta Emissora |
|
||||
| DepositPreauth | Forte | Conta autorizada |
|
||||
| EscrowCancel | Fraco | Conta de destino |
|
||||
| EscrowCreate | Forte | Conta de destino |
|
||||
| EscrowFinish | Forte | Conta de destino |
|
||||
| GenesisMint | Fraco | Cada Destino no Array GenesisMints |
|
||||
| Import | Forte | Conta Emissora |
|
||||
| Invoke | Forte | Conta de destino |
|
||||
| OfferCancel | Nenhum | N/A |
|
||||
| OfferCreate | Fraco | Contas cujas ofertas foram cruzadas por esta ação. |
|
||||
| Payment | Forte + Fraco | Forte: Conta de destino. Fraco: Qualquer não-emissor pelo qual o pagamento é roteado. |
|
||||
| PaymentChannelClaim | Fraco | Conta de destino |
|
||||
| PaymentChannelCreate | Forte | Conta de destino |
|
||||
| PaymentChannelFund | Fraco | Conta de destino |
|
||||
| SetHook | Nenhum | N/A |
|
||||
| SetRegularKey | Forte | A conta cujo endereço está sendo definido como a chave. |
|
||||
| SignerListSet | Forte | Contas cujos endereços são definidos como chaves de assinatura (se existirem e tiverem Hooks instalados). |
|
||||
| TicketCreate | Nenhum | N/A |
|
||||
| TrustSet | Fraco | Conta emissora |
|
||||
| URITokenCancelSellOffer | Nenhum | N/A |
|
||||
| URITokenCreateSellOffer | Forte | Conta de destino, Emissor se o Flag tfBurnable estiver definido |
|
||||
| URITokenBurn | Forte | Emissor se o Flag tfBurnable estiver definido |
|
||||
| URITokenBuy | Forte | Conta do proprietário, Emissor se o Flag tfBurnable estiver definido |
|
||||
| URITokenMint | Nenhum | N/A |
|
||||
|
||||
**AccountSet**
|
||||
|
||||
| OTXN | TSH | AccountSet |
|
||||
| ------- | ------- | ---------- |
|
||||
| Account | Account | Forte |
|
||||
|
||||
**AccountDelete**
|
||||
|
||||
| OTXN | TSH | AccountDelete |
|
||||
| ------- | ----------- | ------------- |
|
||||
| Account | Account | Nenhum |
|
||||
| Account | Beneficiary | Forte |
|
||||
|
||||
**Check**
|
||||
|
||||
| OTXN | TSH | CheckCancel | CheckCreate | CheckCash |
|
||||
| ----------- | ----------- | ----------- | ----------- | --------- |
|
||||
| Account | Account | Forte | Forte | Nenhum |
|
||||
| Account | Destination | Fraco | Forte | Nenhum |
|
||||
| Destination | Destination | Forte | Nenhum | Forte |
|
||||
| Destination | Account | Fraco | Nenhum | Fraco |
|
||||
|
||||
**ClaimReward**
|
||||
|
||||
| OTXN | TSH | ClaimReward |
|
||||
| ------- | ------- | ----------- |
|
||||
| Account | Account | Forte |
|
||||
| Account | Issuer | Forte |
|
||||
|
||||
**DepositPreauth**
|
||||
|
||||
| OTXN | TSH | DepositPreauth |
|
||||
| ------- | ---------- | -------------- |
|
||||
| Account | Account | Forte |
|
||||
| Account | Authorized | Forte |
|
||||
|
||||
**Escrow**
|
||||
|
||||
| OTXN | TSH | EscrowCancel | EscrowCreate | EscrowFinish |
|
||||
| ----------- | ----------- | ------------ | ------------ | ------------ |
|
||||
| Account | Account | Forte | Forte | Forte |
|
||||
| Account | Destination | Fraco | Forte | Fraco |
|
||||
| Destination | Destination | Forte | Nenhum | Forte |
|
||||
| Destination | Account | Fraco | Nenhum | Fraco |
|
||||
|
||||
**GenesisMint**
|
||||
|
||||
| OTXN | TSH | GenesisMint |
|
||||
| ------- | ----------- | ----------- |
|
||||
| Account | Account | Forte |
|
||||
| Account | Destination | Forte |
|
||||
| Account | Beneficiary | Fraco |
|
||||
|
||||
**Import**
|
||||
|
||||
| OTXN | TSH | Import |
|
||||
| ------- | ------- | ------ |
|
||||
| Account | Account | Forte |
|
||||
| Account | Issuer | Forte |
|
||||
|
||||
**Invoke**
|
||||
|
||||
| OTXN | TSH | Invoke |
|
||||
| ------- | ----------- | ------ |
|
||||
| Account | Account | Forte |
|
||||
| Account | Destination | Fraco |
|
||||
|
||||
**Offer**
|
||||
|
||||
| OTXN | TSH | OfferCancel | OfferCreate |
|
||||
| ------- | ------- | ----------- | ----------- |
|
||||
| Account | Account | Forte | Forte |
|
||||
| Account | Crossed | Nenhum | Fraco |
|
||||
|
||||
**Payment**
|
||||
|
||||
| OTXN | TSH | Payment |
|
||||
| ------- | ----------- | ------- |
|
||||
| Account | Account | Forte |
|
||||
| Account | Destination | Forte |
|
||||
| Account | Crossed | Fraco |
|
||||
|
||||
**PaymentChannel**
|
||||
|
||||
| OTXN | TSH | PaymentChannelClaim | PaymentChannelCreate | PaymentChannelFund |
|
||||
| ----------- | ----------- | ------------------- | -------------------- | ------------------ |
|
||||
| Account | Account | Forte | Forte | Forte |
|
||||
| Account | Destination | Fraco | Forte | Fraco |
|
||||
| Destination | Destination | Forte | Nenhum | Nenhum |
|
||||
| Destination | Account | Fraco | Nenhum | Nenhum |
|
||||
|
||||
**SetHook**
|
||||
|
||||
| OTXN | TSH | SetHook |
|
||||
| ------- | ------- | ------- |
|
||||
| Account | Account | Forte |
|
||||
|
||||
**SetRegularKey**
|
||||
|
||||
| OTXN | TSH | SetRegularKey |
|
||||
| ------- | ---------- | ------------- |
|
||||
| Account | Account | Forte |
|
||||
| Account | RegularKey | Forte |
|
||||
|
||||
**SignerListSet**
|
||||
|
||||
| OTXN | TSH | SignerListSet |
|
||||
| ------- | ------- | ------------- |
|
||||
| Account | Account | Forte |
|
||||
| Account | Signer | Forte |
|
||||
|
||||
**Ticket**
|
||||
|
||||
| OTXN | TSH | TicketCreate |
|
||||
| ------- | ------- | ------------ |
|
||||
| Account | Account | Forte |
|
||||
|
||||
**TrustSet**
|
||||
|
||||
| OTXN | TSH | TrustSet |
|
||||
| ------- | ------- | -------- |
|
||||
| Account | Account | Forte |
|
||||
| Account | Issuer | Fraco |
|
||||
|
||||
**URIToken**
|
||||
|
||||
| OTXN | Burnable | TSH | Mint | Burn | Buy | Sell | Cancel |
|
||||
| ------ | -------- | ------ | ------ | ------ | ------ | ------ | ------ |
|
||||
| Owner | False | Owner | Nenhum | Forte | Forte | Forte | Forte |
|
||||
| Owner | False | Issuer | Nenhum | Fraco | Fraco | Fraco | Nenhum |
|
||||
| Owner | False | Buyer | Nenhum | Nenhum | Nenhum | Forte | Fraco |
|
||||
| Owner | True | Buyer | Nenhum | Nenhum | Nenhum | Forte | Fraco |
|
||||
| Owner | True | Owner | Nenhum | Forte | Forte | Forte | Forte |
|
||||
| Owner | True | Issuer | Nenhum | Fraco | Forte | Forte | Nenhum |
|
||||
| Issuer | False | Owner | Nenhum | Nenhum | Nenhum | Nenhum | Nenhum |
|
||||
| Issuer | False | Issuer | Forte | Nenhum | Nenhum | Nenhum | Nenhum |
|
||||
| Issuer | False | Buyer | Fraco | Nenhum | Nenhum | Nenhum | Nenhum |
|
||||
| Issuer | True | Owner | Nenhum | Fraco | Nenhum | Nenhum | Nenhum |
|
||||
| Issuer | True | Issuer | Forte | Forte | Nenhum | Nenhum | Nenhum |
|
||||
| Issuer | True | Buyer | Fraco | Nenhum | Nenhum | Nenhum | Nenhum |
|
||||
| Buyer | True | Buyer | Nenhum | Nenhum | Forte | Nenhum | Nenhum |
|
||||
| Buyer | True | Owner | Nenhum | Nenhum | Fraco | Nenhum | Nenhum |
|
||||
101
src/content/docs/pt-br/docs/hooks/functions/control/accept.mdx
Normal file
101
src/content/docs/pt-br/docs/hooks/functions/control/accept.mdx
Normal file
@@ -0,0 +1,101 @@
|
||||
---
|
||||
title: accept
|
||||
description: Aceita a transação de origem e confirma quaisquer alterações feitas pelo hook.
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton, Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/introduction/">Introdução</LinkButton>
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/execution-metadata">Metadados de Execução</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
Encerra a execução do hook com status: sucesso.
|
||||
|
||||
* Registra uma string de retorno e um código de retorno nos metadados da transação.
|
||||
* Confirma todas as alterações de estado.
|
||||
* Envia todas as transações `emit()`.
|
||||
* Permite que a transação de origem continue.
|
||||
|
||||
<Aside type="caution">
|
||||
Se a transação de origem for interrompida por algum outro motivo, este accept se torna um rollback. Veja: Ordem de Execução.
|
||||
</Aside>
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t accept (
|
||||
uint32_t read_ptr,
|
||||
uint32_t read_len,
|
||||
uint64_t error_code
|
||||
);
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function accept(msg: string, code: number): number
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
accept("Sucesso", 7, 100);
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
accept('Sucesso', 100)
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ----------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| read_ptr | uint32_t | <p>Ponteiro para uma string de retorno a ser armazenada nos metadados de execução.<br />Esta é qualquer string que o desenvolvedor do hook desejar retornar com a aceitação. <em>Pode ser nulo.</em></p> |
|
||||
| read_len | uint32_t | O tamanho da string de retorno. No máximo 32. _Pode ser nulo._ |
|
||||
| error_code | uint64_t | <p>Um código de retorno específico deste hook a ser armazenado nos metadados de execução.<br /><br />Semelhante ao código de retorno de uma aplicação em um sistema *nix. Por convenção, sucesso é zero.</p> |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| msg | string | <p>String a ser armazenada nos metadados de execução.<br />Esta é qualquer string que o desenvolvedor do hook desejar retornar com a aceitação. <em>Pode ser nulo.</em></p> |
|
||||
| code | number | <p>Um código de retorno específico deste hook a ser armazenado nos metadados de execução.<br /><br />Semelhante ao código de retorno de uma aplicação em um sistema *nix. Por convenção, sucesso é zero.</p> |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | Accept encerra o hook, portanto nenhum valor é retornado ao chamador. Por convenção, todas as APIs de Hook retornam `int64_t`, mas neste caso nada é retornado. |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Tipo | Descrição |
|
||||
| ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| number | Accept encerra o hook, portanto nenhum valor é retornado ao chamador. Por convenção, todas as APIs de Hook retornam `number`, mas neste caso nada é retornado. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
---
|
||||
title: rollback
|
||||
---
|
||||
import { Aside, Tabs, TabItem, LinkButton } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/introduction/">Introdução</LinkButton>
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/execution-metadata">Metadados de Execução</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
Encerra a execução do hook com status: rejeição.
|
||||
|
||||
* Registra uma string de retorno e um código de retorno nos metadados da transação.
|
||||
* Descarta todas as alterações de estado.
|
||||
* Descarta todas as transações `emit()`.
|
||||
* Não permite que a transação de origem continue.
|
||||
|
||||
<Aside type="caution">
|
||||
A transação de origem falhará com <code>tecHOOK_REJECTED</code> e uma taxa será cobrada. Veja: Ordem de Execução.
|
||||
</Aside>
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t rollback (
|
||||
uint32_t read_ptr,
|
||||
uint32_t read_len,
|
||||
uint64_t error_code
|
||||
);
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function rollback(error_msg: string, error_code: number): number
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
rollback("Rejeitado!", 9, 100);
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
rollback('Rejeitado!', 100)
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
|
||||
<table><thead><tr><th>Nome</th><th>Tipo</th><th width="202">Descrição</th></tr></thead><tbody><tr><td>read_ptr</td><td>uint32_t</td><td>Ponteiro para uma string de retorno a ser armazenada nos metadados de execução.<br />Esta é qualquer string que o desenvolvedor do hook desejar retornar com a aceitação. <em>Pode ser nulo.</em></td></tr><tr><td>read_len</td><td>uint32_t</td><td>O tamanho da string de retorno. No máximo 32. <em>Pode ser nulo.</em></td></tr><tr><td>error_code</td><td>uint64_t</td><td>Um código de retorno específico deste hook a ser armazenado nos metadados de execução.<br /><br />Semelhante ao código de retorno de uma aplicação em um sistema *nix. Por convenção, valores diferentes de zero indicam falha.</td></tr></tbody></table>
|
||||
</TabItem>
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
<table><thead><tr><th>Nome</th><th>Tipo</th><th width="202">Descrição</th></tr></thead><tbody><tr><td>error_msg</td><td>string</td><td>String a ser armazenada nos metadados de execução.<br />Esta é qualquer string que o desenvolvedor do hook desejar retornar com a aceitação. <em>Pode ser nulo.</em></td></tr><tr><td>error_code</td><td>number</td><td>Um código de retorno específico deste hook a ser armazenado nos metadados de execução.<br /><br />Semelhante ao código de retorno de uma aplicação em um sistema *nix. Por convenção, valores diferentes de zero indicam falha.</td></tr></tbody></table>
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
<table><thead><tr><th width="123">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>int64_t</td><td>Rollback encerra o hook, portanto nenhum valor é retornado ao chamador. Por convenção, todas as APIs de Hook retornam <code>int64_t</code>, mas neste caso nada é retornado.</td></tr></tbody></table>
|
||||
</TabItem>
|
||||
<TabItem label="JavaScript">
|
||||
<table><thead><tr><th width="123">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>number</td><td>Rollback encerra o hook, portanto nenhum valor é retornado ao chamador. Por convenção, todas as APIs de Hook retornam <code>number</code>, mas neste caso nada é retornado.</td></tr></tbody></table>
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,90 @@
|
||||
---
|
||||
title: cbak / Callback
|
||||
description: A função de callback do seu hook
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/compiling-hooks">Compilando Hooks</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
* `cbak` é uma função definida pelo usuário, chamada pelo `xahaud` para informar ao seu hook o status de uma transação emitida anteriormente
|
||||
* Alterações de estado e novas chamadas a emit podem ser feitas a partir de cbak, mas ele não pode fazer `rollback` de uma transação.
|
||||
* Quando cbak é executado, a transação emitida à qual o callback se refere passa a ser a transação de origem.
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t cbak (
|
||||
uint32_t what
|
||||
)
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
type Callback = (reserved: number) => number
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Exemplo
|
||||
|
||||
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t cbak(uint32_t reserved)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const Callback = (reserved: number) => {
|
||||
return 0
|
||||
}
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| -------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| reserved | uint32_t | <p>se <code>0</code>:<br />- a transação emitida à qual este callback se refere foi aceita com sucesso em um ledger.<br /><br />Se <code>1</code><br />- a transação emitida à qual o callback se refere NÃO foi aceita com sucesso em um ledger antes de expirar.</p> |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Nome | Tipo | Descrição |
|
||||
| -------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| reserved | number | <p>se <code>0</code>:<br />- a transação emitida à qual este callback se refere foi aceita com sucesso em um ledger.<br /><br />Se <code>1</code><br />- a transação emitida à qual o callback se refere NÃO foi aceita com sucesso em um ledger antes de expirar.</p> |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | -------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | Um código de retorno arbitrário que você deseja retornar do seu hook. Estará presente nos metadados da transação de origem. |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Tipo | Descrição |
|
||||
| ------ | -------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| number | Um código de retorno arbitrário que você deseja retornar do seu hook. Estará presente nos metadados da transação de origem. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,94 @@
|
||||
---
|
||||
title: hook
|
||||
description: A função principal do seu hook
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/compiling-hooks">Compilando Hooks</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
* `hook` é uma função definida pelo usuário, chamada pelo `xahaud` para disparar seu hook.
|
||||
* Sua função `hook` chama `accept` ou `reject` para aprovar ou rejeitar a transação de origem.
|
||||
* Se a execução chegar ao final da função, isso é implicitamente um `accept`.
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t hook (
|
||||
uint32_t reserved
|
||||
)
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
type Hook = (reserved: number) => number
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t hook(uint32_t reserved)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const Hook = (reserved: number) => {
|
||||
return 0
|
||||
}
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
<table><thead><tr><th width="183">Nome</th><th>Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>reserved</td><td>uint32_t</td><td>Reservado para uso futuro.</td></tr></tbody></table>
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
<table><thead><tr><th width="183">Nome</th><th>Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>reserved</td><td>number</td><td>Reservado para uso futuro.</td></tr></tbody></table>
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | -------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | Um código de retorno arbitrário que você deseja retornar do seu hook. Estará presente nos metadados da transação de origem. |
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Tipo | Descrição |
|
||||
| ------ | -------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| number | Um código de retorno arbitrário que você deseja retornar do seu hook. Estará presente nos metadados da transação de origem. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,70 @@
|
||||
---
|
||||
title: prepare
|
||||
description: Prepara uma transação JSON para emissão.
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/protocol-reference/transactions/">Transações</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="JavaScript">
|
||||
* Esta função recebe um objeto JSON de transação e o prepara para emissão.
|
||||
* A transação deve estar completa, exceto pelo campo Account, que deve ser sempre a conta Hook.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function prepare(
|
||||
txJson: Record<string, any> | Transaction
|
||||
): ErrorCode | Record<string, any> | Transaction
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const prepared_txn = prepare({
|
||||
TransactionType: "Payment",
|
||||
Destination: util_raddr(p1address_ns),
|
||||
Amount: parseFloat(drops_sent)*2
|
||||
})
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
<table><thead><tr><th>Nome</th><th width="124">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>txJson</td><td>Record<string, any> | Transaction</td><td>O JSON da transação, deve ser uma transação completa, exceto pelo Account (sempre a conta Hook).</td></tr></tbody></table>
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
<table><thead><tr><th width="231">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>ErrorCode | Record<string, any> | Transaction</td><td>Retorna um ErrorCode se houver um erro, ou o JSON da transação preparada ou o objeto Transaction.</td></tr></tbody></table>
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,110 @@
|
||||
---
|
||||
title: emit
|
||||
description: Emite uma nova transação a partir do hook
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/emitted-transactions">Transações Emitidas</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Lê uma transação a partir de `read_ptr`
|
||||
* Valida a transação contra as regras de emissão
|
||||
* Emite a transação para o consenso quando válida
|
||||
* Escreve o hash canônico da transação em `write_ptr`
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Esta função emite o JSON de transação fornecido.
|
||||
* Em caso de sucesso, retorna o número de hashes de transações emitidas. 
|
||||
* Se houver um erro, retorna um código de erro.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t emit (
|
||||
uint32_t write_ptr,
|
||||
uint32_t write_len,
|
||||
uint32_t read_ptr,
|
||||
uint32_t read_len
|
||||
);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function emit(
|
||||
txJson: Record<string, any> | Transaction
|
||||
): ErrorCode | ByteArray
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
if (emit(tx, tx_len) < 0)
|
||||
rollback("Failed to emit!", 15, 1);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const emitResult = emit(txJson)
|
||||
if(typeof emitResult === 'number')
|
||||
rollback("Failed to emit!", 1)
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
<table><thead><tr><th>Nome</th><th width="124">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>write_ptr</td><td>uint32_t</td><td>Ponteiro para um buffer onde escrever o hash da transação</td></tr><tr><td>write_len</td><td>uint32_t</td><td>O tamanho do buffer para escrever o hash da transação (deve ser 32.)</td></tr><tr><td>read_ptr</td><td>uint32_t</td><td>Ponteiro para a transação a ser emitida</td></tr><tr><td>read_len</td><td>uint32_t</td><td>O tamanho da transação</td></tr></tbody></table>
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
<table><thead><tr><th>Nome</th><th width="124">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>txJson</td><td>Record<string, any> | Transaction</td><td>O TX JSON a ser emitido.</td></tr></tbody></table>
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
<table><thead><tr><th width="127">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>int64_t</td><td>Em caso de sucesso, o número de bytes do hash da transação escritos (32), ou:<br /><br />Se negativo, um erro:<br /><code>OUT_OF_BOUNDS</code><br />- ponteiros/tamanhos especificados fora da memória do hook.<br /><br /><code>PREREQUISITE_NOT_MET</code><br />- <code>emit_reserve</code> deve ser chamado primeiro<br /><br /><code>TOO_MANY_EMITTED_TXN</code><br />- o número de transações emitidas agora é maior do que o prometido quando <code>emit_reserve</code> foi chamado anteriormente<br /><br /><code>EMISSION_FAILURE</code><br />- a transação estava malformada de acordo com as regras de emissão.</td></tr></tbody></table>
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
<table><thead><tr><th width="231">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>ErrorCode | ByteArray</td><td>Retorna um ErrorCode se houver um erro, ou um array de hashes de transações emitidas em caso de sucesso.</td></tr></tbody></table>
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,69 @@
|
||||
---
|
||||
title: etxn_burden
|
||||
description: Obtém o burden de uma hipotética transação emitida
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/emitted-transactions">Transações Emitidas</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
* Retorna o burden que uma transação emitida carregará.
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t etxn_burden (
|
||||
void
|
||||
);
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function etxn_burden(): ErrorCode | number
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t burden = etxn_burden();
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const burden = etxn_burden()
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
Nenhum
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
<table><thead><tr><th width="165">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>int64_t</td><td>O burden que uma transação emitida precisará para ser passada com sucesso para <code>emit()</code></td></tr></tbody></table>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
<table><thead><tr><th width="165">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>number</td><td>Um ErrorCode se houver um erro, ou o valor atual do burden em caso de sucesso.</td></tr></tbody></table>
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,113 @@
|
||||
---
|
||||
title: etxn_details
|
||||
description: Produz um sfEmitDetails adequado para uma transação que será emitida em breve
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/emitted-transactions">Transações Emitidas</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Gera e escreve um objeto sfEmitDetails de 105 bytes em `write_ptr` se cbak não estiver definido
|
||||
* Gera e escreve um objeto sfEmitDetails de 127 bytes em `write_ptr` se cbak estiver definido.
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Esta função fornece informações detalhadas sobre a transação.
|
||||
* Retorna um ErrorCode se houver um erro, ou um array com os detalhes da transação em caso de sucesso.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t etxn_details (
|
||||
uint32_t write_ptr,
|
||||
uint32_t write_len
|
||||
);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function etxn_details(): ErrorCode | ByteArray
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
uint8_t emitdet[105];
|
||||
int64_t result =
|
||||
etxn_details(emitdet, 105);
|
||||
if (result != 105)
|
||||
rollback("Etxndetails failed.", 19, 1);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const emitdet = etxn_details()
|
||||
if (typeof emitdet === 'string || emitdet.length != 105)
|
||||
rollback("Etxndetails failed.", 1)
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---------- | --------- | -------------------------------------------------------- |
|
||||
| write_ptr | uint32_t | Ponteiro para o buffer que receberá o registro sfEmitDetails |
|
||||
| write_len | uint32_t | Tamanho do buffer |
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
Nenhum parâmetro para JavaScript
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <p>O número de bytes escritos.<br /><br />Se negativo, um erro:<br /><code>OUT_OF_BOUNDS</code><br />- ponteiros/tamanhos especificados fora da memória do hook.<br /><br /><code>TOO_SMALL</code><br />- O buffer não é grande o suficiente para receber o registro<br /><br /><code>PREREQUISITE_NOT_MET</code><br />- O hook não chamou <code>etxn_reserve(n)</code> primeiro<br /><br /><code>FEE_TOO_LARGE</code><br />- O burden seria muito alto para a rede permitir.<br /><br /><code>INTERNAL_ERROR</code><br />- Um erro genérico no qual o rippled teve problemas para gerar o campo necessário.</p> |
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| ---------------------- | --------------------------------------------------------------------------------- |
|
||||
| ErrorCode | ByteArray | Um ErrorCode se houver um erro, ou um array com os detalhes da transação em caso de sucesso. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,98 @@
|
||||
---
|
||||
title: etxn_fee_base
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton, Aside } from '@astrojs/starlight/components';
|
||||
|
||||
<Aside type="caution">
|
||||
As taxas em um ledger com Hooks habilitados não são triviais. Veja: [Taxas de Hook](/pt-br/docs/hooks/concepts/hook-fees) para detalhes.
|
||||
</Aside>
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/emitted-transactions">Transações Emitidas</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
* Retorna o valor da taxa em drops recomendada para uma transação a ser emitida.
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t etxn_fee_base (
|
||||
uint32_t read_ptr,
|
||||
uint32_t read_len
|
||||
);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function etxn_fee_base(txblob: ByteArray | HexString): ErrorCode | number
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t fee_to_pay =
|
||||
etxn_fee_base(tx_blob, tx_blob_len);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const fee_to_pay = etxn_fee_base(tx_blob)
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
<table><thead><tr><th>Nome</th><th width="118">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>read_ptr</td><td>uint32_t</td><td>Ponteiro para o buffer contendo a transação serializada que você pretende emitir. O campo fee é obrigatório, mas ignorado (você pode usar zero). Use a saída desta função para preencher o campo fee corretamente.</td></tr><tr><td>read_len</td><td>uint32_t</td><td>O tamanho do tx blob.</td></tr></tbody></table>
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
<table><thead><tr><th>Nome</th><th width="118">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>txblob</td><td>ByteArray | HexString</td><td>O blob da transação, que pode ser um array de números ou uma string.</td></tr></tbody></table>
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <p>O menor número de drops que uma txn emitida precisaria para ser aceita.<br /><br />Se negativo, um erro:<br /><code>OUT_OF_BOUNDS</code><br />- O buffer fornecido não está validamente dentro da memória do hook.<br /><br /><code>PREREQUISITE_NOT_MET</code><br />- <code>etxn_reserve</code> não foi chamado primeiro.<br /><br /><code>INVALID_TXN</code><br />- O buffer fornecido não contém uma transação serializada válida. (A desserialização falhou, ou um campo obrigatório estava faltando.)</p> |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| ------ | ------------------------------------------------------------------------- |
|
||||
| number | Um ErrorCode se houver um erro, ou a taxa base calculada em caso de sucesso. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,78 @@
|
||||
---
|
||||
title: etxn_generation
|
||||
description: Obtém a geração de uma hipotética transação emitida
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/emitted-transactions">Transações Emitidas</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
* Retorna a geração que uma transação emitida carregará.
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t etxn_generation (
|
||||
void
|
||||
);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function etxn_generation(): ErrorCode | number
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t generation =
|
||||
etxn_generation();
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const generation = etxn_generation()
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
Nenhum
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | ---------------------------------------------------------------------------------------------- |
|
||||
| int64_t | A geração que uma transação emitida precisará para ser passada com sucesso para `emit()` |
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| ------ | --------------------------------------------------------------------------------------------------- |
|
||||
| number | Retorna um ErrorCode se houver um erro, ou um número indicando o resultado da geração em caso de sucesso. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,99 @@
|
||||
---
|
||||
title: etxn_nonce
|
||||
description: Gera um nonce de 32 bytes para uso em uma transação emitida
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/emitted-transactions">Transações Emitidas</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Escreve o Hash de 32 bytes em write_ptr
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Retorna um ErrorCode se houver um erro, ou um array contendo o valor do nonce em caso de sucesso.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t etxn_nonce (
|
||||
uint32_t write_ptr,
|
||||
uint32_t write_len
|
||||
);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function etxn_nonce(): ErrorCode | ByteArray
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
uint8_t n[32];
|
||||
int64_t bytes_written =
|
||||
etxn_nonce(n, 32);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const nonce = etxn_nonce()
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
|
||||
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---------- | --------- | ---------------------------------------------------------------------------------------- |
|
||||
| write_ptr | uint32_t | Ponteiro para um buffer de tamanho adequado para armazenar a saída. Deve ter pelo menos 32 bytes. |
|
||||
| write_len | uint32_t | Tamanho do buffer de saída. |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
Nenhum parâmetro
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
<table><thead><tr><th width="187">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>int64_t</td><td>O número de bytes escritos<br /><br />Se negativo, um erro:<br /><code>OUT_OF_BOUNDS</code><br />- ponteiros/tamanhos especificados fora da memória do hook.</td></tr></tbody></table>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
<table><thead><tr><th width="187">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>ErrorCode | ByteArray</td><td>Retorna um ErrorCode se houver um erro, ou um array contendo o valor do nonce em caso de sucesso.</td></tr></tbody></table>
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,97 @@
|
||||
---
|
||||
title: etxn_reserve
|
||||
description: Estima a taxa necessária para que uma transação seja emitida com sucesso
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/emitted-transactions">Transações Emitidas</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
* Especifica um número de transações emitidas que este hook pode emitir durante a execução.
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t etxn_fee_base (
|
||||
uint32_t count
|
||||
);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function etxn_reserve(count: number): ErrorCode | number
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
etxn_reserve(2);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
etxn_reserve(2)
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ----- | --------- | ------------------------------------------------------------------------------------------- |
|
||||
| count | uint32_t | O maior número de transações que este hook pode emitir durante uma única execução. |
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Nome | Tipo | Descrição |
|
||||
| ----- | ------ | ---------------------------------------------------------------- |
|
||||
| count | number | O número máximo de transações que este Hook tem permissão para emitir. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <p>O número máximo de transações emitidas que este hook pode emitir. Este valor será sempre o mesmo que o parâmetro <code>count</code>, ou um erro como abaixo.<br /><br />Se negativo, um erro:<br /><code>ALREADY_SET</code><br />- O hook já chamou esta função anteriormente.<br /><br /><code>TOO_BIG</code><br />- O número especificado de transações emitidas é muito grande.</p> |
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| ------ | ---------------------------------------------------------------------------------- |
|
||||
| number | Um ErrorCode se houver um erro, ou a contagem de transações configurada em caso de sucesso. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,127 @@
|
||||
---
|
||||
title: float_compare
|
||||
description: Realiza uma comparação entre dois números de ponto flutuante XFL
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton, Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/floating-point-numbers-xfl">Números de Ponto Flutuante (XFL)</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Avalia uma comparação entre dois números de ponto flutuante XFL
|
||||
* Retorna o resultado da comparação como um booleano codificado em um int64_t.
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Avalia uma comparação entre dois números de ponto flutuante XFL
|
||||
* Retorna um código de erro ou o resultado da comparação como um número.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t float_compare (
|
||||
int64_t float1,
|
||||
int64_t float2,
|
||||
uint32_t mode
|
||||
);
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function float_compare(
|
||||
f1: bigint,
|
||||
f2: bigint,
|
||||
mode: number
|
||||
): ErrorCode | number
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
if (float_compare(pusd_to_send, 0, COMPARE_LESS) == 1)
|
||||
{
|
||||
// pusd_to_send is less than 0
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
if (float_compare(pusd_to_send, 0n, COMPARE_LESS) == 1)
|
||||
{
|
||||
// pusd_to_send is less than 0
|
||||
}
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
|
||||
|
||||
| Nome | Tipo | Descrição |
|
||||
| ------ | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| float1 | int64_t | Um número de ponto flutuante de envoltório XFL representando o primeiro operando da comparação |
|
||||
| float2 | int64_t | Um número de ponto flutuante de envoltório XFL representando o segundo operando da comparação |
|
||||
| mode | uint32_t | Um campo de flags de bits composto por qualquer um (ou qualquer combinação logicamente válida) dos seguintes flags:<br /><code>COMPARE_EQUAL</code> `1`<br /><code>COMPARE_LESS</code> `2`<br /><code>COMPARE_GREATER</code> `4`<br /><br />Combinações válidas são:<br /><code>COMPARE_LESS</code> \| <code>COMPARE_GREATER</code><br />- Diferente<br /><br /><code>COMPARE_LESS</code> \| <code>COMPARE_EQUAL</code><br />- Menor ou igual a<br /><br /><code>COMPARE_GREATER</code> \| <code>COMPARE_EQUAL</code><br />- Maior ou igual a |
|
||||
|
||||
<Aside type="caution">
|
||||
Sempre verifique se a função retornou `1` em vez de `non-zero` (diferente de zero), já que códigos de erro negativos também serão classificados como `non-zero`.
|
||||
</Aside>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---- | ------ | -------------------------------------------------------------- |
|
||||
| f1 | bigint | O primeiro float a ser comparado. |
|
||||
| f2 | bigint | O segundo float a ser comparado. |
|
||||
| mode | number | O modo de comparação (ex.: menor que, igual a, maior que). |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <code>0</code> se a comparação foi logicamente falsa.<br /><code>1</code> se a comparação foi logicamente verdadeira.<br /><br />Se negativo, um erro:<br /><code>INVALID_FLOAT</code><br />- um dos parâmetros fornecidos não era um número de envoltório XFL válido<br /><br /><code>INVALID_ARGUMENT</code><br />- combinação inválida dos flags de comparação fornecidos. |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| ------------------- | ----------------------------------------------------------- |
|
||||
| ErrorCode ou number | Retorna um código de erro ou o resultado da comparação como um número. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,102 @@
|
||||
---
|
||||
title: float_divide
|
||||
description: Divide um XFL por outro número de ponto flutuante XFL
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/floating-point-numbers-xfl">Números de Ponto Flutuante (XFL)</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Divide um XFL por outro XFL
|
||||
* Retorna um novo XFL como um int64_t
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Divide uma representação de float por outra.
|
||||
* Um código de erro ou o quociente como um bigint.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t float_divide (
|
||||
int64_t float1,
|
||||
int64_t float2
|
||||
);
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function float_divide(f1: bigint, f2: bigint): ErrorCode | bigint
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t still_one =
|
||||
float_divide(float_one(), float_one());
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const still_one =
|
||||
float_divide(float_one(), float_one())
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ------ | -------- | ------------------------------------------------------------ |
|
||||
| float1 | int64_t | Um número de ponto flutuante de envoltório XFL para atuar como numerador |
|
||||
| float2 | int64_t | Um número de ponto flutuante de envoltório XFL para atuar como denominador |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---- | ------ | ------------------- |
|
||||
| f1 | bigint | O float dividendo. |
|
||||
| f2 | bigint | O float divisor. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <p>O número de envoltório XFL (xls17)<br /><br />Se negativo, um erro:<br /><code>INVALID_FLOAT</code><br />- o parâmetro fornecido não era um número de envoltório XFL válido ou a divisão resultou em um XFL que não pode ser representado.<br /><br /><code>DIVISION_BY_ZERO</code><br />- o parâmetro fornecido era zero.</p> |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Tipo | Descrição |
|
||||
| ------------------- | ------------------------------------------ |
|
||||
| bigint ou ErrorCode | Um código de erro ou o quociente como um bigint. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,76 @@
|
||||
---
|
||||
title: float_exponent
|
||||
description: Obtém o expoente de um número de envoltório XFL
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton, Aside } from '@astrojs/starlight/components';
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
<Aside type="caution" title="Substituída por macro">
|
||||
Esta função foi substituída por uma macro. Use a macro abaixo em seu código em vez disso.
|
||||
Para verificar a validade do XFL, use float_mantissa em conjunto com esta macro.
|
||||
</Aside>
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/floating-point-numbers-xfl">Números de Ponto Flutuante (XFL)</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Retorna a parte do expoente de um XFL como um inteiro com sinal
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
Como expoentes podem ser negativos, e como valores negativos são reservados para estados de erro, expoentes não podem ser retornados por funções. Por isso, esta função se tornou uma macro, conforme mostrado abaixo.
|
||||
|
||||
```c
|
||||
#define float_exponent(f)\
|
||||
(((int32_t)(((f) >> 54U) & 0xFFU)) - 97)
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const float_exponent = (f) => (Number(((f) >> 54n) & 0xFFn) - 97)
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t exponent =
|
||||
float_exponent(float_one());
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ------ | -------- | -------------------------------------- |
|
||||
| float1 | int64_t | Um número de ponto flutuante de envoltório XFL |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
116
src/content/docs/pt-br/docs/hooks/functions/float/float_int.mdx
Normal file
116
src/content/docs/pt-br/docs/hooks/functions/float/float_int.mdx
Normal file
@@ -0,0 +1,116 @@
|
||||
---
|
||||
title: float_int
|
||||
description: Converte um ponto flutuante XFL em um inteiro (floor)
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton, Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/floating-point-numbers-xfl">Números de Ponto Flutuante (XFL)</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Desloca à esquerda (multiplica por 10) o XFL pelo número de casas decimais especificado
|
||||
* Converte o XFL resultante em um inteiro, descartando qualquer resto
|
||||
* Retorna o inteiro
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Converte uma representação de float em um inteiro com casas decimais especificadas.
|
||||
* Um código de erro ou o inteiro resultante como um número.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t float_int (
|
||||
int64_t float1,
|
||||
uint32_t decimal_places,
|
||||
uint32_t absolute
|
||||
);
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function float_int(
|
||||
f1: bigint,
|
||||
decimal_places: number,
|
||||
abs: number
|
||||
): ErrorCode | number
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t drops =
|
||||
float_int(xahbalance, 6, 0);
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const drops =
|
||||
float_int(xahbalance, 6, 0);
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| --------------- | --------- | -------------------------------------------------------------------------------------------------------- |
|
||||
| float1 | int64_t | Um número de ponto flutuante de envoltório XFL representando o primeiro operando da adição |
|
||||
| decimal_places | uint32_t | O número de casas a deslocar a vírgula decimal para a direita antes de calcular o floor do ponto flutuante. |
|
||||
| absolute | uint32_t | Se `1`, também aplica o valor absoluto ao valor antes de retorná-lo. |
|
||||
|
||||
<Aside type="tip">
|
||||
Valores de retorno negativos são reservados para códigos de erro. Portanto, se você precisar executar esta função sobre um XFL negativo, use `absolute = 1`
|
||||
</Aside>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Nome | Tipo | Descrição |
|
||||
| --------------- | ------ | --------------------------------------------- |
|
||||
| f1 | bigint | O float a ser convertido |
|
||||
| decimal_places | number | O número de casas decimais a considerar. |
|
||||
| abs | number | Indica se deve ser usado o valor absoluto. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <p>O inteiro positivo calculado<br /><br />Se negativo, um erro:<br /><code>INVALID_FLOAT</code><br />- um dos parâmetros fornecidos não era um número de envoltório XFL válido<br /><br /><code>INVALID_ARGUMENT</code><br />- tentativa de especificar mais de 15 casas decimais.<br /><br /><code>CANT_RETURN_NEGATIVE</code><br />- tentativa de retornar um inteiro negativo, mas isso não é permitido, use <code>absolute = 1</code></p> |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| ------------------- | ----------------------------------------------------------- |
|
||||
| number ou ErrorCode | Retorna um código de erro ou o inteiro resultante como um número. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,101 @@
|
||||
---
|
||||
title: float_invert
|
||||
description: Divide um por um número de ponto flutuante XFL
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/floating-point-numbers-xfl">Números de Ponto Flutuante (XFL)</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Inverte uma representação de float.
|
||||
* Retorna um float invertido como um bigint ou um ErrorCode
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Divide `1` por um XFL
|
||||
* Retorna um novo XFL como um int64_t
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t float_invert (
|
||||
int64_t float1
|
||||
);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function float_invert(f1: bigint): ErrorCode | bigint
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t still_one =
|
||||
float_invert(float_one());
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const still_one =
|
||||
float_invert(float_one())
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ------ | -------- | -------------------------------------- |
|
||||
| float1 | int64_t | Um número de ponto flutuante de envoltório XFL |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---- | ----- | ------------------- |
|
||||
| f1 | float | O float a ser invertido |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <p>O número de envoltório XFL (xls17)<br /><br />Se negativo, um erro:<br /><code>INVALID_FLOAT</code><br />- o parâmetro fornecido não era um número de envoltório XFL válido ou a divisão resultou em um XFL que não pode ser representado.<br /><br /><code>DIVISION_BY_ZERO</code><br />- o parâmetro fornecido era zero.</p> |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Tipo | Descrição |
|
||||
| ------------------- | ------------------------------------------------ |
|
||||
| ErrorCode \| bigint | Um código de erro ou o float invertido como um bigint. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
111
src/content/docs/pt-br/docs/hooks/functions/float/float_log.mdx
Normal file
111
src/content/docs/pt-br/docs/hooks/functions/float/float_log.mdx
Normal file
@@ -0,0 +1,111 @@
|
||||
---
|
||||
title: float_log
|
||||
description: Calcula o logaritmo decimal de um XFL
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton, Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/floating-point-numbers-xfl">Números de Ponto Flutuante (XFL)</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Calcula o logaritmo decimal de um número XFL
|
||||
* Retorna o novo XFL
|
||||
|
||||
<Aside type="caution">
|
||||
Devido a restrições de desempenho, `float_log` converte o argumento para um ponto flutuante de precisão dupla IEEE base-2 antes de aplicar o logaritmo na base 10. Portanto, o resultado retornado frequentemente conterá menos precisão do que o esperado.
|
||||
</Aside>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Calcula o logaritmo de uma representação de float.
|
||||
* Retorna um código de erro ou o logaritmo como um bigint.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t float_log (
|
||||
int64_t float1
|
||||
);
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function float_log(f1: bigint): ErrorCode | bigint
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t zero =
|
||||
float_log(float_one());
|
||||
```
|
||||
|
||||
<Aside type="caution">
|
||||
Se um número negativo for passado, a função retornará `COMPLEX_NOT_SUPPORTED` se a raiz for uma raiz par.
|
||||
</Aside>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const zero =
|
||||
float_log(float_one())
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
|
||||
|
||||
| Nome | Tipo | Descrição |
|
||||
| ------ | -------- | ------------------------------------------------------------------------------------------------------ |
|
||||
| float1 | int64_t | Um número de ponto flutuante de envoltório XFL representando o número de ponto flutuante do qual calcular o logaritmo |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---- | ------ | ---------------------------------------- |
|
||||
| f1 | bigint | O float do qual calcular o logaritmo. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <p>O logaritmo calculado<br /><br />Se negativo, um erro:<br /><code>INVALID_FLOAT</code><br />- o parâmetro fornecido não era um número de envoltório XFL válido<br /><br /><code>COMPLEX_NOT_SUPPORTED</code><br />- o parâmetro fornecido era um número negativo, o que resultaria em um valor de retorno complexo.</p> |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Tipo | Descrição |
|
||||
| ------------------- | --------------------------------------------------- |
|
||||
| bigint ou ErrorCode | Retorna um código de erro ou o logaritmo como um bigint. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,102 @@
|
||||
---
|
||||
title: float_mantissa
|
||||
description: Obtém a mantissa de um número de envoltório XFL
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton, Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/floating-point-numbers-xfl">Números de Ponto Flutuante (XFL)</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Retorna a parte da mantissa de um XFL como um inteiro sem sinal
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Recupera a mantissa de uma representação de float.
|
||||
* Um código de erro ou a mantissa como um bigint.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t float_mantissa (
|
||||
int64_t float1
|
||||
);
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function float_mantissa(f1: bigint): ErrorCode | bigint
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t mantissa =
|
||||
float_mantissa(float_one());
|
||||
```
|
||||
|
||||
<Aside type="tip">
|
||||
A mantissa de um XFL negativo é sempre positiva. Use `float_sign` para determinar o sinal do número.
|
||||
</Aside>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const mantissa =
|
||||
float_mantissa(float_one());
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---- | ------ | ---------------------------------------- |
|
||||
| f1 | bigint | O float do qual recuperar a mantissa. |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ------ | -------- | -------------------------------------- |
|
||||
| float1 | int64_t | Um número de ponto flutuante de envoltório XFL |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <p>A mantissa do XFL<br /><br />Se negativo, um erro:<br /><code>INVALID_FLOAT</code><br />- o parâmetro fornecido não era um número de envoltório XFL válido</p> |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Tipo | Descrição |
|
||||
| ------------------- | ------------------------------------------ |
|
||||
| bigint ou ErrorCode | Um código de erro ou a mantissa como um bigint. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,123 @@
|
||||
---
|
||||
title: float_mulratio
|
||||
description: Multiplica um ponto flutuante XFL por um numerador e denominador não-XFL
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton, Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/floating-point-numbers-xfl">Números de Ponto Flutuante (XFL)</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Calcula a multiplicação de um número de ponto flutuante XFL (xls17) pelo quociente de dois inteiros
|
||||
* Retorna um novo XFL como um int64_t
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Multiplica um float por uma razão definida por um numerador e um denominador.
|
||||
* Retorna um código de erro ou um novo XFL como um bigint.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t float_mulratio (
|
||||
int64_t float1,
|
||||
uint32_t round_up,
|
||||
uint32_t numerator,
|
||||
uint32_t denominator
|
||||
);
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function float_mulratio(
|
||||
f1: bigint,
|
||||
round_up: number,
|
||||
numerator: number,
|
||||
denominator: number
|
||||
): ErrorCode | bigint
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t max_vault_pusd =
|
||||
float_mulratio(max_vault_pusd, 0,
|
||||
COLLATERALIZATION_NUMERATOR, COLLATERALIZATION_DENOMINATOR);
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const max_vault_pusd =
|
||||
float_mulratio(max_vault_pusd, 0,
|
||||
COLLATERALIZATION_NUMERATOR, COLLATERALIZATION_DENOMINATOR);
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ----------- | --------- | ------------------------------------------------------------------------------------------- |
|
||||
| float1 | int64_t | Um número de ponto flutuante de envoltório XFL representando o primeiro operando da multiplicação |
|
||||
| round_up | uint32_t | Se diferente de zero, todos os cálculos serão arredondados para cima |
|
||||
| numerator | uint32_t | O numerador do quociente pelo qual o float será multiplicado |
|
||||
| denominator | uint32_t | O denominador do quociente pelo qual o float será multiplicado |
|
||||
|
||||
<Aside type="caution">
|
||||
Certas multiplicações podem causar overflow, retornando um erro `INVALID_FLOAT`. No entanto, um **underflow** retorna como XFL Canonical Zero (ou seja, número de envoltório = 0).
|
||||
</Aside>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Nome | Tipo | Descrição |
|
||||
| ----------- | ------ | ------------------------------------------------------------------------------------------- |
|
||||
| f1 | bigint | Um número de ponto flutuante de envoltório XFL representando o primeiro operando da multiplicação |
|
||||
| round_up | number | Se diferente de zero, todos os cálculos serão arredondados para cima |
|
||||
| numerator | number | O numerador do quociente pelo qual o float será multiplicado |
|
||||
| denominator | number | O denominador do quociente pelo qual o float será multiplicado |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <p>O número de envoltório XFL (xls17)<br /><br />Se negativo, um erro:<br /><code>INVALID_FLOAT</code><br />- um dos parâmetros fornecidos não era um número de envoltório XFL válido<br /><br /><code>OVERFLOW</code><br />- o resultado da multiplicação era muito grande para ser armazenado em um XFL.<br /><br /><code>DIVISION_BY_ZERO</code><br />- o denominador fornecido era zero.</p>
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| ------------------- | ----------------------------------------------------------- |
|
||||
| ErrorCode ou bigint | Retorna um código de erro ou o número de envoltório XFL (xls17). |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,116 @@
|
||||
---
|
||||
title: float_multiply
|
||||
description: Multiplica dois números XFL entre si
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton, Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/floating-point-numbers-xfl">Números de Ponto Flutuante (XFL)</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Calcula a multiplicação de dois números de ponto flutuante XFL (xls17)
|
||||
* Retorna um novo XFL como um int64_t
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Calcula a multiplicação de dois números de ponto flutuante XFL (xls17)
|
||||
* Retorna um código de erro ou um novo XFL como um bigint.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t float_multiply (
|
||||
int64_t float1,
|
||||
int64_t float2
|
||||
);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function float_multiply(f1: bigint, f2: bigint): ErrorCode | bigint
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t max_vault_pusd =
|
||||
float_multiply(vault_xrp, exchange_rate);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const max_vault_pusd =
|
||||
float_multiply(vault_xrp, exchange_rate)
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
|
||||
|
||||
| Nome | Tipo | Descrição |
|
||||
| ------ | -------- | -------------------------------------------------------------------------------------------- |
|
||||
| float1 | int64_t | Um número de ponto flutuante de envoltório XFL representando o primeiro operando da multiplicação |
|
||||
| float2 | int64_t | Um número de ponto flutuante de envoltório XFL representando o segundo operando da multiplicação |
|
||||
|
||||
<Aside type="caution">
|
||||
Certas multiplicações podem causar overflow, retornando um erro `INVALID_FLOAT`. No entanto, um **underflow** retorna como XFL Canonical Zero (ou seja, número de envoltório = 0).
|
||||
</Aside>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---- | ------ | -------------------------------------------------------------------------------------------- |
|
||||
| f1 | bigint | Um número de ponto flutuante de envoltório XFL representando o primeiro operando da multiplicação |
|
||||
| f2 | bigint | Um número de ponto flutuante de envoltório XFL representando o segundo operando da multiplicação |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <p>O número de envoltório XFL (xls17)<br /><br />Se negativo, um erro:<br /><code>INVALID_FLOAT</code><br />- um dos parâmetros fornecidos não era um número de envoltório XFL válido<br /><br /><code>OVERFLOW</code><br />- o resultado da multiplicação era muito grande para ser armazenado em um XFL.</p> |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| ------------------ | ------------------------------------------------- |
|
||||
| ErrorCode ou bigint | Um código de erro ou o número de envoltório XFL (xls17) |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,109 @@
|
||||
---
|
||||
title: float_negate
|
||||
description: Nega um número de ponto flutuante XFL
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton, Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/floating-point-numbers-xfl">Números de Ponto Flutuante (XFL)</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Multiplica um XFL por `-1`
|
||||
* Retorna um novo XFL como um int64_t
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Nega uma representação de float.
|
||||
* Retorna um código de erro ou o float negado como um bigint.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t float_negate (
|
||||
int64_t float1
|
||||
);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function float_negate(f1: bigint): ErrorCode | bigint
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t negative_one =
|
||||
float_negate(float_one());
|
||||
```
|
||||
|
||||
<Aside type="tip" title="Caso especial">
|
||||
A negação do Canonical Zero é o próprio Canonical Zero. Diferentemente de alguns padrões de ponto flutuante (como o IEEE), não existe "zero negativo" no XFL.
|
||||
</Aside>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const negative_one =
|
||||
float_negate(float_one());
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ------ | -------- | -------------------------------------- |
|
||||
| float1 | int64_t | Um número de ponto flutuante de envoltório XFL |
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---- | ------ | -------------------- |
|
||||
| f1 | bigint | O float a ser negado. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <p>O número de envoltório XFL (xls17)<br /><br />Se negativo, um erro:<br /><code>INVALID_FLOAT</code><br />- um dos parâmetros fornecidos não era um número de envoltório XFL válido</p>
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Tipo | Descrição |
|
||||
| ------------------- | -------------------------------------------------- |
|
||||
| ErrorCode ou bigint | Um código de erro ou o número de envoltório XFL (xls17). |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,82 @@
|
||||
---
|
||||
title: float_one
|
||||
description: Retorna o número 1 representado em um número de envoltório XFL
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/floating-point-numbers-xfl">Números de Ponto Flutuante (XFL)</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Retorna um (`1`) como um XFL int64_t
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Recupera a representação em float de um número.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t float_one();
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function float_one(): ErrorCode | bigint
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t one =
|
||||
float_one();
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const one = float_one()
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
Esta função não possui parâmetros.
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | -------------------------------- |
|
||||
| int64_t | O número de envoltório XFL (xls17) |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Tipo | Descrição |
|
||||
| ------------------- | -------------------------------- |
|
||||
| ErrorCode \| bigint | O número de envoltório XFL (xls17) |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
116
src/content/docs/pt-br/docs/hooks/functions/float/float_root.mdx
Normal file
116
src/content/docs/pt-br/docs/hooks/functions/float/float_root.mdx
Normal file
@@ -0,0 +1,116 @@
|
||||
---
|
||||
title: float_root
|
||||
description: Calcula a raiz n-ésima de um XFL
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton, Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/floating-point-numbers-xfl">Números de Ponto Flutuante (XFL)</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Calcula a raiz `n-ésima` de um número XFL
|
||||
* Retorna o novo XFL
|
||||
|
||||
<Aside type="caution">
|
||||
Devido a restrições de desempenho, `float_root` converte o argumento para um ponto flutuante de precisão dupla IEEE base-2 antes de aplicar a raiz n-ésima. Portanto, o resultado retornado frequentemente conterá menos precisão do que o esperado. Se você precisar de maior precisão, considere dividir seu XFL em um produto alto e um produto baixo, depois calcule individualmente as raízes quadradas desses produtos e multiplique os resultados entre si.
|
||||
</Aside>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Calcula a raiz n-ésima de uma representação de float.
|
||||
* Um código de erro ou a raiz resultante como um bigint.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t float_root (
|
||||
int64_t float1,
|
||||
uint32_t n
|
||||
);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function float_root(f1: bigint, n: number): ErrorCode | bigint
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t three =
|
||||
float_root(nine, 2);
|
||||
```
|
||||
|
||||
<Aside type="caution">
|
||||
Se um número negativo for passado, a função retornará `COMPLEX_NOT_SUPPORTED` se a raiz for uma raiz par.
|
||||
</Aside>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const three =
|
||||
float_root(nine, 2)
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ------ | --------- | -------------------------------------------------------------------------------------------------------- |
|
||||
| float1 | int64_t | Um número de ponto flutuante de envoltório XFL representando o número de ponto flutuante do qual calcular a raiz quadrada |
|
||||
| n | uint32_t | A raiz a ser calculada, por exemplo `2` é uma raiz quadrada. |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---- | ------ | ------------------------------------ |
|
||||
| f1 | bigint | O float do qual calcular a raiz. |
|
||||
| n | number | O grau da raiz a ser calculada. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <p>A raiz n-ésima calculada<br /><br />Se negativo, um erro:<br /><code>INVALID_FLOAT</code><br />- o parâmetro fornecido não era um número de envoltório XFL válido<br /><br /><code>COMPLEX_NOT_SUPPORTED</code><br />- o parâmetro fornecido era um número negativo, o que resultaria em uma raiz complexa.</p> |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| ------------------- | -------------------------------------------------------- |
|
||||
| bigint ou ErrorCode | Retorna um código de erro ou a raiz resultante como um bigint. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
119
src/content/docs/pt-br/docs/hooks/functions/float/float_set.mdx
Normal file
119
src/content/docs/pt-br/docs/hooks/functions/float/float_set.mdx
Normal file
@@ -0,0 +1,119 @@
|
||||
---
|
||||
title: float_set
|
||||
description: Cria um float a partir de um expoente e uma mantissa
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton, Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/floating-point-numbers-xfl">Números de Ponto Flutuante (XFL)</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Calcula um ponto flutuante XFL (xls17) a partir do expoente e da mantissa fornecidos
|
||||
* Retorna esse XFL como um int64_t
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Define o expoente e a mantissa de uma representação de float.
|
||||
* Retorna um código de erro ou um novo XFL como um bigint.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t float_set (
|
||||
int32_t exponent,
|
||||
int64_t mantissa
|
||||
);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function float_set(exponent: number, mantissa: number): ErrorCode | bigint
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t small_amount =
|
||||
float_set(-81, 1);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const small_amount = float_set(-81, 1);
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| -------- | -------- | --------------------------------------------------------------- |
|
||||
| exponent | int32_t | Um expoente no intervalo de `-96` a `80` |
|
||||
| mantissa | int64_t | Uma mantissa. Se negativa, o sinal do float é negativo. |
|
||||
|
||||
<Aside type="caution">
|
||||
Ao definir uma mantissa com mais ou menos de 16 dígitos decimais, o expoente será ajustado para garantir que a mantissa tenha exatamente 16 dígitos. Esse ajuste pode resultar em um `INVALID_FLOAT` em algumas circunstâncias.
|
||||
</Aside>
|
||||
|
||||
<Aside type="tip" title="Caso especial">
|
||||
O XFL canonical 0 também é 0 no número de envoltório. Portanto, nunca há necessidade de chamar `float_set(0,0);`
|
||||
</Aside>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Nome | Tipo | Descrição |
|
||||
| -------- | ------ | --------------------------------------------------------------- |
|
||||
| exponent | bigint | Um expoente no intervalo de `-96` a `80` |
|
||||
| mantissa | bigint | Uma mantissa. Se negativa, o sinal do float é negativo. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <p>O número de envoltório XFL (xls17)<br /><br />Se negativo, um erro:<br /><code>INVALID_FLOAT</code><br />- O ajuste da mantissa para 16 dígitos produziu um underflow ou overflow.</p>
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| ------------------- | -------------------------------------------------- |
|
||||
| ErrorCode \| bigint | Um código de erro ou o número de envoltório XFL (xls17). |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
101
src/content/docs/pt-br/docs/hooks/functions/float/float_sign.mdx
Normal file
101
src/content/docs/pt-br/docs/hooks/functions/float/float_sign.mdx
Normal file
@@ -0,0 +1,101 @@
|
||||
---
|
||||
title: float_sign
|
||||
description: Obtém o sinal de um número de envoltório XFL
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton, Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/floating-point-numbers-xfl">Números de Ponto Flutuante (XFL)</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Retorna `1` se o XFL for negativo, caso contrário retorna 0
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Retorna 1 se o XFL for negativo, caso contrário retorna 0
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t float_sign (
|
||||
int64_t float1
|
||||
);
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function float_sign(f1: bigint): ErrorCode | number
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t sign =
|
||||
float_sign(float_one());
|
||||
```
|
||||
|
||||
<Aside type="tip">
|
||||
O bit de sinal dentro do XFL é `0` quando o XFL é negativo, porém esta função segue a convenção padrão de computação e retorna `1` se o número for negativo.
|
||||
</Aside>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const sign =
|
||||
float_sign(float_one());
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ------ | -------- | -------------------------------------- |
|
||||
| float1 | int64_t | Um número de ponto flutuante de envoltório XFL |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---- | ------ | ---------------------------------------- |
|
||||
| f1 | bigint | O float do qual recuperar a mantissa. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <p>O sinal do XFL:<br /><code>0</code> se positivo, <code>1</code> se negativo.<br /><br />Se negativo, um erro:<br /><code>INVALID_FLOAT</code><br />- o parâmetro fornecido não era um número de envoltório XFL válido</p>
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Tipo | Descrição |
|
||||
| ------------------- | ------------------------------------------ |
|
||||
| bigint ou ErrorCode | Um código de erro ou a mantissa como um bigint. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
138
src/content/docs/pt-br/docs/hooks/functions/float/float_sto.mdx
Normal file
138
src/content/docs/pt-br/docs/hooks/functions/float/float_sto.mdx
Normal file
@@ -0,0 +1,138 @@
|
||||
---
|
||||
title: float_sto
|
||||
description: Gera um XFL como um objeto serializado
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton, Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/floating-point-numbers-xfl">Números de Ponto Flutuante (XFL)</LinkButton>
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/serialized-objects">Objetos Serializados</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Lê um número de ponto flutuante XFL e, opcionalmente, um código de campo e um código de moeda
|
||||
* Escreve um valor (amount) serializado em `write_ptr` conforme os parâmetros fornecidos
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Armazena uma representação de float em um campo especificado.
|
||||
* Retorna um código de erro ou o valor atualizado como um array de números.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t float_sto (
|
||||
uint32_t write_ptr,
|
||||
uint32_t write_len,
|
||||
uint32_t cread_ptr,
|
||||
uint32_t cread_len,
|
||||
uint32_t iread_ptr,
|
||||
uint32_t iread_len,
|
||||
int64_t float1,
|
||||
uint32_t field_code
|
||||
);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function float_sto(
|
||||
currency: ByteArray | HexString | undefined,
|
||||
issuer: ByteArray | HexString | undefined,
|
||||
f1: bigint,
|
||||
field_code: number
|
||||
): ErrorCode | ByteArray
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
#define SBUF(str) (uint32_t)(str), sizeof(str)
|
||||
uint8_t amt_out[48];
|
||||
if (float_sto(SBUF(amt_out),
|
||||
SBUF(currency), SBUF(hook_accid), pusd_to_send, -1) < 0)
|
||||
rollback(SBUF("Peggy: Could not dump pusd amount into sto"), 1);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const amt_out = float_sto(currency, hook_accid, pusd_to_send, -1)
|
||||
if (typeof amt_out === 'number')
|
||||
rollback("Peggy: Could not dump pusd amount into sto", 1)
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ----------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| write_ptr | uint32_t | Ponteiro para um buffer de tamanho adequado para armazenar o campo de valor (amount) serializado. Recomenda-se pelo menos 48 bytes. |
|
||||
| write_len | uint32_t | O tamanho do buffer de saída. |
|
||||
| cread_ptr | uint32_t | Ponteiro para um buffer contendo o código de moeda a ser serializado na saída. _Pode ser nulo._ |
|
||||
| cread_len | uint32_t | O tamanho do código de moeda. Deve ser 20 ou 3 ou 0 (nulo). |
|
||||
| iread_ptr | uint32_t | Ponteiro para um buffer contendo o Account ID do emissor a ser serializado na saída. _Pode ser nulo._ |
|
||||
| iread_len | uint32_t | O tamanho do Account ID do emissor. Deve ser 20 ou 0 (nulo). |
|
||||
| float1 | int64_t | Um número de ponto flutuante de envoltório XFL a ser serializado. |
|
||||
| field_code | uint32_t | <p>O código de campo <code>sf</code> a ser usado como prefixo do valor (amount) serializado. Ex.: <code>sfAmount</code>.<br />Se este campo for <code>0xFFFFFFFFU</code> (ou seja, <code>(uint32_t)(-1)</code>), então nenhum código de campo é antecedido à saída, e nenhum emissor ou código de moeda é anexado, mas a serialização ocorre como um valor (amount) de ponto flutuante.<br />Se este campo for 0, nenhum código de campo é antecedido à saída, e nenhum emissor ou código de moeda é anexado, mas a serialização ocorre como se o valor (amount) fosse um valor nativo de XRP em vez de um ponto flutuante.</p> |
|
||||
|
||||
<Aside type="tip">
|
||||
Para gerar um valor (amount) em `XAH`, pré-popule o código de campo no buffer de saída e, em seguida, passe o buffer de saída incrementado para o novo início e `0` como field_code
|
||||
</Aside>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Nome | Tipo | Descrição |
|
||||
| ----------- | ----------------------------------- | ---------------------------------------------------------- |
|
||||
| currency | ByteArray \| HexString \| undefined | O valor atual no qual armazenar. |
|
||||
| issuer | ByteArray \| HexString \| undefined | O valor a ser armazenado. |
|
||||
| f1 | bigint | O código de campo indicando onde armazenar o float. |
|
||||
| field_code | number | Um código de erro ou o valor atualizado como um array de números. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <p>O número de bytes escritos no buffer de saída.<br /><br />Se negativo, um erro:<br /><code>INVALID_FLOAT</code><br />- o float fornecido não era um número de envoltório XFL válido<br /><br /><code>OUT_OF_BOUNDS</code><br />- ponteiros/tamanhos especificados fora da memória do hook.<br /><br /><code>INVALID_ARGUMENT</code><br />- Se instruído a gerar a saída como <code>XRP</code> ou sem <code>field code</code>, então todos os ponteiros e tamanhos que não sejam de escrita devem ser 0 (nulo).<br /><br /><code>TOO_SMALL</code><br />- O buffer de saída era pequeno demais para receber o objeto serializado.<br /><br /><code>XFL_OVERFLOW</code><br />- Expressar a saída causou um overflow durante a normalização.</p>
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| ---------------------- | ------------------------------------------------------------------ |
|
||||
| ErrorCode \| ByteArray | Retorna um código de erro ou o valor atualizado como um array de números. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,109 @@
|
||||
---
|
||||
title: float_sto_set
|
||||
description: Lê um valor (amount) serializado em um XFL
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/floating-point-numbers-xfl">Números de Ponto Flutuante (XFL)</LinkButton>
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/serialized-objects">Objetos Serializados</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Lê um número de ponto flutuante serializado.
|
||||
* Se houver mais campos/dados após o número de ponto flutuante serializado, eles são ignorados.
|
||||
* Retorna como um número de envoltório XFL
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Define o buffer para armazenar representações de float.
|
||||
* Retorna ErrorCode ou o resultado como um número.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t float_sto_set (
|
||||
uint32_t read_ptr,
|
||||
uint32_t read_len
|
||||
);
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function float_sto_set(buf: ByteArray | HexString): ErrorCode | number
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t vault_pusd = float_sto_set(vault, 8);
|
||||
if (vault_pusd < 0)
|
||||
rollback("Failed to parse serialized float.", 33, 1);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const vault_pusd = float_sto_set(vault)
|
||||
if (typeof vault_pusd === 'string')
|
||||
rollback("Failed to parse serialized float.", 1)
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| --------- | --------- | ----------------------------------------------------------------- |
|
||||
| read_ptr | uint32_t | Ponteiro para um buffer contendo o XFL serializado. _Pode ser nulo._ |
|
||||
| read_len | uint32_t | O tamanho do buffer. |
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---- | ---------------------- | ------------------ |
|
||||
| buf | ByteArray \| HexString | O buffer a ser definido. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| int64_t | <p>O número de bytes escritos no buffer de saída.<br /><br />Se negativo, um erro:<br /><code>NOT_AN_OBJECT</code><br />- o buffer fornecido não continha um número de ponto flutuante serializado válido<br /><br /><code>OUT_OF_BOUNDS</code><br />- ponteiros/tamanhos especificados fora da memória do hook.</p>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Tipo | Descrição |
|
||||
| ------------------- | ---------------------------------------- |
|
||||
| ErrorCode ou number | Um código de erro ou o resultado como um número. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
112
src/content/docs/pt-br/docs/hooks/functions/float/float_sum.mdx
Normal file
112
src/content/docs/pt-br/docs/hooks/functions/float/float_sum.mdx
Normal file
@@ -0,0 +1,112 @@
|
||||
---
|
||||
title: float_sum
|
||||
description: Soma dois números XFL entre si
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton, Aside } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/floating-point-numbers-xfl">Números de Ponto Flutuante (XFL)</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Calcula a soma de dois números de ponto flutuante XFL (xls17)
|
||||
* Retorna um novo XFL como um int64_t
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Soma duas representações de float.
|
||||
* Retorna um código de erro ou a soma como um bigint.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t float_sum (
|
||||
int64_t float1,
|
||||
int64_t float2
|
||||
);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function float_sum(f1: bigint, f2: bigint): ErrorCode | bigint
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t two =
|
||||
float_sum(float_one(), float_one());
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const two =
|
||||
float_sum(float_one(), float_one());
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
|
||||
|
||||
| Nome | Tipo | Descrição |
|
||||
| ------ | -------- | -------------------------------------------------------------------------------------- |
|
||||
| float1 | int64_t | Um número de ponto flutuante de envoltório XFL representando o primeiro operando da soma |
|
||||
| float2 | int64_t | Um número de ponto flutuante de envoltório XFL representando o segundo operando da soma |
|
||||
|
||||
<Aside type="tip">
|
||||
Para subtrair dois floats, use `float_negate` no segundo float e depois use `float_sum`.
|
||||
</Aside>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---- | ------ | ------------------------ |
|
||||
| f1 | bigint | O primeiro float a ser somado. |
|
||||
| f2 | bigint | O segundo float a ser somado. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <p>O número de envoltório XFL (xls17)<br /><br />Se negativo, um erro:<br /><code>INVALID_FLOAT</code><br />- um dos parâmetros fornecidos não era um número de envoltório XFL válido<br /><br /><code>OVERFLOW</code><br />- o resultado da soma era muito grande para ser armazenado em um XFL.</p>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Tipo | Descrição |
|
||||
| ------------------- | ------------------------------------- |
|
||||
| ErrorCode ou bigint | Um código de erro ou a soma como um bigint. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -0,0 +1,94 @@
|
||||
---
|
||||
title: hook_account
|
||||
description: Recupera o ID da conta de 20 bytes em que o Hook está sendo executado
|
||||
---
|
||||
import { Tabs, TabItem } from '@astrojs/starlight/components';
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Escreve o ID da conta de 20 bytes no write_ptr
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Recupera o ID da conta de 20 bytes em que o Hook está sendo executado.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t hook_account (
|
||||
uint32_t write_ptr,
|
||||
uint32_t write_len
|
||||
);
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
``JavaScript
|
||||
function hook_account(): ErrorCode | ByteArray
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
uint8_t hook_acc_id[20];
|
||||
int64_t bytes_written =
|
||||
hook_account(hook_acc_id, 20);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const hook_acc_id =hook_account()
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---------- | --------- | ---------------------------------------------------------------------------------------- |
|
||||
| write_ptr | uint32_t | Ponteiro para um buffer de tamanho adequado para armazenar a saída. Deve ter pelo menos 20 bytes. |
|
||||
| write_len | uint32_t | Tamanho do buffer de saída. |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
Sem parâmetros
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| int64_t | <p>O número de bytes escritos<br /><br />Se negativo, um erro:<br /><code>OUT_OF_BOUNDS</code><br />- ponteiros/tamanhos especificados fora da memória do hook.</p> |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Tipo | Descrição |
|
||||
| ---------------------- | ----------------------------------------------------------------------------------------- |
|
||||
| ErrorCode ou ByteArray | Retorna o ID da conta em que o Hook está sendo executado, ou um código de erro se a recuperação falhar. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
---
|
||||
title: hook_again
|
||||
description: Retorna a posição na cadeia de hooks que o hook atualmente em execução ocupa
|
||||
---
|
||||
import { Tabs, TabItem } from '@astrojs/starlight/components';
|
||||
|
||||
### Comportamento
|
||||
|
||||
* Se o hook está sendo executado fortemente, marca este hook específico na cadeia para [Execução Novamente como Fraca](/pt-br/docs/hooks/concepts/weak-and-strong).
|
||||
* Se a transação de origem for aplicada com sucesso, o hook será chamado novamente em uma segunda Execução Fraca.
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t hook_again(void);
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function hook_again(): ErrorCode | number
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t result =
|
||||
hook_again();
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const result = hook_again()
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Parâmetros
|
||||
|
||||
Esta API não possui parâmetros
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
<table><thead><tr><th width="176">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>int64_t</td><td><code>1</code> se marcado com sucesso para Novamente como Fraca.<br /><br /><code>PREREQUISITE_NOT_MET</code><br />- Este hook já está sendo executado fracamente no momento da chamada.<br /><br /><code>ALREADY_SET</code><br />- A função já foi chamada nesta execução.</td></tr></tbody></table>
|
||||
</TabItem>
|
||||
<TabItem label="JavaScript">
|
||||
<table><thead><tr><th width="176">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>number</td><td>Retorna um código de status indicando o resultado da operação.</td></tr></tbody></table>
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
---
|
||||
title: hook_hash
|
||||
description: Recupera o SHA512H de 32 bytes, com viés de namespace, do Hook atualmente em execução
|
||||
---
|
||||
import { Tabs, TabItem } from '@astrojs/starlight/components';
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Busca o hash do hook instalado na conta hook na posição `hook_no`
|
||||
* Escreve o hash de 32 bytes em `write_ptr`
|
||||
</TabItem>
|
||||
<TabItem label="JavaScript">
|
||||
* Busca o hash do hook instalado na conta hook na posição especificada.
|
||||
* O SHA512H com viés de namespace do Hook atualmente em execução, ou um código de erro se a busca falhar.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t hook_hash (
|
||||
uint32_t write_ptr,
|
||||
uint32_t write_len,
|
||||
int32_t hook_no
|
||||
);
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function hook_hash(hookno: number): ErrorCode | ByteArray
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
uint8_t hash[32];
|
||||
int64_t bytes_written =
|
||||
hook_hash(hash, 32, -1);
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const hash = hook_hash(hookno)
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---------- | --------- | ---------------------------------------------------------------------------------------------- |
|
||||
| write_ptr | uint32_t | Ponteiro para um buffer de tamanho adequado para armazenar a saída. Deve ter pelo menos 32 bytes. |
|
||||
| write_len | uint32_t | Tamanho do buffer de saída. |
|
||||
| hook_no | int32_t | A posição na cadeia de hooks em que o hook está localizado, ou -1 para o hook atualmente em execução. |
|
||||
</TabItem>
|
||||
<TabItem label="JavaScript">
|
||||
| Nome | Tipo | Descrição |
|
||||
| -------- | ------ | ---------------------------------------------------------------------------------------------- |
|
||||
| hook_no | number | A posição na cadeia de hooks em que o hook está localizado, ou -1 para o hook atualmente em execução. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <p>O número de bytes escritos<br /><br />Se negativo, um erro:<br /><code>OUT_OF_BOUNDS</code><br />- ponteiros/tamanhos especificados fora da memória do hook.<br /><br /><code>DOESNT_EXIST</code><br />- O número de sequência do hook especificado não existe na cadeia de hooks.</p> |
|
||||
</TabItem>
|
||||
<TabItem label="JavaScript">
|
||||
| Tipo | Descrição |
|
||||
| ---------------------- | ----------------------------------------------------------------------------------------------------------- |
|
||||
| ByteArray ou ErrorCode | Retorna o SHA512H com viés de namespace do Hook atualmente em execução, ou um código de erro se a busca falhar. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
---
|
||||
title: hook_param
|
||||
description: Recupera o valor do parâmetro para um parâmetro de hook nomeado
|
||||
---
|
||||
import { Tabs, TabItem } from '@astrojs/starlight/components';
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Busca o valor de um parâmetro nomeado especificado em `read_ptr`
|
||||
* Escreve o valor do parâmetro em `write_ptr`
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Recupera o valor de um parâmetro associado à chave especificada.
|
||||
* Retorna o valor associado à chave, ou um código de erro se a recuperação falhar.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t hook_param (
|
||||
uint32_t write_ptr,
|
||||
uint32_t write_len,
|
||||
uint32_t read_ptr,
|
||||
uint32_t read_len
|
||||
);
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function hook_param(key: ByteArray | HexString): ErrorCode | ByteArray
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
uint8_t pname[] = {0xCAU, 0xFEU};
|
||||
uint8_t pvalue[32];
|
||||
int64_t value_len =
|
||||
hook_param(pvalue, 32, pname, 2);
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const pname = [0xCA, 0xFE]
|
||||
const pvalue = hook_param(pname)
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---------- | --------- | ---------------------------------------------------------------------------------------- |
|
||||
| write_ptr | uint32_t | Ponteiro para um buffer de tamanho adequado para armazenar a saída. Deve ter pelo menos 32 bytes. |
|
||||
| write_len | uint32_t | Tamanho do buffer de saída. |
|
||||
| read_ptr | uint32_t | Ponteiro para um buffer contendo o nome do parâmetro |
|
||||
| read_len | uint32_t | Tamanho do nome do parâmetro |
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---- | ---------------------- | -------------------------------------------------- |
|
||||
| key | ByteArray ou HexString | A chave para a qual recuperar o valor do parâmetro. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <p>O número de bytes escritos<br /><br />Se negativo, um erro:<br /><code>OUT_OF_BOUNDS</code><br />- ponteiros/tamanhos especificados fora da memória do hook.<br /><br /><code>DOESNT_EXIST</code><br />- O parâmetro especificado não existe ou é nulo<br /><br /><code>TOO_SMALL</code><br />- O nome do parâmetro não pode ser nulo<br /><br /><code>TOO_BIG</code><br />- O nome do parâmetro é maior que 32 bytes</p> |
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| ---------------------- | ----------------------------------------------------------------------------------- |
|
||||
| ByteArray ou ErrorCode | Retorna o valor associado à chave, ou um código de erro se a recuperação falhar. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
---
|
||||
title: hook_param_set
|
||||
description: >-
|
||||
Define ou exclui um parâmetro em um hook na mesma conta, mais adiante na
|
||||
cadeia de execução
|
||||
---
|
||||
import { Tabs, TabItem } from '@astrojs/starlight/components';
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Procura na cadeia de hooks da conta hook por um hash de 32 bytes indicado por `hread_ptr`
|
||||
* Se encontrado: define um parâmetro:
|
||||
* Com o nome do parâmetro indicado por `kread_ptr` e
|
||||
* O valor do parâmetro indicado por `read_ptr`
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Define um parâmetro para o hook com o valor e a chave especificados, e o associa a um hash.
|
||||
* Retorna um código de status indicando o resultado da operação.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t hook_param_set (
|
||||
uint32_t read_ptr,
|
||||
uint32_t read_len,
|
||||
uint32_t kread_ptr,
|
||||
uint32_t kread_len,
|
||||
uint32_t hread_ptr,
|
||||
uint32_t hread_len
|
||||
);
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function hook_param_set(
|
||||
val: ByteArray | HexString,
|
||||
key: ByteArray | HexString,
|
||||
hash: ByteArray | HexString
|
||||
): number
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
uint8_t pvalue[] = "some parameter value";
|
||||
uint8_t pname[] = "paramname";
|
||||
uint8_t phash[] = { 0x19U, 0xFEU, 0x69U, 0xF1U, 0x53U, 0x66U, 0x4EU, 0x8CU,
|
||||
0x97U, 0xF4U, 0x4CU, 0x5CU, 0x3CU, 0x65U, 0x63U, 0x79U,
|
||||
0xC2U, 0xD0U, 0x26U, 0xE7U, 0x90U, 0xEFU, 0x38U, 0xF7U,
|
||||
0xEDU, 0x73U, 0xE9U, 0xCEU, 0x9CU, 0x9DU, 0xBFU, 0x03U };
|
||||
int64_t result =
|
||||
hook_param_set(pvalue, sizeof(pvalue),
|
||||
pname, sizeof(pname),
|
||||
phash, sizeof(phash));
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const pvalue = "some parameter value"
|
||||
const pname = "paramname"
|
||||
const phash = [ 0x19, 0xFE, 0x69, 0xF1, 0x53, 0x66, 0x4E, 0x8C,
|
||||
0x97, 0xF4, 0x4C, 0x5C, 0x3C, 0x65, 0x63, 0x79,
|
||||
0xC2, 0xD0, 0x26, 0xE7, 0x90, 0xEF, 0x38, 0xF7,
|
||||
0xED, 0x73, 0xE9, 0xCE, 0x9C, 0x9D, 0xBF, 0x03 ]
|
||||
const result = hook_param_set(str2hex(pvalue), str2hex(pname), phash)
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---------- | --------- | ------------------------------- |
|
||||
| read_ptr | uint32_t | Ponteiro para o valor do parâmetro |
|
||||
| read_len | uint32_t | Tamanho do valor do parâmetro |
|
||||
| kread_ptr | uint32_t | Ponteiro para o nome do parâmetro |
|
||||
| kread_len | uint32_t | Tamanho do nome do parâmetro |
|
||||
| hread_ptr | uint32_t | Ponteiro para o hash do hook |
|
||||
| hread_len | uint32_t | Tamanho do hash do hook (sempre 32) |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---- | ---------------------- | ----------------------------------------- |
|
||||
| val | ByteArray ou HexString | O valor a ser definido para o parâmetro. |
|
||||
| key | ByteArray ou HexString | A chave associada ao parâmetro. |
|
||||
| hash | ByteArray ou HexString | O hash a ser associado ao parâmetro. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
|
||||
|
||||
<table><thead><tr><th width="148">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>int64_t</td><td>O tamanho do valor do parâmetro definido com sucesso<br /><br />Se negativo, um erro:<br /><code>OUT_OF_BOUNDS</code><br />- ponteiros/tamanhos especificados fora da memória do hook.<br /><br /><code>TOO_SMALL</code><br />- O nome do parâmetro não pode ser nulo<br /><br /><code>TOO_BIG</code><br />- O nome do parâmetro é maior que 32 bytes</td></tr></tbody></table>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
<table><thead><tr><th width="148">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>number</td><td>Retorna um código de status indicando o resultado da operação.</td></tr></tbody></table>
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
---
|
||||
title: hook_pos
|
||||
description: Retorna a posição na cadeia de hooks que o hook atualmente em execução ocupa
|
||||
---
|
||||
import { Tabs, TabItem } from '@astrojs/starlight/components';
|
||||
|
||||
### Comportamento
|
||||
|
||||
* Retorna a posição na cadeia de hooks que o hook atualmente em execução ocupa.
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t hook_pos(void);
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
hook_pos()
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t pos =
|
||||
hook_pos();
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const pos = hook_pos()
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Parâmetros
|
||||
|
||||
Esta API não possui parâmetros
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | ----------------------------------------------------------------------------------------- |
|
||||
| int64_t | A posição na cadeia que o hook atualmente em execução ocupa. A primeira posição é 0. |
|
||||
</TabItem>
|
||||
<TabItem label="JavaScript">
|
||||
| Tipo | Descrição |
|
||||
| ------ | ---------------------------------------------------------------------------------------- |
|
||||
| number | Retorna a posição atual na cadeia de hooks, ou um código de erro se a recuperação falhar. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
---
|
||||
title: hook_skip
|
||||
description: Ignora um hook que aparece mais adiante na cadeia de hooks da conta hook
|
||||
---
|
||||
import { Tabs, TabItem } from '@astrojs/starlight/components';
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Procura na cadeia de hooks por um hook identificado pelo hash do hook em `read_ptr`
|
||||
* Marca-o como desabilitado para esta execução da cadeia
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Ignora a execução de um hook com base no hash e na flag fornecidos.
|
||||
* Retorna um código de status indicando o resultado da operação.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t hook_skip (
|
||||
uint32_t read_ptr,
|
||||
uint32_t read_len,
|
||||
uint32_t flags
|
||||
);
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function hook_skip(
|
||||
hash: ByteArray | HexString,
|
||||
flag: number
|
||||
): ErrorCode | number
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
uint8_t phash[] = { 0x19U, 0xFEU, 0x69U, 0xF1U, 0x53U, 0x66U, 0x4EU, 0x8CU,
|
||||
0x97U, 0xF4U, 0x4CU, 0x5CU, 0x3CU, 0x65U, 0x63U, 0x79U,
|
||||
0xC2U, 0xD0U, 0x26U, 0xE7U, 0x90U, 0xEFU, 0x38U, 0xF7U,
|
||||
0xEDU, 0x73U, 0xE9U, 0xCEU, 0x9CU, 0x9DU, 0xBFU, 0x03U };
|
||||
int64_t result =
|
||||
hook_skip(phash, 32, 0);
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const phash = [ 0x19, 0xFE, 0x69, 0xF1, 0x53, 0x66, 0x4E, 0x8C,
|
||||
0x97, 0xF4, 0x4C, 0x5C, 0x3C, 0x65, 0x63, 0x79,
|
||||
0xC2, 0xD0, 0x26, 0xE7, 0x90, 0xEF, 0x38, 0xF7,
|
||||
0xED, 0x73, 0xE9, 0xCE, 0x9C, 0x9D, 0xBF, 0x03 ]
|
||||
const result = hook_skip(phash, 0);
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
|
||||
|
||||
| Nome | Tipo | Descrição |
|
||||
| --------- | --------- | ------------------------------------------------------------------------------------------------------------- |
|
||||
| read_ptr | uint32_t | Ponteiro para um buffer contendo o hash do hook |
|
||||
| read_len | uint32_t | Tamanho do hash do hook (sempre 32) |
|
||||
| flags | uint32_t | <p>Se 0:<br />- adiciona o hash à lista de hooks ignorados<br /><br />Se 1<br />- remove o hash da lista de hooks ignorados</p> |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---- | ---------------------- | --------------------------------------------------- |
|
||||
| hash | ByteArray ou HexString | O hash do hook a ser ignorado. |
|
||||
| flag | number | Uma flag indicando o motivo para ignorar o hook. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
<table><thead><tr><th width="163">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>int64_t</td><td>Se bem-sucedido <code>1</code><br /><br />Se negativo, um erro:<br /><code>OUT_OF_BOUNDS</code><br />- ponteiros/tamanhos especificados fora da memória do hook.<br /><br /><code>DOESNT_EXIST</code><br />- O parâmetro especificado não existe ou é nulo<br /><br /><code>INVALID_ARGUMENT</code><br />- O hash não tem 32 bytes</td></tr></tbody></table>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
<table><thead><tr><th width="163">Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td>number ou ErrorCode</td><td>Retorna um código de status indicando o resultado da operação.</td></tr></tbody></table>
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
---
|
||||
title: fee_base
|
||||
description: Busca a taxa base do ledger atual
|
||||
---
|
||||
import { Tabs, TabItem, LinkButton } from '@astrojs/starlight/components';
|
||||
|
||||
### Conceitos
|
||||
|
||||
<LinkButton href="/pt-br/docs/hooks/concepts/hook-fees">Taxas de Hook</LinkButton>
|
||||
|
||||
### Comportamento
|
||||
|
||||
* Retorna a taxa base do ledger atual
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t fee_base();
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function fee_base(): number
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t fee =
|
||||
fee_base();
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const fee = fee_base()
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
Esta API não recebe parâmetros.
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | ---------------------------------- |
|
||||
| int64_t | A taxa base do ledger atual |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| ------ | ---------------------------------- |
|
||||
| number | A taxa base do ledger atual |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
---
|
||||
title: ledger_keylet
|
||||
description: Busca por um keylet dentro de um intervalo especificado no ledger atual
|
||||
---
|
||||
import { Tabs, TabItem } from '@astrojs/starlight/components';
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Lê um Keylet de 34 bytes a partir de `lread_ptr`
|
||||
* Lê um Keylet de 32 bytes a partir de `hread_ptr`
|
||||
* Busca no ledger pelo primeiro (menor) Keylet deste tipo neste intervalo.
|
||||
* Se algum Keylet correspondente for encontrado, escreve-o em `write_ptr`.
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Esta função busca no ledger pelo primeiro (`menor`) Keylet deste tipo no intervalo fornecido.
|
||||
* Retorna o número de bytes escritos (34 bytes) em caso de sucesso, ou um código de erro se ocorrer um erro.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Definição
|
||||
|
||||
C
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t ledger_keylet (
|
||||
uint32_t write_ptr,
|
||||
uint32_t write_len,
|
||||
uint32_t lread_ptr,
|
||||
uint32_t lread_len,
|
||||
uint32_t hread_ptr,
|
||||
uint32_t hread_len
|
||||
);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function ledger_keylet(
|
||||
low: ByteArray | HexString,
|
||||
high: ByteArray | HexString
|
||||
): ErrorCode | ByteArray
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
C
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
//TODO
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
ledger_keylet(low, high)
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---------- | --------- | ---------------------------------------------------------------------------------------------------------- |
|
||||
| write_ptr | uint32_t | Ponteiro para um buffer para armazenar o Keylet serializado de saída. . |
|
||||
| write_len | uint32_t | Tamanho do buffer de saída. Deve ser 34 bytes |
|
||||
| lread_ptr | uint32_t | Ponteiro para o Keylet serializado de 34 bytes que representa o limite inferior do intervalo de Keylets a ser buscado. |
|
||||
| lread_len | uint32_t | Sempre 34 bytes |
|
||||
| hread_ptr | uint32_t | Ponteiro para o Keylet serializado de 34 bytes que representa o limite superior do intervalo de Keylets a ser buscado. |
|
||||
| hread_len | uint32_t | Sempre 34 bytes |
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---- | ---------------------- | ---------------------------------------------------------------------------------------------------------- |
|
||||
| low | ByteArray \| HexString | Ponteiro para o Keylet serializado de 34 bytes que representa o limite inferior do intervalo de Keylets a ser buscado. |
|
||||
| high | ByteArray \| HexString | Ponteiro para o Keylet serializado de 34 bytes que representa o limite superior do intervalo de Keylets a ser buscado. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| int64_t | <p>O número de bytes escritos (34 bytes) em caso de sucesso.<br /><br />Se negativo, um erro:<br /><code>OUT_OF_BOUNDS</code><br />- ponteiros/tamanhos especificados fora da memória do hook.<br /><br /><code>TOO_SMALL</code> / <code>TOO_BIG</code><br />- <code>write_len</code>, <code>lread_len</code> ou <code>hread_len</code> não era 34 bytes<br /><br /><code>INVALID_ARGUMENT</code><br />- Um ou mais dos Keylets fornecidos não era um Keylet serializado válido<br /><br /><code>DOES_NOT_MATCH</code><br />- Os dois Keylets fornecidos não eram do mesmo Tipo de Keylet.<br /><br /><code>DOESNT_EXIST</code><br />- Nenhum Keylet correspondente foi encontrado no intervalo especificado.</p> |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| ---------------------- | ----------------------------------------------------------------------------------------------- |
|
||||
| ErrorCode \| ByteArray | Retorna o número de bytes escritos (34 bytes) em caso de sucesso, ou um código de erro se ocorrer um erro. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
---
|
||||
title: ledger_last_hash
|
||||
description: Recupera o SHA512H de 32 bytes, com viés de namespace, do último ledger fechado
|
||||
---
|
||||
import { Tabs, TabItem } from '@astrojs/starlight/components';
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Escreve o Hash de 32 bytes no write_ptr
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Recupera o hash do último ledger.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t ledger_last_hash (
|
||||
uint32_t write_ptr,
|
||||
uint32_t write_len
|
||||
);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function ledger_last_hash(): ErrorCode | ByteArray
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
uint8_t hash[32];
|
||||
int64_t bytes_written =
|
||||
ledger_last_hash(hash, 32);
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const hash = ledger_last_hash()
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---------- | --------- | ---------------------------------------------------------------------------------------- |
|
||||
| write_ptr | uint32_t | Ponteiro para um buffer de tamanho adequado para armazenar a saída. Deve ter pelo menos 32 bytes. |
|
||||
| write_len | uint32_t | Tamanho do buffer de saída. |
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| int64_t | <p>O número de bytes escritos<br /><br />Se negativo, um erro:<br /><code>OUT_OF_BOUNDS</code><br />- ponteiros/tamanhos especificados fora da memória do hook.</p> |
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Tipo | Descrição |
|
||||
| ------ | ----------------------------------------------------------------------------------------------- |
|
||||
| number | Retorna um código de erro se ocorrer um erro, ou um array representando o hash do último ledger. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
---
|
||||
title: ledger_last_time
|
||||
description: Busca o timestamp do último ledger fechado
|
||||
---
|
||||
import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
|
||||
|
||||
### Comportamento
|
||||
|
||||
* Retorna o Timestamp Xahau do último ledger fechado.
|
||||
|
||||
<Aside type="tip">
|
||||
Os timestamps Xahau são idênticos a timestamps unix, exceto que possuem um deslocamento de `-946684800`.
|
||||
|
||||
O timestamp unix equivalente é: `ledger_last_time() + 946684800;`
|
||||
</Aside>
|
||||
|
||||
### Definição
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t ledger_last_time();
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function ledger_last_time(): ErrorCode | number
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t ts =
|
||||
ledger_last_time();
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const ts = ledger_last_time()
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
Esta API não recebe parâmetros.
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | -------------------------------------------- |
|
||||
| int64_t | O timestamp XRPL do último ledger fechado |
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| ------ | ---------------------------------------------------------------------------------------------------- |
|
||||
| number | Retorna um código de erro se ocorrer um erro, ou um número representando o timestamp do último ledger. |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
---
|
||||
title: ledger_nonce
|
||||
description: Gera um nonce de 32 bytes para uso em uma transação emitida
|
||||
---
|
||||
import { Tabs, TabItem } from '@astrojs/starlight/components';
|
||||
|
||||
### Comportamento
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
* Escreve um valor aleatório de 32 bytes no write_ptr
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
* Recupera o nonce do ledger atual.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Definição
|
||||
|
||||
C
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t ledger_nonce (
|
||||
uint32_t write_ptr,
|
||||
uint32_t write_len
|
||||
);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function ledger_nonce(): ErrorCode | ByteArray
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
uint8_t n[32];
|
||||
int64_t bytes_written =
|
||||
ledger_nonce(n, 32);
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const nonce = ledger_nonce()
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Nome | Tipo | Descrição |
|
||||
| ---------- | --------- | ---------------------------------------------------------------------------------------- |
|
||||
| write_ptr | uint32_t | Ponteiro para um buffer de tamanho adequado para armazenar a saída. Deve ter pelo menos 32 bytes. |
|
||||
| write_len | uint32_t | Tamanho do buffer de saída. |
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| ErrorCode \| ByteArray | Retorna um código de erro se ocorrer um erro, ou um array representando o nonce do ledger atual. especificados fora da memória do hook. |
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
|
||||
|
||||
| Tipo | Descrição |
|
||||
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| int64_t | <p>O número de bytes escritos<br /><br />Se negativo, um erro:<br /><code>OUT_OF_BOUNDS</code><br />- ponteiros/tamanhos especificados fora da memória do hook.</p> |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
---
|
||||
title: ledger_seq
|
||||
description: Busca o número de sequência do ledger atual
|
||||
---
|
||||
import { Tabs, TabItem } from '@astrojs/starlight/components';
|
||||
|
||||
### Comportamento
|
||||
|
||||
* Retorna o número de sequência do ledger atual
|
||||
|
||||
### Definição
|
||||
|
||||
C
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t ledger_seq();
|
||||
```
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
function ledger_seq(): ErrorCode | number
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Exemplo
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
```c
|
||||
int64_t seq =
|
||||
ledger_seq();
|
||||
```
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
```javascript
|
||||
const seq = ledger_seq()
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
### Parâmetros
|
||||
|
||||
Esta API não recebe parâmetros.
|
||||
|
||||
### Código de Retorno
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="C">
|
||||
| Tipo | Descrição |
|
||||
| -------- | ----------------------------------------- |
|
||||
| int64_t | O número de sequência do ledger atual |
|
||||
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="JavaScript">
|
||||
| Tipo | Descrição |
|
||||
| ------ | ----------------------------------------- |
|
||||
| number | O número de sequência do ledger atual |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user