From 636a39c5a9b8ba99ab92d6842ee2a0f062fde3d3 Mon Sep 17 00:00:00 2001 From: Seulgi Kim Date: Mon, 13 Aug 2018 17:41:16 +0900 Subject: [PATCH 1/3] Make Parcel and Transaction in RPC use PlatformAddress --- key/src/platform_address.rs | 6 ++++++ rpc/src/v1/types/action.rs | 25 +++++++++++++------------ rpc/src/v1/types/block.rs | 7 ++++--- rpc/src/v1/types/parcel.rs | 4 ++-- rpc/src/v1/types/transaction.rs | 26 +++++++++++++------------- spec/JSON-RPC.md | 15 +++++++-------- 6 files changed, 45 insertions(+), 38 deletions(-) diff --git a/key/src/platform_address.rs b/key/src/platform_address.rs index 3e926e7442..e715f96c99 100644 --- a/key/src/platform_address.rs +++ b/key/src/platform_address.rs @@ -157,6 +157,12 @@ impl<'a> Deserialize<'a> for PlatformAddress { } } +impl From for Address { + fn from(address: PlatformAddress) -> Self { + address.address + } +} + struct PlatformAddressVisitor; impl<'a> Visitor<'a> for PlatformAddressVisitor { diff --git a/rpc/src/v1/types/action.rs b/rpc/src/v1/types/action.rs index 7e8b110390..29c9066a4f 100644 --- a/rpc/src/v1/types/action.rs +++ b/rpc/src/v1/types/action.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -use ckey::{Address, Public, Signature}; +use ckey::{NetworkId, PlatformAddress, Public, Signature}; use ctypes::parcel::{Action as ActionType, ChangeShard as ChangeShardType}; use ctypes::ShardId; use primitives::{Bytes, H256, U256}; @@ -39,7 +39,7 @@ pub enum Action { signatures: Vec, }, Payment { - receiver: Address, + receiver: PlatformAddress, /// Transferred amount. amount: U256, }, @@ -49,11 +49,11 @@ pub enum Action { CreateShard, ChangeShardOwners { shard_id: ShardId, - owners: Vec
, + owners: Vec, }, ChangeShardUsers { shard_id: ShardId, - users: Vec
, + users: Vec, }, Custom(Bytes), } @@ -68,8 +68,9 @@ impl From for ChangeShard { } } -impl From for Action { - fn from(from: ActionType) -> Self { +impl Action { + pub fn from_core(from: ActionType, network_id: NetworkId) -> Self { + const VERSION: u8 = 0; match from { ActionType::ChangeShardState { transactions, @@ -84,7 +85,7 @@ impl From for Action { receiver, amount, } => Action::Payment { - receiver, + receiver: PlatformAddress::create(VERSION, network_id, receiver), amount, }, ActionType::SetRegularKey { @@ -98,14 +99,14 @@ impl From for Action { owners, } => Action::ChangeShardOwners { shard_id, - owners, + owners: owners.into_iter().map(|owner| PlatformAddress::create(VERSION, network_id, owner)).collect(), }, ActionType::ChangeShardUsers { shard_id, users, } => Action::ChangeShardUsers { shard_id, - users, + users: users.into_iter().map(|user| PlatformAddress::create(VERSION, network_id, user)).collect(), }, ActionType::Custom(bytes) => Action::Custom(bytes), } @@ -138,7 +139,7 @@ impl From for ActionType { receiver, amount, } => ActionType::Payment { - receiver, + receiver: receiver.into(), amount, }, Action::SetRegularKey { @@ -152,14 +153,14 @@ impl From for ActionType { owners, } => ActionType::ChangeShardOwners { shard_id, - owners, + owners: owners.into_iter().map(Into::into).collect(), }, Action::ChangeShardUsers { shard_id, users, } => ActionType::ChangeShardUsers { shard_id, - users, + users: users.into_iter().map(Into::into).collect(), }, Action::Custom(bytes) => ActionType::Custom(bytes), } diff --git a/rpc/src/v1/types/block.rs b/rpc/src/v1/types/block.rs index 26a0a7953e..20dae59140 100644 --- a/rpc/src/v1/types/block.rs +++ b/rpc/src/v1/types/block.rs @@ -19,7 +19,7 @@ use ckey::Address; use ctypes::BlockNumber; use primitives::{H256, U256}; -use super::Parcel; +use super::{Action, Parcel}; #[derive(Debug, Serialize)] #[serde(rename_all = "camelCase")] @@ -68,14 +68,15 @@ impl From for Block { .enumerate() .map(|(i, unverified)| { let sig = unverified.signature(); + let network_id = unverified.as_unsigned().network_id; Parcel { block_number: Some(block_number), block_hash: Some(block_hash), parcel_index: Some(i), nonce: unverified.as_unsigned().nonce.clone(), fee: unverified.as_unsigned().fee.clone(), - network_id: unverified.as_unsigned().network_id, - action: unverified.as_unsigned().action.clone().into(), + network_id, + action: Action::from_core(unverified.as_unsigned().action.clone(), network_id), hash: unverified.hash(), sig: sig.into(), } diff --git a/rpc/src/v1/types/parcel.rs b/rpc/src/v1/types/parcel.rs index 3aed451dc4..7346a0ece8 100644 --- a/rpc/src/v1/types/parcel.rs +++ b/rpc/src/v1/types/parcel.rs @@ -44,7 +44,7 @@ impl From for Parcel { nonce: p.nonce, fee: p.fee, network_id: p.network_id, - action: p.action.clone().into(), + action: Action::from_core(p.as_unsigned().action.clone(), p.network_id), hash: p.hash(), sig: sig.into(), } @@ -61,7 +61,7 @@ impl From for Parcel { nonce: p.nonce, fee: p.fee, network_id: p.network_id, - action: p.action.clone().into(), + action: Action::from_core(p.as_unsigned().action.clone(), p.network_id), hash: p.hash(), sig: sig.into(), } diff --git a/rpc/src/v1/types/transaction.rs b/rpc/src/v1/types/transaction.rs index 3c72e2339b..6f57e57880 100644 --- a/rpc/src/v1/types/transaction.rs +++ b/rpc/src/v1/types/transaction.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -use ckey::{Address, NetworkId}; +use ckey::{NetworkId, PlatformAddress}; use ctypes::transaction::{AssetMintOutput, AssetTransferInput, AssetTransferOutput, Transaction as TransactionType}; use ctypes::{ShardId, WorldId}; @@ -26,7 +26,7 @@ pub enum Transaction { network_id: NetworkId, shard_id: ShardId, nonce: u64, - owners: Vec
, + owners: Vec, }, #[serde(rename_all = "camelCase")] SetWorldOwners { @@ -34,7 +34,7 @@ pub enum Transaction { shard_id: ShardId, world_id: WorldId, nonce: u64, - owners: Vec
, + owners: Vec, }, #[serde(rename_all = "camelCase")] SetWorldUsers { @@ -42,7 +42,7 @@ pub enum Transaction { shard_id: ShardId, world_id: WorldId, nonce: u64, - users: Vec
, + users: Vec, }, #[serde(rename_all = "camelCase")] AssetMint { @@ -50,7 +50,7 @@ pub enum Transaction { shard_id: ShardId, world_id: WorldId, metadata: String, - registrar: Option
, + registrar: Option, nonce: u64, output: AssetMintOutput, @@ -77,7 +77,7 @@ impl From for Transaction { network_id, shard_id, nonce, - owners, + owners: owners.into_iter().map(|owner| PlatformAddress::create(0, network_id, owner)).collect(), }, TransactionType::SetWorldOwners { network_id, @@ -90,7 +90,7 @@ impl From for Transaction { shard_id, world_id, nonce, - owners, + owners: owners.into_iter().map(|owner| PlatformAddress::create(0, network_id, owner)).collect(), }, TransactionType::SetWorldUsers { network_id, @@ -103,7 +103,7 @@ impl From for Transaction { shard_id, world_id, nonce, - users, + users: users.into_iter().map(|user| PlatformAddress::create(0, network_id, user)).collect(), }, TransactionType::AssetMint { network_id, @@ -118,7 +118,7 @@ impl From for Transaction { shard_id, world_id, metadata, - registrar, + registrar: registrar.map(|registrar| PlatformAddress::create(0, network_id, registrar)), nonce, output, }, @@ -152,7 +152,7 @@ impl From for TransactionType { network_id, shard_id, nonce, - owners, + owners: owners.into_iter().map(From::from).collect(), }, Transaction::SetWorldOwners { network_id, @@ -165,7 +165,7 @@ impl From for TransactionType { shard_id, world_id, nonce, - owners, + owners: owners.into_iter().map(From::from).collect(), }, Transaction::SetWorldUsers { network_id, @@ -178,7 +178,7 @@ impl From for TransactionType { shard_id, world_id, nonce, - users, + users: users.into_iter().map(From::from).collect(), }, Transaction::AssetMint { network_id, @@ -193,7 +193,7 @@ impl From for TransactionType { shard_id, world_id, metadata, - registrar, + registrar: registrar.map(|registrar| registrar.into()), nonce, output, }, diff --git a/spec/JSON-RPC.md b/spec/JSON-RPC.md index e6ca55ecab..8d55437acb 100644 --- a/spec/JSON-RPC.md +++ b/spec/JSON-RPC.md @@ -61,7 +61,7 @@ A base32 string that starts with "ccc" or "tcc". See [the specification](https:/ ### Payment Action - action: "payment" - - receiver: `H160` + - receiver: `PlatformAddress` - amount: `U256` ### SetRegularKey Action @@ -73,13 +73,13 @@ A base32 string that starts with "ccc" or "tcc". See [the specification](https:/ - action: "changeShardOwners" - shard_id: `number` - - owners: `H160`[] + - owners: `PlatformAddress[]` ### ChangeShardUsers Action - action: "changeShardUsers" - shard_id: `number` - - users: `H160`[] + - users: `PlatformAddress[]` ## Transaction @@ -90,7 +90,7 @@ A base32 string that starts with "ccc" or "tcc". See [the specification](https:/ - amount: `number` - metadata: `string` - - registrar: `H160` | `null` + - registrar: `PlatformAddress` | `null` ## Asset @@ -345,7 +345,7 @@ Response Example "action":{ "action":"payment", "amount":"0xa", - "receiver":0xa6594b7196808d161b6fb137e781abbc251385d9 + "receiver": "cccqzn9jjm3j6qg69smd7cn0eup4w7z2yu9myd6c4d7" }, "blockHash":"0xfc196ede542b03b55aee9f106004e7e3d7ea6a9600692e964b4735a260356b50", "blockNumber":5, @@ -423,7 +423,7 @@ Response Example "action": { "action":"payment", "amount":"0xa", - "receiver":0xa6594b7196808d161b6fb137e781abbc251385d9 + "receiver": "cccqzn9jjm3j6qg69smd7cn0eup4w7z2yu9myd6c4d7" }, "blockHash": "0xfc196ede542b03b55aee9f106004e7e3d7ea6a9600692e964b4735a260356b50", "blockNumber": 5, @@ -833,8 +833,7 @@ Response Example { "payment":{ "nonce":"0x1", - "receiver":"0xa6594b7196808d161b6fb137e781abbc251385d9", - "sender":"0xa6594b7196808d161b6fb137e781abbc251385d9", + "receiver": "cccqzn9jjm3j6qg69smd7cn0eup4w7z2yu9myd6c4d7", "value":"0x0" } } From d42780d5e60945fb061c616bda27521fc87fbc8a Mon Sep 17 00:00:00 2001 From: Seulgi Kim Date: Mon, 13 Aug 2018 19:35:15 +0900 Subject: [PATCH 2/3] Make Block in RPC use PlatformAddress --- rpc/src/v1/impls/chain.rs | 10 ++++++++-- rpc/src/v1/types/block.rs | 11 ++++++----- spec/JSON-RPC.md | 4 ++-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/rpc/src/v1/impls/chain.rs b/rpc/src/v1/impls/chain.rs index cf07dea731..0477c18390 100644 --- a/rpc/src/v1/impls/chain.rs +++ b/rpc/src/v1/impls/chain.rs @@ -177,11 +177,17 @@ where } fn get_block_by_number(&self, block_number: u64) -> Result> { - Ok(self.client.block(BlockId::Number(block_number)).map(|block| block.decode().into())) + Ok(self + .client + .block(BlockId::Number(block_number)) + .map(|block| Block::from_core(block.decode(), self.client.common_params().network_id))) } fn get_block_by_hash(&self, block_hash: H256) -> Result> { - Ok(self.client.block(BlockId::Hash(block_hash)).map(|block| block.decode().into())) + Ok(self + .client + .block(BlockId::Hash(block_hash)) + .map(|block| Block::from_core(block.decode(), self.client.common_params().network_id))) } fn get_pending_parcels(&self) -> Result> { diff --git a/rpc/src/v1/types/block.rs b/rpc/src/v1/types/block.rs index 20dae59140..bd7bbbf3f9 100644 --- a/rpc/src/v1/types/block.rs +++ b/rpc/src/v1/types/block.rs @@ -15,7 +15,7 @@ // along with this program. If not, see . use ccore::Block as CoreBlock; -use ckey::Address; +use ckey::{NetworkId, PlatformAddress}; use ctypes::BlockNumber; use primitives::{H256, U256}; @@ -27,7 +27,7 @@ pub struct Block { parent_hash: H256, timestamp: u64, number: u64, - author: Address, + author: PlatformAddress, extra_data: Vec, @@ -42,15 +42,16 @@ pub struct Block { parcels: Vec, } -impl From for Block { - fn from(block: CoreBlock) -> Self { +impl Block { + pub fn from_core(block: CoreBlock, network_id: NetworkId) -> Self { let block_number = block.header.number(); let block_hash = block.header.hash(); + const VERSION: u8 = 0; Block { parent_hash: block.header.parent_hash().clone(), timestamp: block.header.timestamp(), number: block.header.number(), - author: block.header.author().clone(), + author: PlatformAddress::create(VERSION, network_id, block.header.author().clone()), extra_data: block.header.extra_data().clone(), diff --git a/spec/JSON-RPC.md b/spec/JSON-RPC.md index 8d55437acb..6506270cde 100644 --- a/spec/JSON-RPC.md +++ b/spec/JSON-RPC.md @@ -25,7 +25,7 @@ A base32 string that starts with "ccc" or "tcc". See [the specification](https:/ ## Block - - author: `H160` + - author: `PlatformAddress` - extraData: `any[]` - hash: `H256` - invoicesRoot: `H256` @@ -333,7 +333,7 @@ Response Example { "jsonrpc":"2.0", "result":{ - "author":"0x84137e7a75043bed32e4458a45da7549a8169b4d", + "author":"cccqzzpxln6w5zrhmfju3zc53w6w4y6s95mf5lfasfn", "extraData":[ ], From 8ccdea65c1f31d7e2abf2db9e9dd7082214b0a65 Mon Sep 17 00:00:00 2001 From: Seulgi Kim Date: Mon, 13 Aug 2018 19:46:13 +0900 Subject: [PATCH 3/3] Make RPC use PlatformAddress --- rpc/src/v1/impls/chain.rs | 24 +++++++++++++++--------- rpc/src/v1/traits/chain.rs | 14 +++++++------- spec/JSON-RPC.md | 22 +++++++++++----------- 3 files changed, 33 insertions(+), 27 deletions(-) diff --git a/rpc/src/v1/impls/chain.rs b/rpc/src/v1/impls/chain.rs index 0477c18390..9c53586b10 100644 --- a/rpc/src/v1/impls/chain.rs +++ b/rpc/src/v1/impls/chain.rs @@ -20,12 +20,12 @@ use ccore::{ AssetClient, BlockId, EngineInfo, ExecuteClient, MinerService, MiningBlockChainClient, RegularKey, Shard, SignedParcel, UnverifiedParcel, }; -use ckey::{Address, NetworkId, Public}; +use ckey::{NetworkId, PlatformAddress, Public}; use cstate::{AssetScheme, AssetSchemeAddress, OwnedAsset}; use ctypes::invoice::{ParcelInvoice, TransactionInvoice}; use ctypes::parcel::Action; use ctypes::{BlockNumber, ShardId, WorldId}; -use primitives::{H160, H256, U256}; +use primitives::{H256, U256}; use rlp::{DecoderError, UntrustedRlp}; use jsonrpc_core::Result; @@ -135,17 +135,17 @@ where self.client.is_asset_spent(transaction_hash, index, shard_id, block_id).map_err(errors::parcel_state) } - fn get_nonce(&self, address: H160, block_number: Option) -> Result> { + fn get_nonce(&self, address: PlatformAddress, block_number: Option) -> Result> { let block_id = block_number.map(BlockId::Number).unwrap_or(BlockId::Latest); Ok(self.client.nonce(&address.into(), block_id)) } - fn get_balance(&self, address: H160, block_number: Option) -> Result> { + fn get_balance(&self, address: PlatformAddress, block_number: Option) -> Result> { let block_id = block_number.map(BlockId::Number).unwrap_or(BlockId::Latest); Ok(self.client.balance(&address.into(), block_id.into())) } - fn get_regular_key(&self, address: H160, block_number: Option) -> Result> { + fn get_regular_key(&self, address: PlatformAddress, block_number: Option) -> Result> { let block_id = block_number.map(BlockId::Number).unwrap_or(BlockId::Latest); Ok(self.client.regular_key(&address.into(), block_id.into())) } @@ -194,11 +194,13 @@ where Ok(self.client.ready_parcels().into_iter().map(|signed| signed.into()).collect()) } - fn get_coinbase(&self) -> Result> { + fn get_coinbase(&self) -> Result> { if self.miner.author().is_zero() { Ok(None) } else { - Ok(Some(self.miner.author())) + const VERSION: u8 = 0; + let network_id = self.client.common_params().network_id; + Ok(Some(PlatformAddress::create(VERSION, network_id, self.miner.author()))) } } @@ -206,11 +208,15 @@ where Ok(self.client.common_params().network_id) } - fn execute_change_shard_state(&self, transactions: Vec, sender: Address) -> Result> { + fn execute_change_shard_state( + &self, + transactions: Vec, + sender: PlatformAddress, + ) -> Result> { let transaction_types: Vec<_> = transactions.into_iter().map(From::from).collect(); Ok(self .client - .execute_transactions(&transaction_types, &sender) + .execute_transactions(&transaction_types, &sender.into()) .map_err(errors::core)? .into_iter() .map(From::from) diff --git a/rpc/src/v1/traits/chain.rs b/rpc/src/v1/traits/chain.rs index 8c0c3f924a..780959fa2f 100644 --- a/rpc/src/v1/traits/chain.rs +++ b/rpc/src/v1/traits/chain.rs @@ -14,11 +14,11 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -use ckey::{Address, NetworkId, Public}; +use ckey::{NetworkId, PlatformAddress, Public}; use cstate::{AssetScheme, OwnedAsset}; use ctypes::invoice::{ParcelInvoice, TransactionInvoice}; use ctypes::{BlockNumber, ShardId, WorldId}; -use primitives::{H160, H256, U256}; +use primitives::{H256, U256}; use jsonrpc_core::Result; @@ -64,15 +64,15 @@ build_rpc_trait! { /// Gets nonce with given account. # [rpc(name = "chain_getNonce")] - fn get_nonce(&self, H160, Option) -> Result>; + fn get_nonce(&self, PlatformAddress, Option) -> Result>; /// Gets balance with given account. # [rpc(name = "chain_getBalance")] - fn get_balance(&self, H160, Option) -> Result>; + fn get_balance(&self, PlatformAddress, Option) -> Result>; /// Gets regular key with given account # [rpc(name = "chain_getRegularKey")] - fn get_regular_key(&self, H160, Option) -> Result>; + fn get_regular_key(&self, PlatformAddress, Option) -> Result>; /// Gets the number of shards # [rpc(name = "chain_getNumberOfShards")] @@ -108,7 +108,7 @@ build_rpc_trait! { /// Gets coinbase's account id # [rpc(name = "chain_getCoinbase")] - fn get_coinbase(&self) -> Result>; + fn get_coinbase(&self) -> Result>; /// Return the network id that is used in this chain. # [rpc(name = "chain_getNetworkId")] @@ -116,6 +116,6 @@ build_rpc_trait! { /// Execute Transactions # [rpc(name = "chain_executeTransactions")] - fn execute_change_shard_state(&self, Vec, Address) -> Result>; + fn execute_change_shard_state(&self, Vec, PlatformAddress) -> Result>; } } diff --git a/spec/JSON-RPC.md b/spec/JSON-RPC.md index 6506270cde..bc01d2fef0 100644 --- a/spec/JSON-RPC.md +++ b/spec/JSON-RPC.md @@ -276,7 +276,7 @@ Response Example { "jsonrpc":"2.0", "result":{ - "hash":"0x56642f04d519ae3262c7ba6facf1c5b11450ebaeb7955337cfbc45420d573077", + "hash":"cccqzn9jjm3j6qg69smd7cn0eup4w7z2yu9myd6c4d70x56642f04d519ae3262c7ba6facf1c5b11450ebaeb7955337cfbc45420d573077", "number":1 }, "id":null @@ -663,7 +663,7 @@ Response Example Gets a nonce of an account of the given address, at state of the given blockNumber. Params: - 1. address: `H160` + 1. address: `PlatformAddress` 2. block number: `number` | `null` Return Type: `U256` @@ -674,7 +674,7 @@ Request Example ``` curl \ -H 'Content-Type: application/json' \ - -d '{"jsonrpc": "2.0", "method": "chain_getNonce", "params": ["0xa6594b7196808d161b6fb137e781abbc251385d9", null], "id": null}' \ + -d '{"jsonrpc": "2.0", "method": "chain_getNonce", "params": ["cccqzn9jjm3j6qg69smd7cn0eup4w7z2yu9myd6c4d7", null], "id": null}' \ localhost:8080 ``` @@ -691,7 +691,7 @@ Response Example Gets a balance of an account of the given address, at the state of the given blockNumber. Params: - 1. address: `H160` + 1. address: `PlatformAddress` 2. block number: `number` | `null` Return Type: `U256` @@ -702,7 +702,7 @@ Request Example ``` curl \ -H 'Content-Type: application/json' \ - -d '{"jsonrpc": "2.0", "method": "chain_getBalance", "params": ["0xa6594b7196808d161b6fb137e781abbc251385d9", null], "id": null}' \ + -d '{"jsonrpc": "2.0", "method": "chain_getBalance", "params": ["cccqzn9jjm3j6qg69smd7cn0eup4w7z2yu9myd6c4d7", null], "id": null}' \ localhost:8080 ``` @@ -719,7 +719,7 @@ Response Example Gets the regular key of an account of the given address, at the state of the given blockNumber. Params: - 1. address: `H160` + 1. address: `PlatformAddress` 2. block number: `number` | `null` Return Type: `H512` - 512-bit public key @@ -730,7 +730,7 @@ Request Example ``` curl \ -H 'Content-Type: application/json' \ - -d '{"jsonrpc": "2.0", "method": "chain_getRegularKey", "params": ["0xa6594b7196808d161b6fb137e781abbc251385d9", null], "id": null}' \ + -d '{"jsonrpc": "2.0", "method": "chain_getRegularKey", "params": ["cccqzn9jjm3j6qg69smd7cn0eup4w7z2yu9myd6c4d7", null], "id": null}' \ localhost:8080 ``` @@ -850,7 +850,7 @@ Gets coinbase's account id. Params: No parameters -Return Type: `H160` | `null` +Return Type: `PlatformAddress` | `null` Request Example ``` @@ -864,7 +864,7 @@ Response Example ``` { "jsonrpc":"2.0", - "result":"0xa6594b7196808d161b6fb137e781abbc251385d9", + "result":"cccqzn9jjm3j6qg69smd7cn0eup4w7z2yu9myd6c4d7", "id":null } ``` @@ -874,7 +874,7 @@ Executes the transactions and returns the current shard root and the changed sha Params: 1. transactions: `Transaction[]` - 2. sender: `H160` + 2. sender: `PlatformAddress` Return Type: `ChangeShard[]` @@ -884,7 +884,7 @@ Request Example ``` curl \ -H 'Content-Type: application/json' \ - -d '{"jsonrpc": "2.0", "method": "chain_executeTransactions", "params": [[{"type":"assetMint","data":{"networkId":"17","shardId":0,"worldId":0,"metadata":"{\"name\":\"Gold\",\"description\":\"An asset example\",\"icon_url\":\"https://gold.image/\"}","output":{"lockScriptHash":"0xf42a65ea518ba236c08b261c34af0521fa3cd1aa505e1c18980919cb8945f8f3","parameters":[],"amount":10000},"registrar":null,"nonce":0}}, {"type":"assetMint","data":{"networkId":"17","shardId":1,"worldId":0,"metadata":"{\"name\":\"Gold\",\"description\":\"An asset example\",\"icon_url\":\"https://gold.image/\"}","output":{"lockScriptHash":"0xf42a65ea518ba236c08b261c34af0521fa3cd1aa505e1c18980919cb8945f8f3","parameters":[],"amount":10000},"registrar":null,"nonce":0}}], "0xa6594b7196808d161b6fb137e781abbc251385d9"], "id": null}' \ + -d '{"jsonrpc": "2.0", "method": "chain_executeTransactions", "params": [[{"type":"assetMint","data":{"networkId":"17","shardId":0,"worldId":0,"metadata":"{\"name\":\"Gold\",\"description\":\"An asset example\",\"icon_url\":\"https://gold.image/\"}","output":{"lockScriptHash":"0xf42a65ea518ba236c08b261c34af0521fa3cd1aa505e1c18980919cb8945f8f3","parameters":[],"amount":10000},"registrar":null,"nonce":0}}, {"type":"assetMint","data":{"networkId":"17","shardId":1,"worldId":0,"metadata":"{\"name\":\"Gold\",\"description\":\"An asset example\",\"icon_url\":\"https://gold.image/\"}","output":{"lockScriptHash":"0xf42a65ea518ba236c08b261c34af0521fa3cd1aa505e1c18980919cb8945f8f3","parameters":[],"amount":10000},"registrar":null,"nonce":0}}], "cccqzn9jjm3j6qg69smd7cn0eup4w7z2yu9myd6c4d7"], "id": null}' \ localhost:8080 ```