mirror of
https://github.com/tlsnotary/tlsn-js.git
synced 2026-01-08 06:34:09 -05:00
Alpha.11 (#109)
Co-authored-by: yuroitaki <25913766+yuroitaki@users.noreply.github.com>
This commit is contained in:
2
.github/workflows/ci.yaml
vendored
2
.github/workflows/ci.yaml
vendored
@@ -13,7 +13,7 @@ jobs:
|
||||
RELEASE_MODE: 'dry-run' # dry-run by default, will be set to 'publish' for release builds
|
||||
services:
|
||||
notary-server:
|
||||
image: ghcr.io/tlsnotary/tlsn/notary-server:v0.1.0-alpha.10
|
||||
image: ghcr.io/tlsnotary/tlsn/notary-server:v0.1.0-alpha.11
|
||||
env:
|
||||
NOTARY_SERVER__TLS__ENABLED: false
|
||||
ports:
|
||||
|
||||
2
.github/workflows/playwright.yml
vendored
2
.github/workflows/playwright.yml
vendored
@@ -8,7 +8,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
services:
|
||||
notary-server:
|
||||
image: ghcr.io/tlsnotary/tlsn/notary-server:v0.1.0-alpha.10
|
||||
image: ghcr.io/tlsnotary/tlsn/notary-server:v0.1.0-alpha.11
|
||||
env:
|
||||
NOTARY_SERVER__TLS__ENABLED: false
|
||||
ports:
|
||||
|
||||
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"rust-analyzer.linkedProjects": [
|
||||
"interactive-demo/verifier-rs/Cargo.toml",
|
||||
"interactive-demo/prover-rs/Cargo.toml"
|
||||
"demo/interactive-demo/verifier-rs/Cargo.toml",
|
||||
"demo/interactive-demo/prover-rs/Cargo.toml"
|
||||
],
|
||||
}
|
||||
@@ -25,7 +25,8 @@ tracing-subscriber = { version ="0.3.18", features = ["env-filter"] }
|
||||
uuid = { version = "1.4.1", features = ["v4", "fast-rng"] }
|
||||
ws_stream_tungstenite = { version = "0.13", features = ["tokio_io"] }
|
||||
|
||||
tlsn-core = { git = "https://github.com/tlsnotary/tlsn.git", tag = "v0.1.0-alpha.10", package = "tlsn-core" }
|
||||
tlsn-prover = { git = "https://github.com/tlsnotary/tlsn.git", tag = "v0.1.0-alpha.10", package = "tlsn-prover" }
|
||||
tlsn-common = { git = "https://github.com/tlsnotary/tlsn.git", tag = "v0.1.0-alpha.10", package = "tlsn-common" }
|
||||
tlsn-core = { git = "https://github.com/tlsnotary/tlsn.git", tag = "v0.1.0-alpha.11", package = "tlsn-core" }
|
||||
tlsn-prover = { git = "https://github.com/tlsnotary/tlsn.git", tag = "v0.1.0-alpha.11", package = "tlsn-prover" }
|
||||
tlsn-common = { git = "https://github.com/tlsnotary/tlsn.git", tag = "v0.1.0-alpha.11", package = "tlsn-common" }
|
||||
spansy = {git = "https://github.com/tlsnotary/tlsn-utils", package = "spansy", branch = "dev"}
|
||||
rangeset = "0.2.0"
|
||||
|
||||
@@ -2,14 +2,15 @@ use async_tungstenite::{tokio::connect_async_with_config, tungstenite::protocol:
|
||||
use http_body_util::Empty;
|
||||
use hyper::{body::Bytes, Request, StatusCode, Uri};
|
||||
use hyper_util::rt::TokioIo;
|
||||
use rangeset::RangeSet;
|
||||
use spansy::{
|
||||
http::parse_response,
|
||||
json::{self},
|
||||
Spanned,
|
||||
};
|
||||
use tlsn_common::config::ProtocolConfig;
|
||||
use tlsn_core::transcript::Idx;
|
||||
use tlsn_prover::{state::Prove, Prover, ProverConfig};
|
||||
use tlsn_core::ProveConfig;
|
||||
use tlsn_prover::{Prover, ProverConfig};
|
||||
use tokio::io::{AsyncRead, AsyncWrite};
|
||||
use tokio_util::compat::{FuturesAsyncReadCompatExt, TokioAsyncReadCompatExt};
|
||||
use tracing::{debug, info};
|
||||
@@ -27,7 +28,7 @@ const MAX_RECV_DATA: usize = 1 << 14;
|
||||
|
||||
const SECRET: &str = "TLSNotary's private key 🤡";
|
||||
/// Make sure the following url's domain is the same as SERVER_DOMAIN on the verifier side
|
||||
const SERVER_URL: &str = "https://raw.githubusercontent.com/tlsnotary/tlsn/refs/tags/v0.1.0-alpha.10/crates/server-fixture/server/src/data/1kb.json";
|
||||
const SERVER_URL: &str = "https://raw.githubusercontent.com/tlsnotary/tlsn/refs/tags/v0.1.0-alpha.11/crates/server-fixture/server/src/data/1kb.json";
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
@@ -42,7 +43,7 @@ async fn main() {
|
||||
async fn run_prover(verifier_host: &str, verifier_port: u16, server_uri: &str) {
|
||||
info!("Sending websocket request...");
|
||||
let request = http::Request::builder()
|
||||
.uri(format!("ws://{}:{}/verify", verifier_host, verifier_port,))
|
||||
.uri(format!("ws://{verifier_host}:{verifier_port}/verify",))
|
||||
.header("Host", verifier_host)
|
||||
.header("Sec-WebSocket-Key", uuid::Uuid::new_v4().to_string())
|
||||
.header("Sec-WebSocket-Version", "13")
|
||||
@@ -129,22 +130,27 @@ async fn prover<T: AsyncWrite + AsyncRead + Send + Unpin + 'static>(verifier_soc
|
||||
assert!(response.status() == StatusCode::OK);
|
||||
|
||||
// Create proof for the Verifier.
|
||||
let mut prover = prover_task.await.unwrap().unwrap().start_prove();
|
||||
let mut prover = prover_task.await.unwrap().unwrap();
|
||||
|
||||
let idx_sent = redact_and_reveal_sent_data(&mut prover);
|
||||
let idx_recv = redact_and_reveal_received_data(&mut prover);
|
||||
let mut builder: tlsn_core::ProveConfigBuilder<'_> = ProveConfig::builder(prover.transcript());
|
||||
|
||||
// Reveal parts of the transcript
|
||||
prover.prove_transcript(idx_sent, idx_recv).await.unwrap();
|
||||
// Reveal the DNS name.
|
||||
builder.server_identity();
|
||||
|
||||
// Finalize.
|
||||
prover.finalize().await.unwrap()
|
||||
let sent_rangeset = redact_and_reveal_sent_data(prover.transcript().sent());
|
||||
let _ = builder.reveal_sent(&sent_rangeset);
|
||||
|
||||
let recv_rangeset = redact_and_reveal_received_data(prover.transcript().received());
|
||||
let _ = builder.reveal_recv(&recv_rangeset);
|
||||
|
||||
let config = builder.build().unwrap();
|
||||
|
||||
prover.prove(&config).await.unwrap();
|
||||
prover.close().await.unwrap();
|
||||
}
|
||||
|
||||
/// Redacts and reveals received data to the verifier.
|
||||
fn redact_and_reveal_received_data(prover: &mut Prover<Prove>) -> Idx {
|
||||
let recv_transcript = prover.transcript().received();
|
||||
|
||||
fn redact_and_reveal_received_data(recv_transcript: &[u8]) -> RangeSet<usize> {
|
||||
// Get the some information from the received data.
|
||||
let received_string = String::from_utf8(recv_transcript.to_vec()).unwrap();
|
||||
debug!("Received data: {}", received_string);
|
||||
@@ -164,12 +170,11 @@ fn redact_and_reveal_received_data(prover: &mut Prover<Prove>) -> Idx {
|
||||
let street_start = street.span().indices().min().unwrap() - 11; // 11 is the length of "street: "
|
||||
let street_end = street.span().indices().max().unwrap() + 1; // include `"`
|
||||
|
||||
Idx::new([name_start..name_end + 1, street_start..street_end + 1])
|
||||
[name_start..name_end + 1, street_start..street_end + 1].into()
|
||||
}
|
||||
|
||||
/// Redacts and reveals sent data to the verifier.
|
||||
fn redact_and_reveal_sent_data(prover: &mut Prover<Prove>) -> Idx {
|
||||
let sent_transcript = prover.transcript().sent();
|
||||
fn redact_and_reveal_sent_data(sent_transcript: &[u8]) -> RangeSet<usize> {
|
||||
let sent_transcript_len = sent_transcript.len();
|
||||
|
||||
let sent_string: String = String::from_utf8(sent_transcript.to_vec()).unwrap();
|
||||
@@ -178,8 +183,9 @@ fn redact_and_reveal_sent_data(prover: &mut Prover<Prove>) -> Idx {
|
||||
debug!("Send data: {}", sent_string);
|
||||
|
||||
// Reveal everything except for the SECRET.
|
||||
Idx::new([
|
||||
[
|
||||
0..secret_start,
|
||||
secret_start + SECRET.len()..sent_transcript_len,
|
||||
])
|
||||
]
|
||||
.into()
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ const root = createRoot(container!);
|
||||
|
||||
root.render(<App />);
|
||||
|
||||
const serverUrl = 'https://raw.githubusercontent.com/tlsnotary/tlsn/refs/tags/v0.1.0-alpha.10/crates/server-fixture/server/src/data/1kb.json';
|
||||
const serverUrl = 'https://raw.githubusercontent.com/tlsnotary/tlsn/refs/tags/v0.1.0-alpha.11/crates/server-fixture/server/src/data/1kb.json';
|
||||
// const websocketProxyUrl = `wss://notary.pse.dev/proxy`;
|
||||
const websocketProxyUrl = 'ws://localhost:55688';
|
||||
const verifierProxyUrl = 'ws://localhost:9816/verify';
|
||||
|
||||
@@ -32,7 +32,7 @@ tracing = "0.1.40"
|
||||
tracing-subscriber = { version ="0.3.18", features = ["env-filter"] }
|
||||
ws_stream_tungstenite = { version = "0.13", features = ["tokio_io"] }
|
||||
|
||||
tlsn-core = { git = "https://github.com/tlsnotary/tlsn.git", tag = "v0.1.0-alpha.10", package = "tlsn-core" }
|
||||
tlsn-verifier = { git = "https://github.com/tlsnotary/tlsn.git", tag = "v0.1.0-alpha.10", package = "tlsn-verifier" }
|
||||
tlsn-common = { git = "https://github.com/tlsnotary/tlsn.git", tag = "v0.1.0-alpha.10", package = "tlsn-common" }
|
||||
tlsn-core = { git = "https://github.com/tlsnotary/tlsn.git", tag = "v0.1.0-alpha.11", package = "tlsn-core" }
|
||||
tlsn-verifier = { git = "https://github.com/tlsnotary/tlsn.git", tag = "v0.1.0-alpha.11", package = "tlsn-verifier" }
|
||||
tlsn-common = { git = "https://github.com/tlsnotary/tlsn.git", tag = "v0.1.0-alpha.11", package = "tlsn-common" }
|
||||
tower-util = "0.3.1"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
An implementation of the interactive verifier server in Rust.
|
||||
|
||||
## Running the server
|
||||
1. Configure this server setting via the global variables defined in [main.rs](./src/main.rs) — please ensure that the hardcoded `SERVER_DOMAIN` and `VERIFICATION_SESSION_ID` have the same values on the prover side.
|
||||
1. Configure this server setting via the global variables defined in [main.rs](./src/main.rs) — please ensure that the hardcoded `SERVER_DOMAIN` has the same value on the prover side.
|
||||
2. Start the server by running the following in a terminal at the root of this crate.
|
||||
```bash
|
||||
cargo run --release
|
||||
|
||||
@@ -13,7 +13,8 @@ use std::{
|
||||
sync::Arc,
|
||||
};
|
||||
use tlsn_common::config::ProtocolConfigValidator;
|
||||
use tlsn_verifier::{SessionInfo, Verifier, VerifierConfig};
|
||||
use tlsn_core::{VerifierOutput, VerifyConfig};
|
||||
use tlsn_verifier::{Verifier, VerifierConfig};
|
||||
|
||||
use tokio::{
|
||||
io::{AsyncRead, AsyncWrite},
|
||||
@@ -105,10 +106,10 @@ async fn handle_socket(socket: WebSocket, verifier_globals: VerifierGlobals) {
|
||||
let stream = WsStream::new(socket.into_inner());
|
||||
|
||||
match verifier(stream, &verifier_globals.server_domain).await {
|
||||
Ok((sent, received, _session_info)) => {
|
||||
Ok((sent, received)) => {
|
||||
info!("Successfully verified {}", &verifier_globals.server_domain);
|
||||
info!("Verified sent data:\n{}", sent,);
|
||||
println!("Verified received data:\n{}", received,);
|
||||
println!("Verified received data:\n{received}",);
|
||||
}
|
||||
Err(err) => {
|
||||
error!("Failed verification using websocket: {err}");
|
||||
@@ -119,7 +120,7 @@ async fn handle_socket(socket: WebSocket, verifier_globals: VerifierGlobals) {
|
||||
async fn verifier<T: AsyncWrite + AsyncRead + Send + Unpin + 'static>(
|
||||
socket: T,
|
||||
server_domain: &str,
|
||||
) -> Result<(String, String, SessionInfo), eyre::ErrReport> {
|
||||
) -> Result<(String, String), eyre::ErrReport> {
|
||||
debug!("Starting verification...");
|
||||
|
||||
// Setup Verifier.
|
||||
@@ -135,15 +136,24 @@ async fn verifier<T: AsyncWrite + AsyncRead + Send + Unpin + 'static>(
|
||||
.unwrap();
|
||||
let verifier = Verifier::new(verifier_config);
|
||||
|
||||
// Verify MPC-TLS and wait for (redacted) data.
|
||||
// Receive authenticated data.
|
||||
debug!("Starting MPC-TLS verification...");
|
||||
// Verify MPC-TLS and wait for (redacted) data.
|
||||
let (mut partial_transcript, session_info) = verifier.verify(socket.compat()).await.unwrap();
|
||||
partial_transcript.set_unauthed(0);
|
||||
|
||||
let verify_config = VerifyConfig::default();
|
||||
let VerifierOutput {
|
||||
server_name,
|
||||
transcript,
|
||||
..
|
||||
} = verifier
|
||||
.verify(socket.compat(), &verify_config)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
let transcript = transcript.expect("prover should have revealed transcript data");
|
||||
|
||||
// Check sent data: check host.
|
||||
debug!("Starting sent data verification...");
|
||||
let sent = partial_transcript.sent_unsafe().to_vec();
|
||||
let sent = transcript.sent_unsafe().to_vec();
|
||||
let sent_data = String::from_utf8(sent.clone()).expect("Verifier expected sent data");
|
||||
sent_data
|
||||
.find(server_domain)
|
||||
@@ -151,22 +161,28 @@ async fn verifier<T: AsyncWrite + AsyncRead + Send + Unpin + 'static>(
|
||||
|
||||
// Check received data: check json and version number.
|
||||
debug!("Starting received data verification...");
|
||||
let received = partial_transcript.received_unsafe().to_vec();
|
||||
let received = transcript.received_unsafe().to_vec();
|
||||
let response = String::from_utf8(received.clone()).expect("Verifier expected received data");
|
||||
|
||||
debug!("Received data: {:?}", response);
|
||||
response
|
||||
.find("123 Elm Street")
|
||||
.ok_or_else(|| eyre!("Verification failed: missing data in received data"))?;
|
||||
|
||||
// Check Session info: server name.
|
||||
if session_info.server_name.as_str() != server_domain {
|
||||
return Err(eyre!("Verification failed: server name mismatches"));
|
||||
if let Some(server_name) = server_name {
|
||||
if server_name.as_str() != server_domain {
|
||||
return Err(eyre!("Verification failed: server name mismatches"));
|
||||
}
|
||||
} else {
|
||||
// TODO: https://github.com/tlsnotary/tlsn-js/issues/110
|
||||
// return Err(eyre!("Verification failed: server name is missing"));
|
||||
}
|
||||
|
||||
let sent_string = bytes_to_redacted_string(&sent)?;
|
||||
let received_string = bytes_to_redacted_string(&received)?;
|
||||
|
||||
Ok((sent_string, received_string, session_info))
|
||||
Ok((sent_string, received_string))
|
||||
}
|
||||
|
||||
/// Render redacted bytes as `🙈`.
|
||||
|
||||
@@ -51,7 +51,7 @@ If you want to use the hosted PSE notary and proxy:
|
||||
1. Open `app.tsx` in your editor.
|
||||
2. Replace the notary URL:
|
||||
```ts
|
||||
notaryUrl: 'https://notary.pse.dev/v0.1.0-alpha.10',
|
||||
notaryUrl: 'https://notary.pse.dev/v0.1.0-alpha.11',
|
||||
```
|
||||
This uses the [PSE](https://pse.dev) notary server to notarize the API request. You can use a different or [local notary](#run-a-local-notary-server); a local server will be faster due to the high bandwidth and low network latency.
|
||||
3. Replace the websocket proxy URL:
|
||||
|
||||
@@ -26,13 +26,13 @@ root.render(<App />);
|
||||
const local = true; // Toggle between local and remote notary
|
||||
const notaryUrl = local
|
||||
? 'http://localhost:7047'
|
||||
: 'https://notary.pse.dev/v0.1.0-alpha.10';
|
||||
: 'https://notary.pse.dev/v0.1.0-alpha.11';
|
||||
const websocketProxyUrl = local
|
||||
? 'ws://localhost:55688'
|
||||
: 'wss://notary.pse.dev/proxy?token=raw.githubusercontent.com';
|
||||
const loggingLevel = 'Info'; // https://github.com/tlsnotary/tlsn/blob/main/crates/wasm/src/log.rs#L8
|
||||
|
||||
const serverUrl = 'https://raw.githubusercontent.com/tlsnotary/tlsn/refs/tags/v0.1.0-alpha.10/crates/server-fixture/server/src/data/1kb.json';
|
||||
const serverUrl = 'https://raw.githubusercontent.com/tlsnotary/tlsn/refs/tags/v0.1.0-alpha.11/crates/server-fixture/server/src/data/1kb.json';
|
||||
const serverDns = 'raw.githubusercontent.com';
|
||||
|
||||
function App(): ReactElement {
|
||||
@@ -170,8 +170,8 @@ function App(): ReactElement {
|
||||
const notaryKey = await notary.publicKey('hex');
|
||||
const verifierOutput = await proof.verify();
|
||||
const transcript = new Transcript({
|
||||
sent: verifierOutput.transcript.sent,
|
||||
recv: verifierOutput.transcript.recv,
|
||||
sent: verifierOutput.transcript?.sent || [],
|
||||
recv: verifierOutput.transcript?.recv || [],
|
||||
});
|
||||
const vk = await proof.verifyingKey();
|
||||
setResult({
|
||||
@@ -201,7 +201,7 @@ function App(): ReactElement {
|
||||
</p>
|
||||
<p>
|
||||
<a
|
||||
href="https://docs.tlsnotary.org/quick_start/tlsn-js.html"
|
||||
href="https://tlsnotary.org/docs/quick_start/tlsn-js/"
|
||||
className="text-blue-500 hover:underline"
|
||||
>
|
||||
More info
|
||||
|
||||
@@ -29,7 +29,7 @@ let verifierLogs: string[] = [];
|
||||
const p2pProxyUrl = 'ws://localhost:3001';
|
||||
const serverDns = 'raw.githubusercontent.com';
|
||||
const webSocketProxy = `wss://notary.pse.dev/proxy?token=${serverDns}`;
|
||||
const requestUrl = `https://raw.githubusercontent.com/tlsnotary/tlsn/refs/tags/v0.1.0-alpha.10/crates/server-fixture/server/src/data/1kb.json`;
|
||||
const requestUrl = `https://raw.githubusercontent.com/tlsnotary/tlsn/refs/tags/v0.1.0-alpha.11/crates/server-fixture/server/src/data/1kb.json`;
|
||||
|
||||
function App(): ReactElement {
|
||||
const [ready, setReady] = useState(false);
|
||||
@@ -207,8 +207,8 @@ function App(): ReactElement {
|
||||
addVerifierLog('Verification completed');
|
||||
|
||||
const t = new Transcript({
|
||||
sent: result.transcript.sent,
|
||||
recv: result.transcript.recv,
|
||||
sent: result.transcript?.sent || [],
|
||||
recv: result.transcript?.recv || [],
|
||||
});
|
||||
|
||||
addVerifierLog('Verified data:');
|
||||
@@ -225,7 +225,7 @@ function App(): ReactElement {
|
||||
This demo showcases peer-to-peer communication between a web prover
|
||||
and a web verifier using TLSNotary. The prover fetches data from{' '}
|
||||
<a
|
||||
href="https://raw.githubusercontent.com/tlsnotary/tlsn/refs/tags/v0.1.0-alpha.10/crates/server-fixture/server/src/data/1kb.json"
|
||||
href="https://raw.githubusercontent.com/tlsnotary/tlsn/refs/tags/v0.1.0-alpha.11/crates/server-fixture/server/src/data/1kb.json"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="underline text-blue-400 hover:text-blue-300"
|
||||
|
||||
12
package-lock.json
generated
12
package-lock.json
generated
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"name": "tlsn-js",
|
||||
"version": "0.1.0-alpha.10.0",
|
||||
"version": "0.1.0-alpha.11.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "tlsn-js",
|
||||
"version": "0.1.0-alpha.10.0",
|
||||
"version": "0.1.0-alpha.11.0",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"tlsn-wasm": "0.1.0-alpha.10"
|
||||
"tlsn-wasm": "0.1.0-alpha.11"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "^1.52.0",
|
||||
@@ -10728,9 +10728,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/tlsn-wasm": {
|
||||
"version": "0.1.0-alpha.10",
|
||||
"resolved": "https://registry.npmjs.org/tlsn-wasm/-/tlsn-wasm-0.1.0-alpha.10.tgz",
|
||||
"integrity": "sha512-HgGLmaxyw18v34hxAOnVc9P/HuEjVuQeb/6TcskaSHGFOY2t2pjWBz93toinEAD2N1LwVQJXoECxsP5Qo81Haw==",
|
||||
"version": "0.1.0-alpha.11",
|
||||
"resolved": "https://registry.npmjs.org/tlsn-wasm/-/tlsn-wasm-0.1.0-alpha.11.tgz",
|
||||
"integrity": "sha512-3QjS5BaPwjZiPwAjMs7ZVSuCOXjvxyxEIPQdDbGa3G5drXu2rfu15zJvDEnrb/SneXD8+/Qk1ZSiB7eYjXBSmQ==",
|
||||
"license": "MIT OR Apache-2.0"
|
||||
},
|
||||
"node_modules/to-buffer": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "tlsn-js",
|
||||
"version": "0.1.0-alpha.10.0",
|
||||
"version": "0.1.0-alpha.11.0",
|
||||
"description": "",
|
||||
"repository": "https://github.com/tlsnotary/tlsn-js",
|
||||
"main": "build/lib.js",
|
||||
@@ -16,7 +16,7 @@
|
||||
"build:src": "webpack --config webpack.build.config.js",
|
||||
"build:types": "tsc --project tsconfig.compile.json",
|
||||
"build:lib": "NODE_ENV=production concurrently npm:build:src npm:build:types",
|
||||
"build:wasm": "sh tlsn-wasm/build.sh v0.1.0-alpha.10",
|
||||
"build:wasm": "sh tlsn-wasm/build.sh v0.1.0-alpha.11",
|
||||
"build": "npm run build:lib",
|
||||
"watch:dev": "webpack --config webpack.web.dev.config.js --watch",
|
||||
"dev": "concurrently npm:watch:dev npm:serve:test",
|
||||
@@ -24,7 +24,7 @@
|
||||
"lint:tsc": "tsc --noEmit",
|
||||
"lint": "concurrently npm:lint:tsc npm:lint:eslint",
|
||||
"test": "playwright test",
|
||||
"notary": "docker run --platform=linux/amd64 -p 7047:7047 --rm ghcr.io/tlsnotary/tlsn/notary-server:v0.1.0-alpha.10 notary-server --tls-enabled=false"
|
||||
"notary": "docker run --platform=linux/amd64 -p 7047:7047 --rm ghcr.io/tlsnotary/tlsn/notary-server:v0.1.0-alpha.11"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "^1.52.0",
|
||||
@@ -67,6 +67,6 @@
|
||||
"node": ">= 16.20.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"tlsn-wasm": "0.1.0-alpha.10"
|
||||
"tlsn-wasm": "0.1.0-alpha.11"
|
||||
}
|
||||
}
|
||||
@@ -13,7 +13,7 @@ test('full-integration', async ({ page }) => {
|
||||
const json = await page.getByTestId('full-integration').innerText();
|
||||
const { sent, recv, server_name, version, meta } = JSON.parse(json);
|
||||
|
||||
expect(version).toBe('0.1.0-alpha.10');
|
||||
expect(version).toBe('0.1.0-alpha.11');
|
||||
expect(new URL(meta.notaryUrl!).protocol === 'http:');
|
||||
expect(server_name).toBe('raw.githubusercontent.com');
|
||||
|
||||
|
||||
@@ -14,7 +14,8 @@ test('simple verify', async ({ page }) => {
|
||||
const { sent, recv } = JSON.parse(json);
|
||||
|
||||
expect(sent).toContain('host: raw.githubusercontent.com');
|
||||
expect(recv).toContain('"name": "John Doe"');
|
||||
expect(recv).toContain('*******************');
|
||||
expect(recv).toContain('"city": "Anytown"');
|
||||
expect(recv).toContain('"id": **********,');
|
||||
expect(recv).toContain('"id": 1234567890');
|
||||
expect(recv).toContain('"postalCode": "12345"');
|
||||
});
|
||||
|
||||
@@ -36,10 +36,10 @@ For this demo, we also need to run a local notary server.
|
||||
* Or, compile and run the notary server natively:
|
||||
```sh
|
||||
# Clone the TLSNotary repository:
|
||||
git clone https://github.com/tlsnotary/tlsn.git --branch "v0.1.0-alpha.10"
|
||||
git clone https://github.com/tlsnotary/tlsn.git --branch "v0.1.0-alpha.11"
|
||||
cd tlsn/crates/notary/server/
|
||||
# Run the ntoary server
|
||||
cargo run --release -- --tls-enabled false
|
||||
# Run the notary server
|
||||
cargo run --release
|
||||
```
|
||||
|
||||
The notary server will now be running in the background waiting for connections.
|
||||
|
||||
26
src/lib.ts
26
src/lib.ts
@@ -10,6 +10,7 @@ import initWasm, {
|
||||
Prover as WasmProver,
|
||||
type ProverConfig,
|
||||
type Method,
|
||||
NetworkSetting,
|
||||
VerifierConfig,
|
||||
VerifierOutput,
|
||||
VerifyingKey,
|
||||
@@ -19,7 +20,7 @@ import initWasm, {
|
||||
PartialTranscript,
|
||||
} from 'tlsn-wasm';
|
||||
import { arrayToHex, expect, headerToMap, hexToArray } from './utils';
|
||||
import { PresentationJSON } from './types';
|
||||
import { PresentationJSON, } from './types';
|
||||
import { Buffer } from 'buffer';
|
||||
import { Transcript, subtractRanges, mapStringToRange } from './transcript';
|
||||
|
||||
@@ -79,6 +80,9 @@ export class Prover {
|
||||
maxSentData?: number;
|
||||
maxRecvData?: number;
|
||||
maxRecvDataOnline?: number;
|
||||
maxSentRecords?: number,
|
||||
maxRecvRecords?: number,
|
||||
network?: NetworkSetting
|
||||
deferDecryptionFromStart?: boolean;
|
||||
commit?: Commit;
|
||||
}): Promise<PresentationJSON> {
|
||||
@@ -90,6 +94,9 @@ export class Prover {
|
||||
maxSentData = 1024,
|
||||
maxRecvData = 1024,
|
||||
maxRecvDataOnline,
|
||||
maxSentRecords,
|
||||
maxRecvRecords,
|
||||
network = 'Bandwidth',
|
||||
deferDecryptionFromStart,
|
||||
notaryUrl,
|
||||
websocketProxyUrl,
|
||||
@@ -103,6 +110,9 @@ export class Prover {
|
||||
max_recv_data: maxRecvData,
|
||||
max_recv_data_online: maxRecvDataOnline,
|
||||
defer_decryption_from_start: deferDecryptionFromStart,
|
||||
max_sent_records: maxSentRecords,
|
||||
max_recv_records: maxRecvRecords,
|
||||
network: network,
|
||||
});
|
||||
|
||||
await prover.setup(await notary.sessionUrl(maxSentData, maxRecvData));
|
||||
@@ -128,7 +138,7 @@ export class Prover {
|
||||
const presentation = build_presentation(attestation, secrets, commit);
|
||||
|
||||
return {
|
||||
version: '0.1.0-alpha.10',
|
||||
version: '0.1.0-alpha.11',
|
||||
data: arrayToHex(presentation.serialize()),
|
||||
meta: {
|
||||
notaryUrl: notary.normalizeUrl(),
|
||||
@@ -143,6 +153,9 @@ export class Prover {
|
||||
maxRecvData?: number;
|
||||
maxRecvDataOnline?: number;
|
||||
deferDecryptionFromStart?: boolean;
|
||||
max_sent_records?: number,
|
||||
max_recv_records?: number,
|
||||
network?: NetworkSetting
|
||||
}) {
|
||||
this.#config = {
|
||||
server_name: config.serverDns,
|
||||
@@ -150,6 +163,9 @@ export class Prover {
|
||||
max_sent_data: config.maxSentData || 1024,
|
||||
max_recv_data_online: config.maxRecvDataOnline,
|
||||
defer_decryption_from_start: config.deferDecryptionFromStart,
|
||||
max_sent_records: config.max_sent_records,
|
||||
max_recv_records: config.max_recv_records,
|
||||
network: config.network || 'Bandwidth',
|
||||
};
|
||||
this.#prover = new WasmProver(this.#config);
|
||||
}
|
||||
@@ -263,10 +279,12 @@ export class Verifier {
|
||||
#config: VerifierConfig;
|
||||
#verifier: WasmVerifier;
|
||||
|
||||
constructor(config: { maxSentData?: number; maxRecvData?: number }) {
|
||||
constructor(config: { maxSentData?: number; maxRecvData?: number; maxSentRecords?: number; maxRecvRecords?: number }) {
|
||||
this.#config = {
|
||||
max_recv_data: config.maxRecvData || 1024,
|
||||
max_sent_data: config.maxSentData || 1024,
|
||||
max_sent_records: config.maxSentRecords,
|
||||
max_recv_records: config.maxRecvRecords,
|
||||
};
|
||||
this.#verifier = new WasmVerifier(this.#config);
|
||||
}
|
||||
@@ -331,7 +349,7 @@ export class Presentation {
|
||||
|
||||
async json(): Promise<PresentationJSON> {
|
||||
return {
|
||||
version: '0.1.0-alpha.10',
|
||||
version: '0.1.0-alpha.11',
|
||||
data: await this.serialize(),
|
||||
meta: {
|
||||
notaryUrl: this.#notaryUrl
|
||||
|
||||
@@ -4,7 +4,7 @@ export type CommitData = {
|
||||
};
|
||||
|
||||
export type PresentationJSON = {
|
||||
version: '0.1.0-alpha.7' | '0.1.0-alpha.8' | '0.1.0-alpha.9' | '0.1.0-alpha.10';
|
||||
version: '0.1.0-alpha.7' | '0.1.0-alpha.8' | '0.1.0-alpha.9' | '0.1.0-alpha.10' | '0.1.0-alpha.11';
|
||||
data: string;
|
||||
meta: {
|
||||
notaryUrl?: string;
|
||||
|
||||
@@ -23,7 +23,8 @@ const { init, Prover, Presentation }: any = Comlink.wrap(
|
||||
console.time('prove');
|
||||
const prover = (await new Prover({
|
||||
serverDns: 'raw.githubusercontent.com',
|
||||
maxRecvData: 1700
|
||||
maxRecvData: 1700,
|
||||
network: "Bandwidth",
|
||||
})) as _Prover;
|
||||
const notary = NotaryServer.from('http://127.0.0.1:7047');
|
||||
await prover.setup(await notary.sessionUrl());
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user