@ocap/client 1.25.3 → 1.25.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -80
- package/dist/report.html +1 -1
- package/docs/_sidebar.md +22 -0
- package/docs/api-reference-client-methods.ja.md +229 -0
- package/docs/api-reference-client-methods.md +229 -0
- package/docs/api-reference-client-methods.zh-TW.md +229 -0
- package/docs/api-reference-client-methods.zh.md +229 -0
- package/docs/api-reference-data-types.ja.md +482 -0
- package/docs/api-reference-data-types.md +482 -0
- package/docs/api-reference-data-types.zh-TW.md +482 -0
- package/docs/api-reference-data-types.zh.md +482 -0
- package/docs/api-reference-low-level-api.ja.md +228 -0
- package/docs/api-reference-low-level-api.md +228 -0
- package/docs/api-reference-low-level-api.zh-TW.md +228 -0
- package/docs/api-reference-low-level-api.zh.md +228 -0
- package/docs/api-reference-query-mutation-methods.ja.md +814 -0
- package/docs/api-reference-query-mutation-methods.md +814 -0
- package/docs/api-reference-query-mutation-methods.zh-TW.md +814 -0
- package/docs/api-reference-query-mutation-methods.zh.md +814 -0
- package/docs/api-reference-transaction-helpers.ja.md +649 -0
- package/docs/api-reference-transaction-helpers.md +649 -0
- package/docs/api-reference-transaction-helpers.zh-TW.md +649 -0
- package/docs/api-reference-transaction-helpers.zh.md +649 -0
- package/docs/api-reference.ja.md +23 -0
- package/docs/api-reference.md +23 -0
- package/docs/api-reference.zh-TW.md +23 -0
- package/docs/api-reference.zh.md +23 -0
- package/docs/core-concepts-client-architecture.ja.md +102 -0
- package/docs/core-concepts-client-architecture.md +102 -0
- package/docs/core-concepts-client-architecture.zh-TW.md +102 -0
- package/docs/core-concepts-client-architecture.zh.md +102 -0
- package/docs/core-concepts-event-subscriptions.ja.md +123 -0
- package/docs/core-concepts-event-subscriptions.md +123 -0
- package/docs/core-concepts-event-subscriptions.zh-TW.md +123 -0
- package/docs/core-concepts-event-subscriptions.zh.md +123 -0
- package/docs/core-concepts-gas-payment.ja.md +111 -0
- package/docs/core-concepts-gas-payment.md +111 -0
- package/docs/core-concepts-gas-payment.zh-TW.md +111 -0
- package/docs/core-concepts-gas-payment.zh.md +111 -0
- package/docs/core-concepts-transaction-lifecycle.ja.md +183 -0
- package/docs/core-concepts-transaction-lifecycle.md +183 -0
- package/docs/core-concepts-transaction-lifecycle.zh-TW.md +183 -0
- package/docs/core-concepts-transaction-lifecycle.zh.md +183 -0
- package/docs/core-concepts.ja.md +22 -0
- package/docs/core-concepts.md +22 -0
- package/docs/core-concepts.zh-TW.md +22 -0
- package/docs/core-concepts.zh.md +22 -0
- package/docs/getting-started-basic-usage.ja.md +87 -0
- package/docs/getting-started-basic-usage.md +87 -0
- package/docs/getting-started-basic-usage.zh-TW.md +87 -0
- package/docs/getting-started-basic-usage.zh.md +87 -0
- package/docs/getting-started-installation.ja.md +60 -0
- package/docs/getting-started-installation.md +60 -0
- package/docs/getting-started-installation.zh-TW.md +60 -0
- package/docs/getting-started-installation.zh.md +60 -0
- package/docs/getting-started.ja.md +16 -0
- package/docs/getting-started.md +16 -0
- package/docs/getting-started.zh-TW.md +16 -0
- package/docs/getting-started.zh.md +17 -0
- package/docs/how-to-guides-delegate-permissions.ja.md +167 -0
- package/docs/how-to-guides-delegate-permissions.md +167 -0
- package/docs/how-to-guides-delegate-permissions.zh-TW.md +167 -0
- package/docs/how-to-guides-delegate-permissions.zh.md +166 -0
- package/docs/how-to-guides-manage-accounts.ja.md +73 -0
- package/docs/how-to-guides-manage-accounts.md +73 -0
- package/docs/how-to-guides-manage-accounts.zh-TW.md +73 -0
- package/docs/how-to-guides-manage-accounts.zh.md +73 -0
- package/docs/how-to-guides-manage-assets.ja.md +255 -0
- package/docs/how-to-guides-manage-assets.md +255 -0
- package/docs/how-to-guides-manage-assets.zh-TW.md +255 -0
- package/docs/how-to-guides-manage-assets.zh.md +255 -0
- package/docs/how-to-guides-manage-tokens.ja.md +179 -0
- package/docs/how-to-guides-manage-tokens.md +179 -0
- package/docs/how-to-guides-manage-tokens.zh-TW.md +179 -0
- package/docs/how-to-guides-manage-tokens.zh.md +179 -0
- package/docs/how-to-guides-stake-tokens-and-assets.ja.md +205 -0
- package/docs/how-to-guides-stake-tokens-and-assets.md +205 -0
- package/docs/how-to-guides-stake-tokens-and-assets.zh-TW.md +205 -0
- package/docs/how-to-guides-stake-tokens-and-assets.zh.md +205 -0
- package/docs/how-to-guides-transfer-tokens-and-nfts.ja.md +179 -0
- package/docs/how-to-guides-transfer-tokens-and-nfts.md +179 -0
- package/docs/how-to-guides-transfer-tokens-and-nfts.zh-TW.md +179 -0
- package/docs/how-to-guides-transfer-tokens-and-nfts.zh.md +179 -0
- package/docs/how-to-guides.ja.md +27 -0
- package/docs/how-to-guides.md +27 -0
- package/docs/how-to-guides.zh-TW.md +27 -0
- package/docs/how-to-guides.zh.md +27 -0
- package/docs/overview.ja.md +70 -0
- package/docs/overview.md +70 -0
- package/docs/overview.zh-TW.md +70 -0
- package/docs/overview.zh.md +70 -0
- package/package.json +14 -14
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# 低階 API
|
|
2
|
+
|
|
3
|
+
The Low-level API 提供了對整個交易生命週期的精細控制。與將細節抽象化的 [高階 API](./api-reference-transaction-helpers.md) 不同,這些方法允許您手動建構、編碼、簽署和發送交易。這對於進階場景非常理想,例如多重簽名工作流程,其中不同方需要在廣播交易之前簽署交易。
|
|
4
|
+
|
|
5
|
+
此 API 分為四個主要的方法群組,每個群組對應交易生命週期中的一個階段:
|
|
6
|
+
|
|
7
|
+
1. **編碼**:準備一筆交易並將其序列化為二進位緩衝區。
|
|
8
|
+
2. **簽署**:為已編碼的交易新增數位簽章。
|
|
9
|
+
3. **多重簽署**:為一筆交易新增多個數位簽章。
|
|
10
|
+
4. **發送**:將已簽署的交易廣播到區塊鏈。
|
|
11
|
+
|
|
12
|
+
## 編碼交易
|
|
13
|
+
|
|
14
|
+
編碼是建立交易的第一步。`encode[Type]Tx` 方法會接收核心交易資料(`itx`)並將其包裝在標準交易結構中,新增必要的細節,如 `chainId` 和 `nonce`。結果是一個可讀的交易物件和一個準備好簽署的二進位緩衝區。
|
|
15
|
+
|
|
16
|
+
鏈支援的每種交易類型都有一個 `encode` 方法。您可以透過呼叫 `client.getTxEncodeMethods()` 來取得完整列表。
|
|
17
|
+
|
|
18
|
+
### `encode[Type]Tx(payload)`
|
|
19
|
+
|
|
20
|
+
編碼一筆交易而不進行簽署。
|
|
21
|
+
|
|
22
|
+
**參數**
|
|
23
|
+
|
|
24
|
+
<x-field-group>
|
|
25
|
+
<x-field data-name="tx" data-type="object" data-required="true">
|
|
26
|
+
<x-field-desc markdown>交易資料物件。</x-field-desc>
|
|
27
|
+
<x-field data-name="itx" data-type="object" data-required="true" data-desc="特定於交易類型的內部交易物件。"></x-field>
|
|
28
|
+
<x-field data-name="from" data-type="string" data-required="false" data-desc="發送者地址。如果未提供,則從錢包中衍生。"></x-field>
|
|
29
|
+
<x-field data-name="nonce" data-type="number" data-required="false" data-desc="交易 nonce。如果未設定,預設為 `Date.now()`。"></x-field>
|
|
30
|
+
<x-field data-name="chainId" data-type="string" data-required="false" data-desc="鏈 ID。如果未提供,則從連接的節點中獲取。"></x-field>
|
|
31
|
+
</x-field>
|
|
32
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="用於衍生發送者地址和公鑰的錢包物件。"></x-field>
|
|
33
|
+
<x-field data-name="delegator" data-type="string" data-required="false" data-desc="委託權限的帳戶地址(如適用)。"></x-field>
|
|
34
|
+
</x-field-group>
|
|
35
|
+
|
|
36
|
+
**回傳值**
|
|
37
|
+
|
|
38
|
+
<x-field data-name="Promise<object>" data-type="Promise<object>" data-desc="一個解析為包含已編碼交易物件的 promise。">
|
|
39
|
+
<x-field data-name="object" data-type="object" data-desc="可讀的交易物件。"></x-field>
|
|
40
|
+
<x-field data-name="buffer" data-type="Buffer" data-desc="已序列化的交易二進位緩衝區,準備好進行簽署。"></x-field>
|
|
41
|
+
</x-field>
|
|
42
|
+
|
|
43
|
+
**範例**
|
|
44
|
+
|
|
45
|
+
```javascript TransferV2Tx icon=logos:javascript
|
|
46
|
+
const { encodeTransferV2Tx } = client;
|
|
47
|
+
const senderWallet = fromRandom();
|
|
48
|
+
const receiverAddress = 'z1...';
|
|
49
|
+
|
|
50
|
+
const { object, buffer } = await encodeTransferV2Tx({
|
|
51
|
+
tx: {
|
|
52
|
+
itx: {
|
|
53
|
+
to: receiverAddress,
|
|
54
|
+
value: await client.fromTokenToUnit(10), // 轉移 10 個原生代幣
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
wallet: senderWallet,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
console.log('已編碼的交易物件:', object);
|
|
61
|
+
console.log('待簽署的緩衝區:', buffer.toString('hex'));
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 簽署交易
|
|
65
|
+
|
|
66
|
+
The `sign[Type]Tx` 方法建立在編碼步驟之上,透過新增數位簽章。這些方法會編碼交易,然後使用提供的錢包來簽署產生的二進位緩衝區。
|
|
67
|
+
|
|
68
|
+
您可以透過呼叫 `client.getTxSignMethods()` 來取得所有可用的簽署方法列表。
|
|
69
|
+
|
|
70
|
+
### `sign[Type]Tx(payload)`
|
|
71
|
+
|
|
72
|
+
編碼並簽署一筆交易。
|
|
73
|
+
|
|
74
|
+
**參數**
|
|
75
|
+
|
|
76
|
+
<x-field-group>
|
|
77
|
+
<x-field data-name="tx" data-type="object" data-required="true" data-desc="交易資料物件,與編碼時相同。"></x-field>
|
|
78
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="用於簽署交易的錢包。"></x-field>
|
|
79
|
+
<x-field data-name="delegator" data-type="string" data-required="false" data-desc="委託人地址(如適用)。"></x-field>
|
|
80
|
+
<x-field data-name="encoding" data-type="string" data-required="false" data-desc="輸出的可選編碼('base16'、'hex'、'base58'、'base64')。如果省略,則回傳交易物件。"></x-field>
|
|
81
|
+
</x-field-group>
|
|
82
|
+
|
|
83
|
+
**回傳值**
|
|
84
|
+
|
|
85
|
+
<x-field data-name="Promise<object|string>" data-type="Promise<object|string>" data-desc="一個解析為已簽署交易物件的 promise,如果指定了 `encoding`,則為編碼後的字串。"></x-field>
|
|
86
|
+
|
|
87
|
+
**範例**
|
|
88
|
+
|
|
89
|
+
```javascript TransferV2Tx icon=logos:javascript
|
|
90
|
+
const { signTransferV2Tx } = client;
|
|
91
|
+
const senderWallet = fromRandom();
|
|
92
|
+
const receiverAddress = 'z1...';
|
|
93
|
+
|
|
94
|
+
const signedTx = await signTransferV2Tx({
|
|
95
|
+
tx: {
|
|
96
|
+
itx: {
|
|
97
|
+
to: receiverAddress,
|
|
98
|
+
value: await client.fromTokenToUnit(10),
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
wallet: senderWallet,
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
console.log('已簽署的交易:', signedTx);
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## 發送交易
|
|
108
|
+
|
|
109
|
+
The `send[Type]Tx` 方法負責將交易廣播到區塊鏈。如果提供了未簽署的交易和錢包,這些方法可以隱式地執行簽署步驟,或者它們可以發送已經簽署的交易。
|
|
110
|
+
|
|
111
|
+
可透過 `client.getTxSendMethods()` 取得完整的發送方法列表。
|
|
112
|
+
|
|
113
|
+
### `send[Type]Tx(payload)`
|
|
114
|
+
|
|
115
|
+
簽署(如果需要)並將交易發送到鏈上。
|
|
116
|
+
|
|
117
|
+
**參數**
|
|
118
|
+
|
|
119
|
+
<x-field-group>
|
|
120
|
+
<x-field data-name="tx" data-type="object" data-required="true" data-desc="交易物件。可以是已簽署或未簽署的。"></x-field>
|
|
121
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="用於簽署交易的錢包。即使交易已預先簽署,仍需要此錢包來識別發送者。"></x-field>
|
|
122
|
+
<x-field data-name="signature" data-type="string" data-required="false" data-desc="交易的預先計算簽章。如果提供此項,錢包將不會再次用於簽署。"></x-field>
|
|
123
|
+
<x-field data-name="delegator" data-type="string" data-required="false" data-desc="委託人地址(如適用)。"></x-field>
|
|
124
|
+
<x-field data-name="commit" data-type="boolean" data-default="false" data-required="false" data-desc="是否在解析前回傳,等待交易被提交到區塊中。"></x-field>
|
|
125
|
+
</x-field-group>
|
|
126
|
+
|
|
127
|
+
**回傳值**
|
|
128
|
+
|
|
129
|
+
<x-field data-name="Promise<string>" data-type="Promise<string>" data-desc="一個解析為交易雜湊值的 promise。"></x-field>
|
|
130
|
+
|
|
131
|
+
**範例:自動簽署**
|
|
132
|
+
|
|
133
|
+
```javascript TransferV2Tx icon=logos:javascript
|
|
134
|
+
const { sendTransferV2Tx } = client;
|
|
135
|
+
const senderWallet = fromRandom();
|
|
136
|
+
const receiverAddress = 'z1...';
|
|
137
|
+
|
|
138
|
+
// 客戶端將在發送前使用 senderWallet 簽署此交易。
|
|
139
|
+
const txHash = await sendTransferV2Tx({
|
|
140
|
+
tx: {
|
|
141
|
+
itx: {
|
|
142
|
+
to: receiverAddress,
|
|
143
|
+
value: await client.fromTokenToUnit(10),
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
wallet: senderWallet,
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
console.log('已發送交易,雜湊值為:', txHash);
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**範例:發送預先簽署的交易**
|
|
153
|
+
|
|
154
|
+
```javascript TransferV2Tx icon=logos:javascript
|
|
155
|
+
// 假設 signedTx 來自 sign[Type]Tx 範例
|
|
156
|
+
const { sendTransferV2Tx } = client;
|
|
157
|
+
|
|
158
|
+
const txHash = await sendTransferV2Tx({
|
|
159
|
+
tx: signedTx, // 傳入整個已簽署的交易物件
|
|
160
|
+
wallet: senderWallet,
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
console.log('已發送預先簽署的交易,雜湊值為:', txHash);
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## 多重簽章交易
|
|
167
|
+
|
|
168
|
+
對於需要多個簽章的工作流程(例如原子交換),會使用 `multiSign[Type]Tx` 方法。該過程涉及一方首先簽署交易(使用標準的 `sign[Type]Tx` 方法),然後後續各方使用相應的 `multiSign[Type]Tx` 方法新增其簽章。
|
|
169
|
+
|
|
170
|
+
您可以透過 `client.getTxMultiSignMethods()` 取得支援多重簽章的交易列表。
|
|
171
|
+
|
|
172
|
+
### `multiSign[Type]Tx(payload)`
|
|
173
|
+
|
|
174
|
+
為一個已有一或多個簽章的交易新增一個簽章。
|
|
175
|
+
|
|
176
|
+
**參數**
|
|
177
|
+
|
|
178
|
+
<x-field-group>
|
|
179
|
+
<x-field data-name="tx" data-type="object" data-required="true" data-desc="交易物件,應已包含至少一個簽章。"></x-field>
|
|
180
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="目前簽署者的錢包。"></x-field>
|
|
181
|
+
<x-field data-name="delegator" data-type="string" data-required="false" data-desc="目前簽署者的委託人地址(如適用)。"></x-field>
|
|
182
|
+
<x-field data-name="data" data-type="any" data-required="false" data-desc="可選資料,與簽章一起包含。"></x-field>
|
|
183
|
+
<x-field data-name="encoding" data-type="string" data-required="false" data-desc="輸出的可選編碼('base16'、'hex'、'base58'、'base64')。"></x-field>
|
|
184
|
+
</x-field-group>
|
|
185
|
+
|
|
186
|
+
**回傳值**
|
|
187
|
+
|
|
188
|
+
<x-field data-name="Promise<object|string>" data-type="Promise<object|string>" data-desc="一個解析為新增了新簽章的交易物件的 promise。"></x-field>
|
|
189
|
+
|
|
190
|
+
**範例:原子交換 (`ExchangeV2Tx`)**
|
|
191
|
+
|
|
192
|
+
```javascript ExchangeV2Tx icon=logos:javascript
|
|
193
|
+
// 兩方的錢包
|
|
194
|
+
const aliceWallet = fromRandom();
|
|
195
|
+
const bobWallet = fromRandom();
|
|
196
|
+
|
|
197
|
+
// 1. Alice 準備並簽署初始交換交易
|
|
198
|
+
const exchangeTx = {
|
|
199
|
+
itx: {
|
|
200
|
+
to: bobWallet.address,
|
|
201
|
+
sender: {
|
|
202
|
+
value: await client.fromTokenToUnit(10), // Alice 提供 10 個代幣
|
|
203
|
+
},
|
|
204
|
+
receiver: {
|
|
205
|
+
value: await client.fromTokenToUnit(5), // Alice 要求 5 個代幣
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
const signedByAlice = await client.signExchangeV2Tx({
|
|
211
|
+
tx: exchangeTx,
|
|
212
|
+
wallet: aliceWallet,
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
// 2. Alice 將 `signedByAlice` 發送給 Bob。Bob 新增他的簽章。
|
|
216
|
+
const signedByBoth = await client.multiSignExchangeV2Tx({
|
|
217
|
+
tx: signedByAlice,
|
|
218
|
+
wallet: bobWallet,
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
// 3. Bob 將 `signedByBoth` 發回給 Alice。Alice 發送最終交易。
|
|
222
|
+
const txHash = await client.sendExchangeV2Tx({
|
|
223
|
+
tx: signedByBoth,
|
|
224
|
+
wallet: aliceWallet, // 使用發送者錢包提交
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
console.log('原子交換交易已發送:', txHash);
|
|
228
|
+
```
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# 低级 API
|
|
2
|
+
|
|
3
|
+
低级 API 提供了对整个交易生命周期的精细控制。与抽象掉细节的 [高级 API](./api-reference-transaction-helpers.md) 不同,这些方法允许你手动构建、编码、签名和发送交易。这对于高级场景非常理想,例如多重签名工作流,其中不同方需要在交易广播前对其进行签名。
|
|
4
|
+
|
|
5
|
+
该 API 分为四个主要的方法组,每个方法组对应交易生命周期的一个阶段:
|
|
6
|
+
|
|
7
|
+
1. **编码**:准备一笔交易并将其序列化为二进制缓冲区。
|
|
8
|
+
2. **签名**:向已编码的交易添加数字签名。
|
|
9
|
+
3. **多签**:向一笔交易添加多个数字签名。
|
|
10
|
+
4. **发送**:将已签名的交易广播到区块链。
|
|
11
|
+
|
|
12
|
+
## 编码交易
|
|
13
|
+
|
|
14
|
+
编码是创建交易的第一步。`encode[Type]Tx` 方法接收核心交易数据 (`itx`),并将其包装在标准交易结构中,添加 `chainId` 和 `nonce` 等必要信息。结果是一个人类可读的交易对象和一个可供签名的二进制缓冲区。
|
|
15
|
+
|
|
16
|
+
链支持的每种交易类型都有一个 `encode` 方法。你可以通过调用 `client.getTxEncodeMethods()` 获取完整列表。
|
|
17
|
+
|
|
18
|
+
### `encode[Type]Tx(payload)`
|
|
19
|
+
|
|
20
|
+
编码一笔交易,但不进行签名。
|
|
21
|
+
|
|
22
|
+
**Parameters**
|
|
23
|
+
|
|
24
|
+
<x-field-group>
|
|
25
|
+
<x-field data-name="tx" data-type="object" data-required="true">
|
|
26
|
+
<x-field-desc markdown>交易数据对象。</x-field-desc>
|
|
27
|
+
<x-field data-name="itx" data-type="object" data-required="true" data-desc="特定于交易类型的内部交易对象。"></x-field>
|
|
28
|
+
<x-field data-name="from" data-type="string" data-required="false" data-desc="发送方地址。如果未提供,则从钱包中派生。"></x-field>
|
|
29
|
+
<x-field data-name="nonce" data-type="number" data-required="false" data-desc="交易 nonce。如果未设置,默认为 `Date.now()`。"></x-field>
|
|
30
|
+
<x-field data-name="chainId" data-type="string" data-required="false" data-desc="链 ID。如果未提供,则从连接的节点获取。"></x-field>
|
|
31
|
+
</x-field>
|
|
32
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="用于派生发送方地址和公钥的钱包对象。"></x-field>
|
|
33
|
+
<x-field data-name="delegator" data-type="string" data-required="false" data-desc="委托权限的账户地址(如果适用)。"></x-field>
|
|
34
|
+
</x-field-group>
|
|
35
|
+
|
|
36
|
+
**Returns**
|
|
37
|
+
|
|
38
|
+
<x-field data-name="Promise<object>" data-type="Promise<object>" data-desc="一个 promise,解析为一个包含已编码交易的对象。">
|
|
39
|
+
<x-field data-name="object" data-type="object" data-desc="人类可读的交易对象。"></x-field>
|
|
40
|
+
<x-field data-name="buffer" data-type="Buffer" data-desc="序列化后的交易二进制缓冲区,可供签名。"></x-field>
|
|
41
|
+
</x-field>
|
|
42
|
+
|
|
43
|
+
**示例**
|
|
44
|
+
|
|
45
|
+
```javascript TransferV2Tx icon=logos:javascript
|
|
46
|
+
const { encodeTransferV2Tx } = client;
|
|
47
|
+
const senderWallet = fromRandom();
|
|
48
|
+
const receiverAddress = 'z1...';
|
|
49
|
+
|
|
50
|
+
const { object, buffer } = await encodeTransferV2Tx({
|
|
51
|
+
tx: {
|
|
52
|
+
itx: {
|
|
53
|
+
to: receiverAddress,
|
|
54
|
+
value: await client.fromTokenToUnit(10), // 转移 10 个原生代币
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
wallet: senderWallet,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
console.log('已编码的交易对象:', object);
|
|
61
|
+
console.log('待签名的缓冲区:', buffer.toString('hex'));
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 签名交易
|
|
65
|
+
|
|
66
|
+
`sign[Type]Tx` 方法在编码步骤的基础上添加了数字签名。这些方法会对交易进行编码,然后使用提供的钱包对生成的二进制缓冲区进行签名。
|
|
67
|
+
|
|
68
|
+
你可以通过调用 `client.getTxSignMethods()` 获取所有可用的签名方法列表。
|
|
69
|
+
|
|
70
|
+
### `sign[Type]Tx(payload)`
|
|
71
|
+
|
|
72
|
+
编码并签名一笔交易。
|
|
73
|
+
|
|
74
|
+
**Parameters**
|
|
75
|
+
|
|
76
|
+
<x-field-group>
|
|
77
|
+
<x-field data-name="tx" data-type="object" data-required="true" data-desc="交易数据对象,与编码时相同。"></x-field>
|
|
78
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="用于签名交易的钱包。"></x-field>
|
|
79
|
+
<x-field data-name="delegator" data-type="string" data-required="false" data-desc="委托人地址(如果适用)。"></x-field>
|
|
80
|
+
<x-field data-name="encoding" data-type="string" data-required="false" data-desc="输出的可选编码('base16'、'hex'、'base58'、'base64')。如果省略,则返回交易对象。"></x-field>
|
|
81
|
+
</x-field-group>
|
|
82
|
+
|
|
83
|
+
**Returns**
|
|
84
|
+
|
|
85
|
+
<x-field data-name="Promise<object|string>" data-type="Promise<object|string>" data-desc="一个 promise,解析为已签名的交易对象,如果指定了 `encoding`,则解析为编码后的字符串。"></x-field>
|
|
86
|
+
|
|
87
|
+
**示例**
|
|
88
|
+
|
|
89
|
+
```javascript TransferV2Tx icon=logos:javascript
|
|
90
|
+
const { signTransferV2Tx } = client;
|
|
91
|
+
const senderWallet = fromRandom();
|
|
92
|
+
const receiverAddress = 'z1...';
|
|
93
|
+
|
|
94
|
+
const signedTx = await signTransferV2Tx({
|
|
95
|
+
tx: {
|
|
96
|
+
itx: {
|
|
97
|
+
to: receiverAddress,
|
|
98
|
+
value: await client.fromTokenToUnit(10),
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
wallet: senderWallet,
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
console.log('已签名的交易:', signedTx);
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## 发送交易
|
|
108
|
+
|
|
109
|
+
`send[Type]Tx` 方法负责将交易广播到区块链。如果提供了未签名的交易和钱包,这些方法可以隐式执行签名步骤,或者它们也可以发送已经签名的交易。
|
|
110
|
+
|
|
111
|
+
可以通过 `client.getTxSendMethods()` 获取完整的发送方法列表。
|
|
112
|
+
|
|
113
|
+
### `send[Type]Tx(payload)`
|
|
114
|
+
|
|
115
|
+
签名(如果需要)并将交易发送到链上。
|
|
116
|
+
|
|
117
|
+
**Parameters**
|
|
118
|
+
|
|
119
|
+
<x-field-group>
|
|
120
|
+
<x-field data-name="tx" data-type="object" data-required="true" data-desc="交易对象。可以是已签名或未签名的。"></x-field>
|
|
121
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="用于签名交易的钱包。即使交易已预签名,仍需此钱包来识别发送方。"></x-field>
|
|
122
|
+
<x-field data-name="signature" data-type="string" data-required="false" data-desc="交易的预计算签名。如果提供,将不会再使用钱包进行签名。"></x-field>
|
|
123
|
+
<x-field data-name="delegator" data-type="string" data-required="false" data-desc="委托人地址(如果适用)。"></x-field>
|
|
124
|
+
<x-field data-name="commit" data-type="boolean" data-default="false" data-required="false" data-desc="是否在解析前等待交易被提交到区块。"></x-field>
|
|
125
|
+
</x-field-group>
|
|
126
|
+
|
|
127
|
+
**Returns**
|
|
128
|
+
|
|
129
|
+
<x-field data-name="Promise<string>" data-type="Promise<string>" data-desc="一个 promise,解析为交易哈希。"></x-field>
|
|
130
|
+
|
|
131
|
+
**示例:自动签名**
|
|
132
|
+
|
|
133
|
+
```javascript TransferV2Tx icon=logos:javascript
|
|
134
|
+
const { sendTransferV2Tx } = client;
|
|
135
|
+
const senderWallet = fromRandom();
|
|
136
|
+
const receiverAddress = 'z1...';
|
|
137
|
+
|
|
138
|
+
// 客户端将在发送前使用 senderWallet 签名此交易。
|
|
139
|
+
const txHash = await sendTransferV2Tx({
|
|
140
|
+
tx: {
|
|
141
|
+
itx: {
|
|
142
|
+
to: receiverAddress,
|
|
143
|
+
value: await client.fromTokenToUnit(10),
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
wallet: senderWallet,
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
console.log('交易已发送,哈希值为:', txHash);
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**示例:发送预签名交易**
|
|
153
|
+
|
|
154
|
+
```javascript TransferV2Tx icon=logos:javascript
|
|
155
|
+
// 假设 signedTx 来自 sign[Type]Tx 示例
|
|
156
|
+
const { sendTransferV2Tx } = client;
|
|
157
|
+
|
|
158
|
+
const txHash = await sendTransferV2Tx({
|
|
159
|
+
tx: signedTx, // 传入整个已签名的交易对象
|
|
160
|
+
wallet: senderWallet,
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
console.log('预签名交易已发送,哈希值为:', txHash);
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## 多重签名交易
|
|
167
|
+
|
|
168
|
+
对于需要多个签名(如原子交换)的工作流,使用 `multiSign[Type]Tx` 方法。该过程涉及一方首先签名交易(使用标准的 `sign[Type]Tx` 方法),然后后续各方使用相应的 `multiSign[Type]Tx` 方法添加他们的签名。
|
|
169
|
+
|
|
170
|
+
你可以通过 `client.getTxMultiSignMethods()` 获取支持多重签名的交易列表。
|
|
171
|
+
|
|
172
|
+
### `multiSign[Type]Tx(payload)`
|
|
173
|
+
|
|
174
|
+
向已有一个或多个签名的交易添加一个签名。
|
|
175
|
+
|
|
176
|
+
**Parameters**
|
|
177
|
+
|
|
178
|
+
<x-field-group>
|
|
179
|
+
<x-field data-name="tx" data-type="object" data-required="true" data-desc="交易对象,应已包含至少一个签名。"></x-field>
|
|
180
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="当前签名者的钱包。"></x-field>
|
|
181
|
+
<x-field data-name="delegator" data-type="string" data-required="false" data-desc="当前签名者的委托人地址(如果适用)。"></x-field>
|
|
182
|
+
<x-field data-name="data" data-type="any" data-required="false" data-desc="签名中包含的可选数据。"></x-field>
|
|
183
|
+
<x-field data-name="encoding" data-type="string" data-required="false" data-desc="输出的可选编码('base16'、'hex'、'base58'、'base64')。"></x-field>
|
|
184
|
+
</x-field-group>
|
|
185
|
+
|
|
186
|
+
**Returns**
|
|
187
|
+
|
|
188
|
+
<x-field data-name="Promise<object|string>" data-type="Promise<object|string>" data-desc="一个 promise,解析为添加了新签名的交易对象。"></x-field>
|
|
189
|
+
|
|
190
|
+
**示例:原子交换 (`ExchangeV2Tx`)**
|
|
191
|
+
|
|
192
|
+
```javascript ExchangeV2Tx icon=logos:javascript
|
|
193
|
+
// 双方的钱包
|
|
194
|
+
const aliceWallet = fromRandom();
|
|
195
|
+
const bobWallet = fromRandom();
|
|
196
|
+
|
|
197
|
+
// 1. Alice 准备并签署初始交换交易
|
|
198
|
+
const exchangeTx = {
|
|
199
|
+
itx: {
|
|
200
|
+
to: bobWallet.address,
|
|
201
|
+
sender: {
|
|
202
|
+
value: await client.fromTokenToUnit(10), // Alice 提供 10 个代币
|
|
203
|
+
},
|
|
204
|
+
receiver: {
|
|
205
|
+
value: await client.fromTokenToUnit(5), // Alice 要求 5 个代币
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
const signedByAlice = await client.signExchangeV2Tx({
|
|
211
|
+
tx: exchangeTx,
|
|
212
|
+
wallet: aliceWallet,
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
// 2. Alice 将 `signedByAlice` 发送给 Bob。Bob 添加他的签名。
|
|
216
|
+
const signedByBoth = await client.multiSignExchangeV2Tx({
|
|
217
|
+
tx: signedByAlice,
|
|
218
|
+
wallet: bobWallet,
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
// 3. Bob 将 `signedByBoth` 发回给 Alice。Alice 发送最终交易。
|
|
222
|
+
const txHash = await client.sendExchangeV2Tx({
|
|
223
|
+
tx: signedByBoth,
|
|
224
|
+
wallet: aliceWallet, // 使用发送方钱包提交
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
console.log('原子交换交易已发送:', txHash);
|
|
228
|
+
```
|