Added support for contract code by hash.
This is done by requests sending CID with raw binary codec (0x55). Note: this functionality is exactly the same as fetching state-trie due to how db internals work in Parity atm.
This commit is contained in:
parent
8d6275bf07
commit
da696e4a1f
@ -36,6 +36,7 @@ pub enum Error {
|
|||||||
BlockNotFound,
|
BlockNotFound,
|
||||||
TransactionNotFound,
|
TransactionNotFound,
|
||||||
StateRootNotFound,
|
StateRootNotFound,
|
||||||
|
ContractNotFound,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Convert Error into Out, handy when switching from Rust's Result-based
|
/// Convert Error into Out, handy when switching from Rust's Result-based
|
||||||
@ -51,6 +52,7 @@ impl From<Error> for Out {
|
|||||||
BlockNotFound => Out::NotFound("Block not found"),
|
BlockNotFound => Out::NotFound("Block not found"),
|
||||||
TransactionNotFound => Out::NotFound("Transaction not found"),
|
TransactionNotFound => Out::NotFound("Transaction not found"),
|
||||||
StateRootNotFound => Out::NotFound("State root not found"),
|
StateRootNotFound => Out::NotFound("State root not found"),
|
||||||
|
ContractNotFound => Out::NotFound("Contract not found"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -86,6 +86,7 @@ impl IpfsHandler {
|
|||||||
Codec::EthereumBlockList => self.block_list(hash),
|
Codec::EthereumBlockList => self.block_list(hash),
|
||||||
Codec::EthereumTx => self.transaction(hash),
|
Codec::EthereumTx => self.transaction(hash),
|
||||||
Codec::EthereumStateTrie => self.state_trie(hash),
|
Codec::EthereumStateTrie => self.state_trie(hash),
|
||||||
|
Codec::Raw => self.contract_code(hash),
|
||||||
_ => return Err(Error::UnsupportedCid),
|
_ => return Err(Error::UnsupportedCid),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -119,6 +120,13 @@ impl IpfsHandler {
|
|||||||
|
|
||||||
Ok(Out::OctetStream(data))
|
Ok(Out::OctetStream(data))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get state trie node by hash and return as raw binary.
|
||||||
|
fn contract_code(&self, hash: H256) -> Result<Out> {
|
||||||
|
let data = self.client.state_data(&hash).ok_or(Error::ContractNotFound)?;
|
||||||
|
|
||||||
|
Ok(Out::OctetStream(data))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get a query parameter's value by name.
|
/// Get a query parameter's value by name.
|
||||||
@ -192,6 +200,16 @@ mod tests {
|
|||||||
assert_eq!(Err(Error::StateRootNotFound), handler.route_cid(&cid));
|
assert_eq!(Err(Error::StateRootNotFound), handler.route_cid(&cid));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn cid_route_contract_code() {
|
||||||
|
let handler = get_mocked_handler();
|
||||||
|
|
||||||
|
// `raw` with Keccak-256
|
||||||
|
let cid = "zb34WAp1Q5fhtLGZ3w3jhnTWaNbVV5ZZvGq4vuJQzERj6Pu3H";
|
||||||
|
|
||||||
|
assert_eq!(Err(Error::ContractNotFound), handler.route_cid(&cid));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn cid_route_invalid_hash() {
|
fn cid_route_invalid_hash() {
|
||||||
let handler = get_mocked_handler();
|
let handler = get_mocked_handler();
|
||||||
|
Loading…
Reference in New Issue
Block a user