{"content":{"title":"Sui 构造一笔赞助交易","body":"## 1. 声明调用的合约\r\n\r\n```bash\r\nlet txb = new TransactionBlock();\r\ntxb.moveCall({\r\n    ....\r\n})\r\n...\r\n```\r\n\r\n在 ptb 中使用`moveCall`确定自己的业务逻辑，\r\n\r\n## 2. 赞助方签名\r\n\r\n```js\r\n// keypair = new Ed25519Keypair();\r\n// const address = keypair.getPublicKey().toSuiAddress();\r\npayment = {\r\n  objectId: coin.coinObjectId,\r\n  version: coin.version,\r\n  digest: coin.digest,\r\n};\r\n\r\ntxb.setSender(sender); // 真实交易者\r\ntxb.setGasOwner(address); // 赞助者\r\ntxb.setGasPayment(payment);\r\n\r\n// 赞助方使用自己的私钥对交易进行签名\r\nreturn keypair.signTransactionBlock(await tx.build({ client }));\r\n```\r\n\r\n赞助人的私钥对交易进行签名，最终得到以下结构：\r\n\r\n```json title=\"sponsoredTx\"\r\n{\r\n  \"signature\": \"ABGWh2i8iJOLLxNUckS6AKKh5NT+Qzt3SaC3+/SV84r9RkecJlEEZ9AbyER7g4zq1U+5bKeXoGX5+quhb3LzRAmy9pq2I6M+S9N76FCsPwJQD7wgt9NLYKdvcMsoCm5gTg==\",\r\n  \"bytes\": \"AAACAAgBAAAAAAAAAAAg3BxkU0BsJQ4RRN5uwoslfmk2Ne57E18nxW7iR9sSvX0CAgABAQAAAQEDAAAAAAEBANwcZFNAbCUOEUTebsKLJX5pNjXuexNfJ8Vu4kfbEr19AZU7TYd8JXClrxtw7G4v5Azq7uV9D5mZrVTeeB/L/azj51gOAAAAAAAgAtz2AT9CIW7EGjomM2pZqriIJ1BeQrzYwVChoRo5wARAOlIlr4WCa3SLlNc1Y+1kjzkGKGaDkxSuJvNsqRuL3egDAAAAAAAAQKs8AAAAAAAA\"\r\n}\r\n```\r\n\r\n## 3. 真实交易者签名\r\n\r\n交易者使用钱包对`sponsoredTx.bytes`部分(交易内容)进行签名，得到第二份`signature`。\r\n\r\n```json title=\"signedTx\"\r\n{\r\n  \"transactionBlockBytes\": \"AAACAAgBAAAAAAAAAAAg3BxkU0BsJQ4RRN5uwoslfmk2Ne57E18nxW7iR9sSvX0CAgABAQAAAQEDAAAAAAEBANwcZFNAbCUOEUTebsKLJX5pNjXuexNfJ8Vu4kfbEr19AZU7TYd8JXClrxtw7G4v5Azq7uV9D5mZrVTeeB/L/azj51gOAAAAAAAgAtz2AT9CIW7EGjomM2pZqriIJ1BeQrzYwVChoRo5wARAOlIlr4WCa3SLlNc1Y+1kjzkGKGaDkxSuJvNsqRuL3egDAAAAAAAAQKs8AAAAAAAA\",\r\n  \"signature\": \"AAdh6RyAm6KTyknuJvtC0F96rTu/hZ+APLOi0td9uwP1Rn43+fxcxWUkjLy788A+lHklcjYbv9cwGc7fzLnuwQqRknXirZobikj4ctjYPiQSPr/ndNIJHGSaxeTIJAWD0Q==\"\r\n}\r\n```\r\n\r\n> 此时`signedTx`和`sponsoredTx`的`bytes`内容一致，即交易内容一致。\r\n\r\n此时浏览器钱包签名时唤起，可以看到其中的赞助交易信息。\r\n\r\n![wallet_signtx](https://img.learnblockchain.cn/attachments/2024/04/zrTuF0CQ662a68068fb7a.png)\r\n\r\n## 4. 提交给网络执行\r\n\r\n```js\r\nclient.executeTransactionBlock({\r\n  transactionBlock: signedTx.transactionBlockBytes,\r\n  signatures: [signedTx.signature, sponsoredTx.signature],\r\n  options: { showEffects: true, showEvents: true, showObjectChanges: true },\r\n});\r\n```\r\n---"},"author":{"user":"https://learnblockchain.cn/people/18893","address":"0x80d6BE8d42B2B19297cF2c93832d6B79B5aaFdC9"},"history":null,"timestamp":1714055410,"version":1}