Add 'data' field to Durin OffchainLookup error. (#4336)

This commit is contained in:
Nick Johnson 2021-09-29 13:21:27 +13:00 committed by GitHub
parent 204b2ae595
commit 1eb2678bf8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -48,10 +48,12 @@ In step 3, the client calls the original contract with the exact data provided b
A Durin-enabled contract must revert with the following error whenever a function that requires offchain data is called:
```
error OffchainLookup(string url, bytes prefix)
error OffchainLookup(string url, bytes data, bytes prefix)
```
`url` specifies the URL to a service (known as the gateway) that implements the Durin protocol and can formulate an answer to the original query. `url` can be the empty string `''`, in which case a client-specific default should be used.
`url` specifies the URL to a service (known as the gateway) that implements the Durin protocol and can formulate an answer to the query. `url` can be the empty string `''`, in which case a client-specific default should be used.
`data` specifies the data to call that service with; for simple cases this can be the same as the original call data.
`prefix` specifies a prefix that the data returned by the gateway at `url` must have. Clients will check this value is a prefix of the data returned by the gateway, and cause the call to fail if it does not match.
@ -77,7 +79,7 @@ One example of a valid implementation of `balanceOf` would thus be:
```
function balanceOf(address addr) public view returns(uint balance) {
revert OffchainLookup(url, abi.encodeWithSelector(Contract.balanceOfWithProof.selector, addr));
revert OffchainLookup(url, msg.data, abi.encodeWithSelector(Contract.balanceOfWithProof.selector, addr));
}
```
@ -93,7 +95,7 @@ Accepts calldata for a smart contract call, and returns a message (encoded as a
##### Parameters
1. Object - The call object
- to: DATA, 20 Bytes - The address of the contract being called.
- data: DATA - The call data for the contract invocation - this must be the same as the data originally sent to the contract function that reverted with `OffchainData`.
- data: DATA - The call data for the contract invocation - this must be the value of the `data` field from the `OffchainLookup` error.
- abi: DATA - A JSON format ABI for the function being invoked, as specified in the [Solidity ABI encoding specification](https://docs.soliditylang.org/en/latest/abi-spec.html#json).
##### Returns
@ -122,8 +124,8 @@ def durin_call(address, abi, args, default_gateway):
try:
return address.call(calldata)
except OffchainLookup as e:
url, prefix = e.url, e.prefix
response = json_rpc_call(url or default_gateway, 'durin_call', {'to': address, 'data': calldata, 'abi': abi})
url, data, prefix = e.url, e.data, e.prefix
response = json_rpc_call(url or default_gateway, 'durin_call', {'to': address, 'data': data, 'abi': abi})
if not response.result.startswith(prefix):
throw Error("Invalid response prefix")
return address.call(response.result)