本文档介绍了 OpenZeppelin Relayer 对 Stellar 网络的集成,包括对 Soroban 智能合约的支持 (调用、部署, WASM上传),标准的Stellar支付操作,通过XDR提交支持所有Stellar操作,fee bump交易支持,安全交易签名以及交易状态监控和序列号管理,并提供了详细的配置、API参考、例子和安全建议。
OpenZeppelin Relayer 提供对 Stellar 网络的全面支持,从而实现安全交易中继、Soroban 智能合约操作和高级交易管理。此集成支持标准 Stellar 操作和最新的 Soroban 智能合约功能。
Stellar 支持目前正在积极开发中。以下描述的 API 交互和具体细节可能会发生变化。 |
完整的 Soroban 智能合约支持(调用、部署、WASM 上传)
标准 Stellar 支付操作
通过 XDR 交易提交支持所有 Stellar 操作
手续费补贴(Fee bump)交易支持
使用多个签名者后端安全交易签名
交易状态监控和序列号管理
自定义 RPC 端点和网络策略
指标和可观察性
Stellar 网络通过 JSON 配置文件定义,从而可以灵活地:
配置标准 Stellar 集群:mainnet
、testnet
使用特定的 RPC 端点设置自定义的 Stellar 兼容网络
定义网络口令以进行正确的交易签名
Stellar 网络配置示例:
{
"networks": [\
{\
"type": "stellar",\
"network": "mainnet",\
"rpc_urls": ["https://mainnet.sorobanrpc.com"],\
"explorer_urls": ["https://stellar.expert/explorer/public"],\
"average_blocktime_ms": 5000,\
"is_testnet": false,\
"passphrase": "Public Global Stellar Network ; September 2015"\
},\
{\
"type": "stellar",\
"network": "testnet",\
"rpc_urls": ["https://soroban-testnet.stellar.org"],\
"explorer_urls": ["https://stellar.expert/explorer/testnet"],\
"average_blocktime_ms": 5000,\
"is_testnet": true,\
"passphrase": "Test SDF Network ; September 2015"\
}\
]
}
有关详细的网络配置选项,请参阅网络配置指南。
有关分步设置,请参阅快速入门指南。 主要先决条件:
Rust 2021,版本 1.86
或更高版本
Redis
Docker(可选)
Stellar 中继器配置示例:
{
"id": "stellar-example",
"name": "Stellar Example",
"network": "testnet",
"paused": false,
"notification_id": "notification-example",
"signer_id": "local-signer",
"network_type": "stellar"
}
有关更多配置示例,请访问 OpenZeppelin Relayer 示例存储库。
Stellar 中继器支持标准中继器配置选项。在 用户文档 - 中继器 中查看所有选项。
Stellar API 支持各种交易操作:
方法名 | 必需参数 | 描述 |
---|---|---|
发送交易 | network 、operations (或 transaction_xdr ) |
将交易提交到 Stellar 网络。直接支持支付和 Soroban 操作,或通过预构建的 XDR 交易支持任何 Stellar 操作。还支持用于管理交易费用的手续费补贴(fee bump)交易。 |
获取交易详情 | transaction_id |
通过 ID 检索特定交易。 |
列出交易 | (无) | 列出中继器的交易,并提供分页支持。 |
操作类型 | 描述 |
---|---|
payment |
在账户之间转移原生 XLM 或其他资产 |
invoke_contract |
调用已部署的 Soroban 智能合约函数 |
create_contract |
从 WASM 哈希部署新的 Soroban 智能合约 |
upload_wasm |
将 WASM 合约代码上传到 Stellar 分类账 |
必需字段:
- network
: Stellar 网络(“testnet”、“mainnet”等)
- operations
(操作数组)或 transaction_xdr
(base64 编码的 XDR)二选一 - 但不能同时存在
可选字段:
- source_account
: 将作为交易来源的 Stellar 账户(默认为中继器的地址)
- memo
: 交易备注(请参阅下面的备注类型)
- valid_until
: 交易过期时间(ISO 8601 格式)
- transaction_xdr
: 预构建的交易 XDR(base64 编码,已签名或未签名)- 与 operations
互斥
- fee_bump
: 请求手续费补贴包装器的布尔标志(仅对已签名的 transaction_xdr
有效)
- max_fee
: 手续费补贴交易的最高费用,以 stroops 为单位(默认为 1,000,000 = 0.1 XLM)
中继器支持三种提交交易的方式:
基于操作: 通过指定 operations
数组来构建交易(推荐用于大多数用例)
Transaction XDR(未签名): 使用 transaction_xdr
字段提交预构建的未签名交易(高级用例)
Transaction XDR(已签名)带有手续费补贴: 使用 transaction_xdr
提交已签名交易,并使用 fee_bump: true
将其包装在手续费补贴交易中
示例:发送交易
curl --location --request POST 'http://localhost:8080/api/v1/relayers/<stellar_relayer_id>/transactions' \
--header 'Authorization: Bearer <api_key>' \
--header 'Content-Type: application/json' \
--data-raw '{
"network": "testnet",
"operations": [\
{\
"type": "payment",\
"destination": "GD77B6LYQ5XDCW6CND7CQMA23FSV7MZQGLBAU5OMEOXQM6XFTCMWQQCJ",\
"asset": {"type": "native"},\
"amount": 1000000\
}\
],
"memo": {"type": "text", "value": "Payment for services"}
}'
有关完整详细信息和示例,请参阅 API 参考。
Stellar 操作中的资产必须使用类型字段指定:
原生 XLM:
{"type": "native"}
信用资产(4 个字符或更少):
{
"type": "credit_alphanum4",
"code": "USDC",
"issuer": "GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN"
}
信用资产(5-12 个字符):
{
"type": "credit_alphanum12",
"code": "LONGASSET",
"issuer": "GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN"
}
交易可以包含可选备注:
无备注: {"type": "none"}
文本备注: {"type": "text", "value": "Payment for services"}
(最多 28 个 UTF-8 字节)
ID 备注: {"type": "id", "value": "12345"}
哈希备注: {"type": "hash", "value": "deadbeef…"}
(32 字节十六进制)
返回备注: {"type": "return", "value": "deadbeef…"}
(32 字节十六进制)
Soroban 合约操作(invoke_contract、create_contract、upload_wasm)不支持备注。尝试在这些操作中包含备注将导致错误。 |
调用已部署的 Soroban 智能合约:
curl --location --request POST 'http://localhost:8080/api/v1/relayers/<stellar_relayer_id>/transactions' \
--header 'Authorization: Bearer <api_key>' \
--header 'Content-Type: application/json' \
--data-raw '{
"network": "testnet",
"operations": [\
{\
"type": "invoke_contract",\
"contract_address": "CA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUWDA",\
"function_name": "transfer",\
"args": [\
{"address": "GCRID3RFJXOBEB73FWRYJJ4II5E5UQ413F7LTM4W5KI54NBHQDRUXVLY"},\
{"address": "GD77B6LYQ5XDCW6CND7CQMA23FSV7MZQGLBAU5OMEOXQM6XFTCMWQQCJ"},\
{"i128": {"hi": "0", "lo": "1000000"}}\
],\
"auth": {"type": "source_account"}\
}\
]
}'
部署新的 Soroban 智能合约:
curl --location --request POST 'http://localhost:8080/api/v1/relayers/<stellar_relayer_id>/transactions' \
--header 'Authorization: Bearer <api_key>' \
--header 'Content-Type: application/json' \
--data-raw '{
"network": "testnet",
"operations": [\
{\
"type": "create_contract",\
"source": {\
"from": "address",\
"address": "GCRID3RFJXOBEB73FWRYJJ4II5E5UQ413F7LTM4W5KI54NBHQDRUXVLY"\
},\
"wasm_hash": "d3b2f6f8a1c5e9b4a7d8c2e1f5a9b3c6e8d4f7a2b5c8e1d4f7a0b3c6e9d2f5a8",\
"salt": "0000000000000000000000000000000000000000000000000000000000000001"\
}\
]
}'
将合约代码上传到 Stellar 分类账:
curl --location --request POST 'http://localhost:8080/api/v1/relayers/<stellar_relayer_id>/transactions' \
--header 'Authorization: Bearer <api_key>' \
--header 'Content-Type: application/json' \
--data-raw '{
"network": "testnet",
"operations": [\
{\
"type": "upload_wasm",\
"wasm": {\
"type": "base64",\
"base64": "AGFzbQEAAAABBgFgAX8BfwMCAQAFAwEAAQcPAgVoZWxsbwAACG1lbW9yeTIDCgQAAAAL"\
}\
}\
]
}'
调用合约函数时,必须以 JSON 格式提供作为 ScVal 值的参数:
类型 | 格式 | 描述 |
---|---|---|
U64 | {"u64": "1000000"} |
无符号 64 位整数 |
I64 | {"i64": "-500"} |
有符号 64 位整数 |
U32 | {"u32": 42} |
无符号 32 位整数 |
I32 | {"i32": -42} |
有符号 32 位整数 |
Boolean | {"bool": true} |
布尔值 |
String | {"string": "hello world"} |
UTF-8 字符串 |
Symbol | {"symbol": "transfer"} |
符号(用于函数名称) |
Address | {"address": "GCRID3RFJXOBEB73FWRYJJ4II5E5UQ413F7LTM4W5KI54NBHQDRUXVLY"} |
Stellar 帐户或合约地址 |
Bytes | {"bytes": "deadbeef"} |
十六进制编码的字节数组 |
Vector | {"vec": [{"u32": 1}, {"u32": 2}, {"u32": 3}]} |
ScVal 值数组 |
Map | {"map": [{"key": {"symbol": "name"}, "val": {"string": "MyToken"}}]} |
键值对 |
还支持使用多部分表示形式的其他类型,如 U128、I128、U256 和 I256。
Soroban 操作支持不同的授权模式:
类型 | 描述 |
---|---|
none |
无需授权 |
source_account |
使用交易源帐户(默认) |
addresses |
使用特定地址(未来功能) |
xdr |
高级:提供 base64 编码的 XDR 条目。这允许你提供预签名的 SorobanAuthorizationEntry 对象,以用于复杂的授权场景。有关 SorobanAuthorizationEntries 的详细信息,请参阅 有关授权的官方 Stellar 文档。 |
不要将中继器直接暴露于公共互联网
部署在安全后端(反向代理、防火墙)之后
在生产系统中使用托管签名者
确保为交易签名配置了正确的网络口令
检查环境变量和配置文件是否存在错误
验证网络口令是否与目标网络匹配
查看容器日志以查找 Stellar 特定的错误
确保为合约操作正确配置了 Soroban RPC 端点
如需帮助,请加入我们的 Telegram 或在 GitHub 上提出问题。
本项目在 GNU Affero General Public License v3.0 许可下获得许可。
- 原文链接: docs.openzeppelin.com/re...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!