Xahau 特定方法
setHook
(实验性)
通过扩展为账户设置 Hooks。
请求
必填 - 该函数接受一个类型为 SetHookRequest
的输入参数。
hooks
: 要设置到账户的 Hooks 列表。
interface SetHookRequest extends BaseTransactionRequest {
// Hooks 数组,与账户上安装的 Hook Chain 对应。数组中的位置 0 对应 Hook Chain 中的位置 0,依此类推。
hooks: Hook[];
}
interface Hook {
Hook: {
CreateCode: string;
Flags: number;
HookApiVersion: number;
// 这个 256 位无符号整数的每一位表示 Hook 是否应在特定交易类型上执行。
//
// 更多信息:https://xrpl-hooks.readme.io/docs/hookon-field
HookOn: string;
// 为了避免安装在同一个账户上的两个或多个 Hook 无意中相互覆盖 Hook 状态,在创建或安装每个 Hook 时必须提供一个 32 字节的命名空间。
//
// 命名空间可以是开发者选择的任意 32 字节值。只要命名空间在 Hook Chain 中是唯一的,就不会发生状态覆盖。
//
// 更多信息:https://xrpl-hooks.readme.io/docs/namespaces
HookNamespace: string;
// Hook 开发者可以选择在 Hook 中使用安装时参数(称为 Hook 参数)。这允许后续的 Hook 安装者在无需重新编译或重新上传 Hook 的情况下更改某些行为(假设至少有一个账户仍然引用现有的 Hook 定义)。
//
// Hook 参数是在 SetHook 交易期间设置的一组键值对,Hook 在运行时可以检索这些参数。参数名称(键)和参数值都设置为十六进制数据,最大长度分别为 32 字节和 256 字节。
//
// 一个 SetHook 交易可以为每个安装的 Hook 定义最多 16 个 Hook 参数。
//
// 更多信息:https://xrpl-hooks.readme.io/docs/parameters
HookParameters?: HookParameter[];
// 授权允许外部 XRPL 账户或 Hook 修改特定 Hook 的命名空间内的 Hook 状态。
//
// 如果你想在保留多个先前设置的 HookGrant 条目的同时更新某个特定的 HookGrant,你必须首先获取旧的 HookGrants 数组,对其进行修改,然后在更新操作中重新提交整个数组。要删除所有授权,请提交一个空的 HookGrants 数组。
//
// 更多信息:https://xrpl-hooks.readme.io/docs/grants
HookGrants?: HookGrant[];
};
}
interface HookParameter {
HookParameter: {
HookParameterName: string;
HookParameterValue: string;
};
}
// 警告!!!
//
// 大多数 Hook 开发者很少需要使用 HookGrants,并且在授予外部 Hook 和账户状态修改权限时应格外小心。
//
// 虽然 HookGrant 不能直接用于窃取资金,但外部对 Hook 状态的有意修改可能会导致 Hook 行为异常,在某些情况下可能会导致资金被盗。
//
// 如果你认为需要使用 Grant,请首先重新检查你的设计,确保你确实需要使用它。
//
// 更多信息:https://xrpl-hooks.readme.io/docs/grants
interface HookGrant {
HookGrant: {
HookHash: string;
Authorize?: string;
};
}
注意:
- 如果交易字段
Account
未设置,将使用用户钱包的账户。
响应
响应是一个 Promise,解析为一个包含 type
和 result
属性的对象。
type
:"response" | "reject"
result
:hash
: 交易的哈希。
type: "response";
result: {
hash: string;
}
或
type: "reject";
result: undefined;
错误处理
如果发生错误,将抛出错误。
示例
import { setHook } from "@xhbmygod/rootwallet-api";
const payload = {
hooks: [
{
Hook: {
CreateCode:
'0061736M01000000011C0460057F7F7F7F7F017E60037F7F7E017E60027F7F017F60017F017E02230303656E76057472616365000003656E7606616363657074000103656E76025F670002030201030503010002062B077F0141B088040B7F004180080B7F0041A6080B7F004180080B7F0041B088040B7F0041000B7F0041010B07080104686F6F6B00030AC4800001C0800001017F230041106B220124002001200036020C41920841134180084112410010001A410022002000420010011A41012200200010021A200141106A240042000B0B2C01004180080B254163636570742E633A2043616C6C65642E00224163636570742E633A2043616C6C65642E22',
Flags: 1,
HookApiVersion: 0,
HookOn: 'F'.repeat(58) + 'BFFFFE',
HookNamespace: '3963ADEB1B0E8934C0963680531202FD511FF1E16D5864402C2DA63861C420A8',
HookParameters: [
{
HookParameter: {
HookParameterName: 'ABCDEF12',
HookParameterValue: '12345678'
}
}
],
HookGrants: [
{
HookGrant: {
HookHash: '78CAF69EEE950A6C55A450AC2A980DE434D624CD1B13148E007E28B7B6461CC8'
}
}
]
}
}
]
};
setHook(payload)
.then((response) => {
console.log("Transaction Hash: ", response.result?.hash);
})
.catch((error) => {
console.error("Transaction submission failed", error);
});
以下是一个 React 网页应用的示例:
import { setHook, isInstalled } from "@xhbmygod/rootwallet-api";
function App() {
const handleSetHook = () => {
isInstalled().then((response) => {
if (response.result.isInstalled) {
const payload = {
hooks: [
{
Hook: {
CreateCode:
'0061736M01000000011C0460057F7F7F7F7F017E60037F7F7E017E60027F7F017F60017F017E02230303656E76057472616365000003656E7606616363657074000103656E76025F670002030201030503010002062B077F0141B088040B7F004180080B7F0041A6080B7F004180080B7F0041B088040B7F0041000B7F0041010B07080104686F6F6B00030AC4800001C0800001017F230041106B220124002001200036020C41920841134180084112410010001A410022002000420010011A41012200200010021A200141106A240042000B0B2C01004180080B254163636570742E633A2043616C6C65642E00224163636570742E633A2043616C6C65642E22',
Flags: 1,
HookApiVersion: 0,
HookOn: 'F'.repeat(58) + 'BFFFFE',
HookNamespace: '3963ADEB1B0E8934C0963680531202FD511FF1E16D5864402C2DA63861C420A8',
HookParameters: [
{
HookParameter: {
HookParameterName: 'ABCDEF12',
HookParameterValue: '12345678'
}
}
],
HookGrants: [
{
HookGrant: {
HookHash: '78CAF69EEE950A6C55A450AC2A980DE434D624CD1B13148E007E28B7B6461CC8'
}
}
]
}
}
]
};
setHook(payload)
.then((response) => {
console.log("Transaction hash: ", response.result?.hash);
})
.catch((error) => {
console.error("Transaction submission failed", error);
});
}
});
};
return (
<div className="App">
<button onClick={handleSetHook}>Set Hooks</button>
</div>
);
}
export default App;
其他
BaseTransactionRequest
所有扩展 BaseTransactionRequest
接口的 Request
接口还包括以下字段:
fee
: 以滴(drops)为单位的 CNY 数量,作为将此交易分发到网络的成本。- 某些交易类型有不同的最低要求。
- 更多关于滴的技术细节请参考 这里 。
sequence
: 发送交易的账户的序列号。- 只有当序列号比同一账户的上一个交易大 1 时,交易才有效。
- 特殊情况 0 表示交易使用 Ticket 代替。
accountTxnID
: 标识另一个交易的哈希值。- 如果提供,只有当发送账户之前发送的交易与提供的哈希匹配时,此交易才有效。
lastLedgerSequence
: 此交易可以出现的最高账本索引。- 指定此字段会严格限制交易等待验证或拒绝的时间。
memos
: 用于标识此交易的附加任意信息。- 每个 memo 的每个属性必须为十六进制编码。
- 更多关于 memo 的技术细节请参考 这里 。
networkID
: 此交易所针对的链的网络 ID。- 对于 XRPL 主网和某些测试网络,必须省略。
- 对于网络 ID 为 1025 或更高的链,必须提供。
signers
: 表示授权此交易的多重签名的对象数组。- 更多关于 signers 的技术细节请参考 这里 。
sourceTag
: 用于标识此支付原因的任意整数,或代表此交易发送者的标识。- 按照惯例,退款应指定初始支付的 SourceTag 作为退款支付的 DestinationTag。
signingPubKey
: 用于签名此交易的私钥对应的公钥的十六进制表示。- 如果为空字符串,表示 Signers 字段中存在多重签名。
ticketSequence
: 用于代替序列号的 Ticket 的序列号。- 如果提供此字段,Sequence 必须为 0。
- 不能与 AccountTxnID 一起使用。
txnSignature
: 验证此交易来自其声称的账户的签名。
interface BaseTransactionRequest {
// 以滴(drops)为单位的 CNY 数量,作为将此交易分发到网络的成本。
// 某些交易类型有不同的最低要求。
fee?: string;
// 发送交易的账户的序列号。只有当序列号比同一账户的上一个交易大 1 时,交易才有效。
// 特殊情况 0 表示交易使用 Ticket 代替。
sequence?: number;
// 标识另一个交易的哈希值。如果提供,只有当发送账户之前发送的交易与提供的哈希匹配时,此交易才有效。
accountTxnID?: string;
// 此交易可以出现的最高账本索引。指定此字段会严格限制交易等待验证或拒绝的时间。
lastLedgerSequence?: number;
// 用于标识此交易的附加任意信息。
// 每个 memo 的每个属性必须为十六进制编码。
memos?: Memo[];
// 此交易所针对的链的网络 ID。对于 XRPL 主网和某些测试网络,必须省略。
// 对于网络 ID 为 1025 或更高的链,必须提供。
networkID?: number;
// 表示授权此交易的多重签名的对象数组。
signers?: Signer[];
// 用于标识此支付原因的任意整数,或代表此交易发送者的标识。
// 按照惯例,退款应指定初始支付的 SourceTag 作为退款支付的 DestinationTag。
sourceTag?: number;
// 用于签名此交易的私钥对应的公钥的十六进制表示。
// 如果为空字符串,表示 Signers 字段中存在多重签名。
signingPubKey?: string;
// 用于代替序列号的 Ticket 的序列号。如果提供此字段,Sequence 必须为 0。
// 不能与 AccountTxnID 一起使用。
ticketSequence?: number;
// 验证此交易来自其声称的账户的签名。
txnSignature?: string;
}
interface Memo {
memo: {
memoType?: string;
memoData?: string;
memoFormat?: string;
};
}
更多关于 memo 的技术细节请参考 这里 。
interface Signer {
signer: {
account: string;
txnSignature: string;
signingPubKey: string;
};
}
更多关于 signers 的技术细节请参考 这里 。
最后更新于: