-
Notifications
You must be signed in to change notification settings - Fork 15
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: a precompile to get ciphertext bytes
Given a contract address and an ebool/euint value stored in it, return the underlying ciphertext. Returns an empty response if no such ciphertext exist. Only works via `eth_call`. The function selector for it, as of this commit, is `e4b808cb`. Move protected storage code into its own file. Add a `Precompiles` section in the getting started doc section. Nit: rename `arg_types` to `argTypes` in instructions.go for naming consistency.
- Loading branch information
1 parent
965afb6
commit 1eb0838
Showing
9 changed files
with
595 additions
and
226 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
# Precompiles | ||
|
||
fhevm-go supports a number of functionalities that can be accessed via EVM function selectors. We call these functionalities `precompiles`, even though, technically, there is only one main fhevm-go precompile. | ||
|
||
This page describes the required inputs, behaviours and outputs of some of these precompiles. | ||
|
||
## GetCiphertext | ||
|
||
The `GetCiphertext` precompile returns a serialized TFHE ciphertext from protected storage given: | ||
* contract address where the ciphertext is stored at | ||
* the ebool/e(u)int value (also called a handle) for which the ciphertext is requested | ||
|
||
GetCiphertext only works via `eth_call`. | ||
|
||
To call GetCiphertext via `eth_call`, the following Python can serve as an example: | ||
|
||
```python | ||
import http.client | ||
import json | ||
|
||
# This is the address of the main fhevm-go precompile. This value is hardcoded per blockchain. | ||
fhe_precompile_address = "0x000000000000000000000000000000000000005d" | ||
|
||
# The contract address where the ciphertext is stored at. | ||
contract_address = "ACD7Be4EBF68Bf2A5b6eB0CaFb15460C169BC459" | ||
# 12 bytes of 0s for padding the contract address. | ||
address_zero_padding = "000000000000000000000000" | ||
|
||
# The ebool/e(u)int value for which the ciphertext is requested. | ||
handle = "f038cdc8bf630e239f143abeb039b91ec82ec17a8460582e7a409fa551030c06" | ||
|
||
# The function selector of GetCiphertext. | ||
get_ciphertext_selector = "e4b808cb" | ||
|
||
# Call the FHE precompile with `data` being the concatenation of: | ||
# - getCiphertext function selector; | ||
# - 12 bytes of 0s to padd the contract address; | ||
# - contract address; | ||
# - the handle to the ciphertext. | ||
payload = { | ||
"jsonrpc": "2.0", | ||
"method": "eth_call", | ||
"params": [ | ||
{ | ||
"to": fhe_precompile_address, | ||
"data": "0x" + get_ciphertext_selector + address_zero_padding + | ||
contract_address + handle | ||
}, | ||
"latest" | ||
], | ||
"id": 1, | ||
} | ||
|
||
con = http.client.HTTPConnection("localhost", 8545) | ||
con.request("POST", "/", body=json.dumps(payload), | ||
headers={"Content-Type": "application/json"}) | ||
resp = json.loads(con.getresponse().read()) | ||
|
||
# Remove leading "0x" and decode hex to get a byte buffer with the ciphertext. | ||
ciphertext = bytes.fromhex(resp["result"][2:]) | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.