# Sui rpc协议代码示例 **Published by:** [junjie9021](https://paragraph.com/@junjie9021-3/) **Published on:** 2023-02-28 **URL:** https://paragraph.com/@junjie9021-3/sui-rpc ## Content Sui已经完成wave1和wave2阶段,预计后面还有2阶段。现给大家提供 Rpc 协议 Python3 调用代码样例。import uuid import json import base64 import urllib3 import requests from typing import List urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) headers = { 'content-type': 'application/json', 'accept-encoding': 'gzip, deflate, br', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36', } SUI_COIN_TYPE = "0x2::coin::Coin<0x2::sui::SUI>" class Rpc: def __init__(self, api='https://fullnode.testnet.sui.io/', proxies=None): self.api = api self.proxies = proxies def get_objects(self, address): """获取地址拥有的objs """ data = {"method": "sui_getObjectsOwnedByAddress","jsonrpc": "2.0","params": [address],"id": str(uuid.uuid1())} res = requests.post(self.api, data=json.dumps(data), headers=headers, proxies=self.proxies) return res.json() def get_object(self, obj_id): """返回指定对象的对象信息; """ data = {"method": "sui_getObject","jsonrpc": "2.0","params": [obj_id],"id": str(uuid.uuid1())} res = requests.post(self.api, data=json.dumps(data), headers=headers, proxies=self.proxies) return res.json() def get_transaction(self, tx): """获取交易详情 """ data = {"method": "sui_getTransaction","jsonrpc": "2.0","params": [tx],"id": str(uuid.uuid1())} res = requests.post(self.api, data=json.dumps(data), headers=headers, proxies=self.proxies) return res.json() def transfer_sui(self, from_, object_id, to, amount, gas=1000,): """创建一个未签名的交易以将 SUI 硬币对象发送到 Sui 地址。 SUI 对象也用作气体对象。 """ data = {"method": "sui_transferSui","jsonrpc": "2.0","params": [from_, object_id, gas, to, int(amount)],"id": str(uuid.uuid1())} res = requests.post(self.api, data=json.dumps(data), headers=headers, proxies=self.proxies) return res.json() def pay_sui(self, from_, objs, to, amount, gas=300): """创建一个未签名的交易以将 SUI 硬币对象发送到 Sui 地址。 SUI 对象也用作气体对象。 """ data = {"method": "sui_paySui","jsonrpc": "2.0","params": [from_, objs, [to], amount, gas],"id": str(uuid.uuid1())} res = requests.post(self.api, data=json.dumps(data), headers=headers, proxies=self.proxies) return res.json() def pay_all_sui(self, from_, objs, to, gas=1000): """创建一个未签名的交易以将 SUI 硬币对象发送到 Sui 地址。 SUI 对象也用作气体对象。 """ data = {"method": "sui_payAllSui","jsonrpc": "2.0","params": [from_, objs, to, gas],"id": str(uuid.uuid1())} res = requests.post(self.api, data=json.dumps(data), headers=headers, proxies=self.proxies) return res.json() def transfer(self, from_, to, amount): objs = self.get_objects(from_) amount = int(amount) sui_objs = [i['objectId'] for i in objs['result'] if i['type'] == SUI_COIN_TYPE] balance = 0 pay_objs = [] for i in sui_objs: obj = self.get_object(i) if int(obj['result']['details']['data']['fields']['balance']) > amount: res = self.pay_sui(from_, [i], to, [amount]) return res balance += int(obj['result']['details']['data']['fields']['balance']) pay_objs.append(i) if balance >= amount: res = self.pay_sui(from_, pay_objs, to, [amount]) return res def merge_coin(self, address, primary_obj_id, merge_obj_id, gas=1000, gas_object_id=None): """合并硬币; """ gas_object_id = primary_obj_id data = {"method": "sui_mergeCoins","jsonrpc": "2.0","params": [address, primary_obj_id, merge_obj_id, gas_object_id, gas],"id": str(uuid.uuid1())} res = requests.post(self.api, data=json.dumps(data), headers=headers, proxies=self.proxies) return res.json() def execute_transaction(self, tx_bytes, signature_bytes, pub_key, request_type="WaitForLocalExecution"): """广播交易 """ flag = { "ed25519": 0x00, "secp256k1": 0x01, } sign_b64 = base64.b64encode(signature_bytes).decode() serialized_sig = [flag["ed25519"]] + \ list(base64.b64decode(sign_b64)) + \ list(base64.b64decode(pub_key)) signature = base64.b64encode(bytes(serialized_sig)).decode() data = {"method": "sui_executeTransactionSerializedSig","jsonrpc": "2.0","params": [tx_bytes, signature, request_type],"id": str(uuid.uuid1())} res = requests.post(self.api, data=json.dumps(data), headers=headers, proxies=self.proxies) return res.json() def transfer_object(self, from_, object_id, to, gas=1000, gas_object_id=None): """创建一个未签名的交易以将 SUI 硬币对象发送到 Sui 地址。 SUI 对象也用作气体对象。 """ data = {"method": "sui_transferObject","jsonrpc": "2.0","params": [from_, object_id, gas_object_id, gas, to],"id": str(uuid.uuid1())} res = requests.post(self.api, data=json.dumps(data), headers=headers) return res.json() def move_call(self, address, package_object_id, module, function, arguments, gas_budget=10000, type_arguments=[], gas=None): """合约交互""" data = {"method": "sui_moveCall","jsonrpc": "2.0","params": [address, package_object_id, module, function, type_arguments, arguments, gas, gas_budget],"id": str(uuid.uuid1())} res = requests.post(self.api, data=json.dumps(data), headers=headers, proxies=self.proxies) return res.json() def sendtx(self, tx, account): """广播交易""" # 1.对tx进行base64编码 tx_b64 = base64.b64decode(tx) # 2. 签名 [0, 0, 0] + tx; 参考 https://github.com/MystenLabs/sui/pull/6445 data = bytes([0, 0, 0] + list(map(int, tx_b64))) signature_bytes = account.sign_data(data) pub_key = account.get_public_key_as_b64_string() res = self.execute_transaction(tx, signature_bytes, pub_key) return res wave3出来后,会再给大家提供个最基本的如何Mint nft的代码样例。 代码已上传:simple-airdrop-demo/sui at main · junjie9021/simple-airdrop-demoContribute to junjie9021/simple-airdrop-demo development by creating an account on GitHub.https://github.com ## Publication Information - [junjie9021](https://paragraph.com/@junjie9021-3/): Publication homepage - [All Posts](https://paragraph.com/@junjie9021-3/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@junjie9021-3): Subscribe to updates