Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
6306e6a
http-client: fix WS client closing: no addl messages (aside from Clos…
nick1udwig Apr 18, 2024
064d6bb
chore: update deps across repo
dr-frmr Apr 22, 2024
9739bdc
Merge branch 'develop' into hf/ws-client-close-fix
dr-frmr Apr 22, 2024
cf18ea6
hotfix: crash on kns_indexer decode
dr-frmr Apr 22, 2024
41e59fb
Merge pull request #311 from kinode-dao/hf/ws-client-close-fix
nick1udwig Apr 22, 2024
a0e78c1
fixes: clean up provider and add more debug prints
dr-frmr Apr 23, 2024
cca3133
fix: kns_indexer, update all packages to process_lib 0.7.0, change de…
dr-frmr Apr 23, 2024
d1184b5
add providerfren pubkey
dr-frmr Apr 24, 2024
d15ffa4
terminal: move script-spawn debug to verbosity 3
dr-frmr Apr 24, 2024
35e1692
fix: refactor eth provider subs
dr-frmr Apr 24, 2024
d3a36b3
print nits
dr-frmr Apr 24, 2024
cfedc19
fix: more sub refactor
dr-frmr Apr 24, 2024
3cae0ca
Merge pull request #314 from kinode-dao/dr/eth-provider-fixes
dr-frmr Apr 24, 2024
5e9f964
kernel: switch back to honoring `OnExit::Restart` on crash
dr-frmr Apr 25, 2024
55f8fc2
Format Rust code using rustfmt
github-actions[bot] Apr 25, 2024
38ec84c
chore: clean up main.rs and simulation-mode
dr-frmr Apr 25, 2024
6ad4a3f
Merge pull request #316 from kinode-dao/dr/process-restart-even-on-crash
dr-frmr Apr 25, 2024
5bc7a4e
bump two deps
dr-frmr Apr 25, 2024
dfd2160
app store: add rebuild-index endpoint for frontend
dr-frmr Apr 29, 2024
260c979
eth: fix failure to respond to unsubscribe
dr-frmr Apr 29, 2024
38b90dc
add a rebuild index button to app store
0x70b1a5 Apr 29, 2024
352f35a
Merge pull request #320 from kinode-dao/dr/app-store-add-rebuild-inde…
dr-frmr Apr 30, 2024
895d939
app store home button
0x70b1a5 Apr 29, 2024
7bee956
homepage vite-ified, valet button for hosted nodes
0x70b1a5 Apr 30, 2024
a8a882f
merge conflicts
0x70b1a5 Apr 30, 2024
281ca7e
Merge pull request #321 from kinode-dao/tm/app-store-home-button
0x70b1a5 Apr 30, 2024
5d868b4
Merge branch 'main' into develop
dr-frmr May 1, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,762 changes: 1,125 additions & 637 deletions Cargo.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "kinode_lib"
authors = ["KinodeDAO"]
version = "0.7.0"
version = "0.7.1"
edition = "2021"
description = "A general-purpose sovereign cloud computing platform"
homepage = "https://kinode.org"
Expand Down
28 changes: 13 additions & 15 deletions kinode/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "kinode"
authors = ["KinodeDAO"]
version = "0.7.0"
version = "0.7.1"
edition = "2021"
description = "A general-purpose sovereign cloud computing platform"
homepage = "https://kinode.org"
Expand All @@ -25,7 +25,7 @@ zip = "0.6"
simulation-mode = []

[dependencies]
aes-gcm = "0.10.2"
aes-gcm = "0.10.3"
alloy-pubsub = { git = "https://github.com/alloy-rs/alloy", rev = "6f8ebb4" }
alloy-rpc-types = { git = "https://github.com/alloy-rs/alloy", rev = "6f8ebb4" }
alloy-rpc-client = { git = "https://github.com/alloy-rs/alloy", rev = "6f8ebb4", features = ["ws"]}
Expand All @@ -37,27 +37,26 @@ alloy-sol-types = "0.6.2"
alloy-signer = { git = "https://github.com/alloy-rs/alloy", rev = "6f8ebb4" }
anyhow = "1.0.71"
async-trait = "0.1.71"
base64 = "0.13"
base64 = "0.22.0"
bincode = "1.3.3"
blake3 = "1.4.1"
bytes = "1.4.0"
cap-std = "2.0.0"
chacha20poly1305 = "0.10.1"
chrono = "0.4.31"
clap = { version = "4.4", features = ["derive"] }
crossterm = { version = "0.26.1", features = ["event-stream", "bracketed-paste"] }
crossterm = { version = "0.27.0", features = ["event-stream", "bracketed-paste"] }
curve25519-dalek = "^4.1.2"
dashmap = "5.5.3"
digest = "0.10"
elliptic-curve = { version = "0.13.8", features = ["ecdh"] }
flate2 = "1.0"
futures = "0.3"
generic-array = "0.14"
generic-array = "1.0.0"
getrandom = "0.2.10"
hex = "0.4.3"
hkdf = "0.12.3"
hmac = "0.12"
http = "0.2.9"
http = "1.1.0"
jwt = "0.16"
lib = { path = "../lib" }
lazy_static = "1.4.0"
Expand All @@ -67,26 +66,25 @@ num-traits = "0.2"
open = "5.0.0"
public-ip = "0.2.2"
rand = "0.8.4"
reqwest = "0.11.18"
ring = "0.16.20"
reqwest = "0.12.4"
ring = "0.17.8"
rmp-serde = "1.1.2"
rocksdb = { version = "0.21.0", features = ["multi-threaded-cf"] }
rocksdb = { version = "0.22.0", features = ["multi-threaded-cf"] }
route-recognizer = "0.3.1"
rusqlite = { version = "0.30.0", features = ["bundled"] }
rusqlite = { version = "0.31.0", features = ["bundled"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
serde_urlencoded = "0.7"
sha2 = "0.10"
snow = { version = "0.9.3", features = ["ring-resolver"] }
snow = { version = "0.9.5", features = ["ring-resolver"] }
static_dir = "0.2.0"
thiserror = "1.0"
tokio = { version = "1.28", features = ["fs", "macros", "rt-multi-thread", "signal", "sync"] }
tokio-stream = "0.1.14"
tokio-tungstenite = "0.20.1"
tokio-tungstenite = "0.21.0"
url = "2.4.1"
uuid = { version = "1.1.2", features = ["serde", "v4"] }
warp = "0.3.5"
wasi-common = "19.0.1"
wasmtime = "19.0.1"
wasmtime-wasi = "19.0.1"
zip = "0.6"
zip = "1.1.1"
10 changes: 5 additions & 5 deletions kinode/packages/app_store/app_store/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
[package]
name = "app_store"
version = "0.3.0"
version = "0.3.1"
edition = "2021"

[features]
simulation-mode = []

[dependencies]
alloy-primitives = "0.6.2"
alloy-sol-types = "0.6.2"
alloy-primitives = "0.7.0"
alloy-sol-types = "0.7.0"
anyhow = "1.0"
bincode = "1.3.3"
kinode_process_lib = { git = "https://github.com/kinode-dao/process_lib", tag = "v0.6.1" }
kinode_process_lib = { git = "https://github.com/kinode-dao/process_lib", tag = "v0.7.0" }
rand = "0.8"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
Expand All @@ -20,7 +20,7 @@ sha3 = "0.10.8"
url = "2.4.1"
urlencoding = "2.1.0"
wit-bindgen = "0.24.0"
zip = { version = "0.6.6", default-features = false }
zip = { version = "1.1.1", default-features = false }

[lib]
crate-type = ["cdylib"]
Expand Down
19 changes: 18 additions & 1 deletion kinode/packages/app_store/app_store/src/http_api.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use crate::{DownloadResponse, PackageListing, PackageState, RequestedPackage, State};
use kinode_process_lib::{
eth,
http::{send_response, IncomingHttpRequest, Method, StatusCode},
Address, NodeId, PackageId,
};
Expand All @@ -23,13 +24,16 @@ use std::collections::HashMap;
/// - stop mirroring a downloaded app: DELETE /apps/:id/mirror
/// - start auto-updating a downloaded app: PUT /apps/:id/auto-update
/// - stop auto-updating a downloaded app: DELETE /apps/:id/auto-update
///
/// - RebuildIndex: POST /apps/rebuild-index
pub fn handle_http_request(
our: &Address,
state: &mut State,
eth_provider: &eth::Provider,
requested_packages: &mut HashMap<PackageId, RequestedPackage>,
req: &IncomingHttpRequest,
) -> anyhow::Result<()> {
match serve_paths(our, state, requested_packages, req) {
match serve_paths(our, state, eth_provider, requested_packages, req) {
Ok((status_code, _headers, body)) => send_response(
status_code,
Some(HashMap::from([(
Expand Down Expand Up @@ -97,6 +101,7 @@ fn gen_package_info(
fn serve_paths(
our: &Address,
state: &mut State,
eth_provider: &eth::Provider,
requested_packages: &mut HashMap<PackageId, RequestedPackage>,
req: &IncomingHttpRequest,
) -> anyhow::Result<(StatusCode, Option<HashMap<String, String>>, Vec<u8>)> {
Expand Down Expand Up @@ -418,6 +423,18 @@ fn serve_paths(
)),
}
}
// RebuildIndex: POST
"/apps/rebuild-index" => {
if method != Method::POST {
return Ok((
StatusCode::METHOD_NOT_ALLOWED,
None,
format!("Invalid method {method} for {bound_path}").into_bytes(),
));
}
crate::rebuild_index(our, state, eth_provider);
Ok((StatusCode::OK, None, vec![]))
}
_ => Ok((
StatusCode::NOT_FOUND,
None,
Expand Down
56 changes: 35 additions & 21 deletions kinode/packages/app_store/app_store/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ const ICON: &str = include_str!("icon");

const CHAIN_ID: u64 = 10; // optimism
const CONTRACT_ADDRESS: &str = "0x52185B6a6017E6f079B994452F234f7C2533787B"; // optimism
const CONTRACT_FIRST_BLOCK: u64 = 118_590_088;

const EVENTS: [&str; 3] = [
"AppRegistered(uint256,string,bytes,string,bytes32)",
Expand Down Expand Up @@ -114,6 +115,7 @@ fn init(our: Address) {
"/apps/:id/caps",
"/apps/:id/mirror",
"/apps/:id/auto-update",
"/apps/rebuild-index",
] {
bind_http_path(path, true, false).expect("failed to bind http path");
}
Expand Down Expand Up @@ -288,7 +290,13 @@ fn handle_message(
return Err(anyhow::anyhow!("http_server from non-local node"));
}
if let HttpServerRequest::Http(req) = incoming {
http_api::handle_http_request(our, &mut state, requested_packages, &req)?;
http_api::handle_http_request(
our,
&mut state,
eth_provider,
requested_packages,
&req,
)?;
}
}
},
Expand Down Expand Up @@ -435,29 +443,35 @@ fn handle_local_request(
true => LocalResponse::AutoUpdateResponse(AutoUpdateResponse::Success),
false => LocalResponse::AutoUpdateResponse(AutoUpdateResponse::Failure),
},
LocalRequest::RebuildIndex => {
*state = State::new(CONTRACT_ADDRESS.to_string()).unwrap();
// kill our old subscription and build a new one.
eth_provider
.unsubscribe(1)
.expect("app_store: failed to unsub from eth events!");

let filter = eth::Filter::new()
.address(eth::Address::from_str(&state.contract_address).unwrap())
.from_block(state.last_saved_block - 1)
.events(EVENTS);

for log in fetch_logs(&eth_provider, &filter) {
if let Err(e) = state.ingest_listings_contract_event(our, log) {
println!("error ingesting log: {e:?}");
};
}
subscribe_to_logs(&eth_provider, filter);
LocalResponse::RebuiltIndex
}
LocalRequest::RebuildIndex => rebuild_index(our, state, eth_provider),
}
}

pub fn rebuild_index(
our: &Address,
state: &mut State,
eth_provider: &eth::Provider,
) -> LocalResponse {
*state = State::new(CONTRACT_ADDRESS.to_string()).unwrap();
// kill our old subscription and build a new one.
eth_provider
.unsubscribe(1)
.expect("app_store: failed to unsub from eth events!");

let filter = eth::Filter::new()
.address(eth::Address::from_str(&state.contract_address).unwrap())
.from_block(state.last_saved_block - 1)
.events(EVENTS);

for log in fetch_logs(&eth_provider, &filter) {
if let Err(e) = state.ingest_listings_contract_event(our, log) {
println!("error ingesting log: {e:?}");
};
}
subscribe_to_logs(&eth_provider, filter);
LocalResponse::RebuiltIndex
}

pub fn start_download(
our: &Address,
requested_packages: &mut HashMap<PackageId, RequestedPackage>,
Expand Down
44 changes: 25 additions & 19 deletions kinode/packages/app_store/app_store/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -95,13 +95,13 @@ pub struct State {
/// we keep the full state of the package manager here, calculated from
/// the listings contract logs. in the future, we'll offload this and
/// only track a certain number of packages...
pub package_hashes: HashMap<PackageId, PackageHash>, // TODO migrate to sqlite db
pub listed_packages: HashMap<PackageHash, PackageListing>, // TODO migrate to sqlite db
pub package_hashes: HashMap<PackageId, PackageHash>,
pub listed_packages: HashMap<PackageHash, PackageListing>,
/// we keep the full state of the packages we have downloaded here.
/// in order to keep this synchronized with our filesystem, we will
/// ingest apps on disk if we have to rebuild our state. this is also
/// updated every time we download, create, or uninstall a package.
pub downloaded_packages: HashMap<PackageId, PackageState>, // TODO migrate to sqlite db
pub downloaded_packages: HashMap<PackageId, PackageState>,
}

impl State {
Expand All @@ -111,7 +111,7 @@ impl State {
crate::print_to_terminal(1, "producing new state");
let mut state = State {
contract_address,
last_saved_block: 1,
last_saved_block: crate::CONTRACT_FIRST_BLOCK,
package_hashes: HashMap::new(),
listed_packages: HashMap::new(),
downloaded_packages: HashMap::new(),
Expand Down Expand Up @@ -371,14 +371,16 @@ impl State {
.ok_or(anyhow::anyhow!("got log with no block number"))?
.try_into()?;

// let package_hash: alloy_primitives::U256 = log.topics[1].into();
// let package_hash = package_hash.to_string();

match log.topics[0] {
match log.topics()[0] {
AppRegistered::SIGNATURE_HASH => {
let package_hash = log.topics[1];
let (package_name, publisher_dnswire, metadata_url, metadata_hash) =
AppRegistered::abi_decode_data(&log.data, true)?;
let package_hash = log.topics()[1];

let app = AppRegistered::decode_log_data(log.data(), false)?;
let package_name = app.packageName;
let publisher_dnswire = app.publisherName;
let metadata_url = app.metadataUrl;
let metadata_hash = app.metadataHash;

let package_hash = package_hash.to_string();
let metadata_hash = metadata_hash.to_string();

Expand All @@ -390,13 +392,14 @@ impl State {
),
);

if generate_package_hash(&package_name, publisher_dnswire.as_slice())
if generate_package_hash(&package_name, publisher_dnswire.to_vec().as_slice())
!= package_hash
{
return Err(anyhow::anyhow!("got log with mismatched package hash"));
}

let Ok(publisher_name) = dnswire_decode(publisher_dnswire.as_slice()) else {
let Ok(publisher_name) = dnswire_decode(publisher_dnswire.to_vec().as_slice())
else {
return Err(anyhow::anyhow!("got log with invalid publisher name"));
};

Expand Down Expand Up @@ -430,9 +433,12 @@ impl State {
self.insert_listing(package_hash, listing);
}
AppMetadataUpdated::SIGNATURE_HASH => {
let package_hash = log.topics[1].to_string();
let (metadata_url, metadata_hash) =
AppMetadataUpdated::abi_decode_data(&log.data, false)?;
let package_hash = log.topics()[1].to_string();

let upd = AppMetadataUpdated::decode_log_data(log.data(), false)?;
let metadata_url = upd.metadataUrl;
let metadata_hash = upd.metadataHash;

let metadata_hash = metadata_hash.to_string();

let current_listing = self
Expand Down Expand Up @@ -484,9 +490,9 @@ impl State {
}
}
Transfer::SIGNATURE_HASH => {
let from = alloy_primitives::Address::from_word(log.topics[1]);
let to = alloy_primitives::Address::from_word(log.topics[2]);
let package_hash = log.topics[3].to_string();
let from = alloy_primitives::Address::from_word(log.topics()[1]);
let to = alloy_primitives::Address::from_word(log.topics()[2]);
let package_hash = log.topics()[3].to_string();

if from == alloy_primitives::Address::ZERO {
match self.get_listing_with_hash_mut(&package_hash) {
Expand Down
2 changes: 1 addition & 1 deletion kinode/packages/app_store/download/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ simulation-mode = []

[dependencies]
anyhow = "1.0"
kinode_process_lib = { git = "https://github.com/kinode-dao/process_lib", tag = "v0.6.1" }
kinode_process_lib = { git = "https://github.com/kinode-dao/process_lib", tag = "v0.7.0" }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
wit-bindgen = "0.24.0"
Expand Down
2 changes: 1 addition & 1 deletion kinode/packages/app_store/ft_worker/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ simulation-mode = []
[dependencies]
anyhow = "1.0"
bincode = "1.3.3"
kinode_process_lib = { git = "https://github.com/kinode-dao/process_lib", tag = "v0.6.1" }
kinode_process_lib = { git = "https://github.com/kinode-dao/process_lib", tag = "v0.7.0" }
rand = "0.8"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
Expand Down
2 changes: 1 addition & 1 deletion kinode/packages/app_store/install/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ simulation-mode = []

[dependencies]
anyhow = "1.0"
kinode_process_lib = { git = "https://github.com/kinode-dao/process_lib", tag = "v0.6.1" }
kinode_process_lib = { git = "https://github.com/kinode-dao/process_lib", tag = "v0.7.0" }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
wit-bindgen = "0.24.0"
Expand Down
4 changes: 2 additions & 2 deletions kinode/packages/app_store/metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
"image": "",
"properties": {
"package_name": "app_store",
"current_version": "0.3.0",
"current_version": "0.3.1",
"publisher": "sys",
"mirrors": [],
"code_hashes": {
"0.3.0": ""
"0.3.1": ""
}
},
"external_url": "https://kinode.org",
Expand Down
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading