This is a PoC showing a bitcoin light client running on TEEs found on commercial Android devices.
It exposes a JSON RPC accepting the BTC block interval to validate and returns the TEE backed proof that the blocks are chained correctly.
- Android device with a TEE (Strongbox, Samsung Knox, ...)
- Android SDK 33+
- Android NDK 25.2
- Rust v1.76.0
armv7-linux-androideabi
rust toolchain
> cat local.properties
sdk.dir=/opt/android-sdk
ndk.dir=/opt/android-sdk/ndk/25.2.9519653
rust.rustcCommand=/<home>/.cargo/bin/rustc
rust.cargoCommand=/<home>/.cargo/bin/cargo
./connect-device.sh
./gradlew clean assembleDebug installDebug
cd server
cp example-config.json config.json
Populate the config.json missing properties and then run the JSONRPC server:
pnpm i
node index.js
Request a proof through the JSON rpc call
curl -X POST -H 'content-type:application/json' -d '{"jsonrpc": "2.0", "method":"generateProof", "id":"1", "params": ["bitcoin", 841375,841378]}' http://localhost:3030/v1
This is the proof returned:
{
"jsonrpc": "2.0",
"id": "1",
"result": {
"type": "android",
"value": {
"commitment": "MDAwMDAwMDAwMDAwMDAwMDAwMDFiNmE2OWQyMzMyZTk1Mzc4NTBmZWYyMWE3OTY4MTE2N2I4N2VmYmUwZThmZA==",
"signature": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZtbD4BFp6bw2nW9gx4yacQEwQ26SVG2F6FbLjrDqkNMjX6MAJPeBbwrhdhhpKdVIQF3Zylp5aVjPlWs9h3OK7Q==",
"publicKey": "MEYCIQCLk2H3oHCZj9pP+EdHjElZrlAW8cRd1tZQqfsihveGQgIhAMuSJC3TNJlV0Tz7opBDS0aeZvfM7u7A0qzWuHYDBv2t",
"certificateChain": "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"
}
}
}