Sending a Transaction with Encrypted Inputs
Now that we have acquired our AES encryption key, we can use it to encrypt the arguments for calling the add function of our Counter.sol contract.
Setup
npm install @coti-io/coti-ethersCode
import { Contract, CotiNetwork, getDefaultProvider, Wallet } from "@coti-io/coti-ethers"
const PRIVATE_KEY = "<EOA_PRIVATE_KEY>"
const AES_KEY = "<AES_KEY>"
const COUNTER_ADDRESS = "<COUNTER_ADDRESS>"
const COUNTER_ABI = [
{
"inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [
{
"components": [
{
"internalType": "ctUint64",
"name": "ciphertext",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"internalType": "struct itUint64",
"name": "value",
"type": "tuple"
}
],
"name": "add",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "sum",
"outputs": [
{
"internalType": "ctUint64",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
}
]
const provider = getDefaultProvider(CotiNetwork.Testnet)
const wallet = new Wallet(PRIVATE_KEY, provider)
wallet.setAesKey(AES_KEY)
const counter = new Contract(COUNTER_ADDRESS, COUNTER_ABI, wallet)
const itValue = await wallet.encryptValue(
123n,
COUNTER_ADDRESS,
counter.add.fragment.selector
)
await (
await counter.add(itValue)
).wait()Setup
npm install @coti-io/coti-ethersCode
import { BrowserProvider, Contract, Eip1193Provider, JsonRpcSigner } from '@coti-io/coti-ethers'
const AES_KEY = "<AES_KEY>"
const COUNTER_ADDRESS = "<COUNTER_ADDRESS>"
const COUNTER_ABI = [
{
"inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [
{
"components": [
{
"internalType": "ctUint64",
"name": "ciphertext",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"internalType": "struct itUint64",
"name": "value",
"type": "tuple"
}
],
"name": "add",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "sum",
"outputs": [
{
"internalType": "ctUint64",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
}
]
const provider = new BrowserProvider(window.ethereum as Eip1193Provider)
const signer = await provider.getSigner()
signer.setAesKey(AES_KEY)
const counter = new Contract(COUNTER_ADDRESS, COUNTER_ABI, signer)
const itValue = await signer.encryptValue(
BigInt(123),
COUNTER_ADDRESS,
counter.add.fragment.selector
)
await (
await counter.add(itValue)
).wait()Setup
pip install coti-web3Code
from eth_account import Account
from eth_account.signers.local import LocalAccount
from web3 import Web3
from web3.utils.coti import (
CotiNetwork,
init_web3
)
PRIVATE_KEY = "<EOA_PRIVATE_KEY>"
AES_KEY = "<AES_KEY>"
COUNTER_ADDRESS = "<COUNTER_ADDRESS>"
COUNTER_ABI = [
{
"inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [
{
"components": [
{
"internalType": "ctUint64",
"name": "ciphertext",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"internalType": "struct itUint64",
"name": "value",
"type": "tuple"
}
],
"name": "add",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "sum",
"outputs": [
{
"internalType": "ctUint64",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
}
]
account: LocalAccount = Account.from_key(PRIVATE_KEY, { 'aes_key': AES_KEY })
w3: Web3 = init_web3(CotiNetwork.TESTNET)
counter_contract = w3.eth.contract(address=COUNTER_ADDRESS, abi=COUNTER_ABI)
it_value = account.encrypt_value(
123,
counter_contract.address,
counter_contract.functions.add(value=(0, bytes(65))).selector
)
tx = counter_contract.functions.add(it_value).build_transaction({
'from': account.address,
'chainId': w3.eth.chain_id,
'nonce': w3.eth.get_transaction_count(account.address),
'gas': 15000000,
'gasPrice': w3.to_wei(30, 'gwei')
})
signed_tx = w3.eth.account.sign_transaction(tx, PRIVATE_KEY)
tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction)
w3.eth.wait_for_transaction_receipt(tx_hash)Last updated
Was this helpful?