Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: allow register CLI to create a public register writable to anyone #1142

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
291 changes: 165 additions & 126 deletions .github/workflows/merge.yml

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions sn_cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ serde = { version = "1.0.133", features = [ "derive"]}
sn_build_info = { path="../sn_build_info", version = "0.1.4" }
sn_client = { path = "../sn_client", version = "0.99.39" }
sn_transfers = { path = "../sn_transfers", version = "0.14.32" }
sn_registers = { path = "../sn_registers", version = "0.3.6" }
sn_logging = { path = "../sn_logging", version = "0.2.16" }
sn_peers_acquisition= { path="../sn_peers_acquisition", version = "0.1.13" }
sn_protocol = { path = "../sn_protocol", version = "0.10.1" }
Expand Down
28 changes: 19 additions & 9 deletions sn_cli/src/subcommands/register.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ use clap::Subcommand;
use color_eyre::{eyre::WrapErr, Result, Section};
use sn_client::{Client, Error as ClientError, WalletClient};
use sn_protocol::storage::RegisterAddress;
use sn_registers::Permissions;
use sn_transfers::LocalWallet;
use std::path::Path;
use xor_name::XorName;
Expand All @@ -23,6 +24,11 @@ pub enum RegisterCmds {
/// This is used along with your public key to derive the address of the register
#[clap(name = "name", short = 'n')]
name: String,

/// Create the register with public write access.
/// By default only the owner can write to the register.
#[clap(name = "public", short = 'p')]
public: bool,
},
Edit {
/// The address of the register to edit.
Expand Down Expand Up @@ -56,8 +62,8 @@ pub(crate) async fn register_cmds(
verify_store: bool,
) -> Result<()> {
match cmds {
RegisterCmds::Create { name } => {
create_register(name, client, root_dir, verify_store).await?
RegisterCmds::Create { name, public } => {
create_register(name, public, client, root_dir, verify_store).await?
}
RegisterCmds::Edit {
address,
Expand All @@ -74,6 +80,7 @@ pub(crate) async fn register_cmds(

async fn create_register(
name: String,
public: bool,
client: &Client,
root_dir: &Path,
verify_store: bool,
Expand All @@ -88,21 +95,24 @@ async fn create_register(
let mut wallet_client = WalletClient::new(client.clone(), wallet);

let meta = XorName::from_content(name.as_bytes());
let perms = match public {
true => Permissions::new_anyone_can_write(),
false => Permissions::new_owner_only(),
};
let (register, storage_cost, royalties_fees) = client
.create_and_pay_for_register(meta, &mut wallet_client, verify_store)
.create_and_pay_for_register(meta, &mut wallet_client, verify_store, perms)
.await?;

if storage_cost.is_zero() {
println!(
"Register '{name}' already exists at {}!",
register.address().to_hex()
);
println!("Register '{name}' already exists!",);
} else {
println!(
"Successfully created register '{name}' at {} for {storage_cost:?} (royalties fees: {royalties_fees:?})!",
register.address().to_hex()
"Successfully created register '{name}' for {storage_cost:?} (royalties fees: {royalties_fees:?})!",
);
}

println!("Address={}", register.address().to_hex());

Ok(())
}

Expand Down
24 changes: 18 additions & 6 deletions sn_client/src/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ use sn_protocol::{
},
NetworkAddress, PrettyPrintRecordKey,
};
use sn_registers::SignedRegister;
use sn_registers::{Permissions, SignedRegister};
use sn_transfers::{CashNote, CashNoteRedemption, MainPubkey, NanoTokens, Payment, SignedSpend};
use std::{
collections::{HashMap, HashSet},
Expand Down Expand Up @@ -342,10 +342,17 @@ impl Client {
address: XorName,
wallet_client: &mut WalletClient,
verify_store: bool,
perms: Permissions,
) -> Result<(ClientRegister, NanoTokens, NanoTokens)> {
info!("Instantiating a new Register replica with address {address:?}");
let (reg, mut total_cost, mut total_royalties) =
ClientRegister::create_online(self.clone(), address, wallet_client, false).await?;
let (reg, mut total_cost, mut total_royalties) = ClientRegister::create_online(
self.clone(),
address,
wallet_client,
false,
perms.clone(),
)
.await?;

debug!("{address:?} Created in theorryyyyy");
let reg_address = reg.address();
Expand All @@ -356,9 +363,14 @@ impl Client {
while !stored {
info!("Register not completely stored on the network yet. Retrying...");
// this verify store call here ensures we get the record from Quorum::all
let (reg, top_up_cost, royalties_top_up) =
ClientRegister::create_online(self.clone(), address, wallet_client, true)
.await?;
let (reg, top_up_cost, royalties_top_up) = ClientRegister::create_online(
self.clone(),
address,
wallet_client,
true,
perms.clone(),
)
.await?;
let reg_address = reg.address();

total_cost = total_cost
Expand Down
16 changes: 2 additions & 14 deletions sn_client/src/register.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,27 +53,15 @@ impl ClientRegister {
Self::create_register(client, meta, Permissions::new_owner_only())
}

/// Create a new public Register (Anybody can write to it) and send it so the Network.
/// This will optionally verify the Register was stored on the network.
pub async fn create_public_online(
client: Client,
meta: XorName,
wallet_client: &mut WalletClient,
verify_store: bool,
) -> Result<Self> {
let mut reg = Self::create_register(client, meta, Permissions::new_anyone_can_write())?;
reg.sync(wallet_client, verify_store).await?;
Ok(reg)
}

/// Create a new Register and send it to the Network.
pub async fn create_online(
client: Client,
meta: XorName,
wallet_client: &mut WalletClient,
verify_store: bool,
perms: Permissions,
) -> Result<(Self, NanoTokens, NanoTokens)> {
let mut reg = Self::create_register(client, meta, Permissions::new_owner_only())?;
let mut reg = Self::create_register(client, meta, perms)?;
let (storage_cost, royalties_fees) = reg.sync(wallet_client, verify_store).await?;
Ok((reg, storage_cost, royalties_fees))
}
Expand Down
9 changes: 7 additions & 2 deletions sn_node/examples/registers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
// permissions and limitations relating to use of the SAFE Network Software.

use sn_client::{Client, Error, WalletClient};
use sn_registers::RegisterAddress;
use sn_registers::{Permissions, RegisterAddress};
use sn_transfers::LocalWallet;
use xor_name::XorName;

Expand Down Expand Up @@ -77,7 +77,12 @@ async fn main() -> Result<()> {
Err(_) => {
println!("Register '{reg_nickname}' not found, creating it at {address}");
let (register, _cost, _royalties_fees) = client
.create_and_pay_for_register(meta, &mut wallet_client, true)
.create_and_pay_for_register(
meta,
&mut wallet_client,
true,
Permissions::new_anyone_can_write(),
)
.await?;

register
Expand Down
8 changes: 7 additions & 1 deletion sn_node/tests/data_with_churn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ use sn_protocol::{
storage::{ChunkAddress, RegisterAddress, SpendAddress},
NetworkAddress,
};
use sn_registers::Permissions;
use sn_transfers::LocalWallet;
use sn_transfers::{CashNote, MainSecretKey, NanoTokens};
use std::{
Expand Down Expand Up @@ -349,7 +350,12 @@ fn create_registers_task(
sleep(delay).await;

match client
.create_and_pay_for_register(meta, &mut wallet_client, true)
.create_and_pay_for_register(
meta,
&mut wallet_client,
true,
Permissions::new_owner_only(),
)
.await
{
Ok(_) => content
Expand Down
15 changes: 13 additions & 2 deletions sn_node/tests/nodes_rewards.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ use sn_protocol::safenode_proto::{
safe_node_client::SafeNodeClient, GossipsubSubscribeRequest, NodeEventsRequest,
TransferNotifsFilterRequest,
};
use sn_registers::Permissions;
use sn_transfers::{
CashNoteRedemption, LocalWallet, MainSecretKey, NanoTokens, NETWORK_ROYALTIES_PK,
};
Expand Down Expand Up @@ -84,7 +85,12 @@ async fn nodes_rewards_for_storing_registers() -> Result<()> {
let prev_rewards_balance = current_rewards_balance()?;

let (_register, storage_cost, _royalties_fees) = client
.create_and_pay_for_register(register_addr, &mut wallet_client, false)
.create_and_pay_for_register(
register_addr,
&mut wallet_client,
false,
Permissions::new_owner_only(),
)
.await?;
println!("Cost is {storage_cost:?}: {prev_rewards_balance:?}");

Expand Down Expand Up @@ -155,7 +161,12 @@ async fn nodes_rewards_for_register_notifs_over_gossipsub() -> Result<()> {

println!("Paying for random Register address {register_addr:?} ...");
let (_, storage_cost, royalties_fees) = client
.create_and_pay_for_register(register_addr, &mut wallet_client, false)
.create_and_pay_for_register(
register_addr,
&mut wallet_client,
false,
Permissions::new_owner_only(),
)
.await?;
println!("Random Register created, paid {storage_cost}/{royalties_fees}");

Expand Down
15 changes: 13 additions & 2 deletions sn_node/tests/storage_payments.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ use sn_protocol::{
storage::{ChunkAddress, RegisterAddress},
NetworkAddress,
};
use sn_registers::Permissions;
use sn_transfers::{MainPubkey, NanoTokens, PaymentQuote};
use std::collections::BTreeMap;
use tokio::time::{sleep, Duration};
Expand Down Expand Up @@ -283,7 +284,12 @@ async fn storage_payment_register_creation_succeeds() -> Result<()> {
.await?;

let (mut register, _cost, _royalties_fees) = client
.create_and_pay_for_register(xor_name, &mut wallet_client, true)
.create_and_pay_for_register(
xor_name,
&mut wallet_client,
true,
Permissions::new_owner_only(),
)
.await?;

let retrieved_reg = client.get_register(address).await?;
Expand Down Expand Up @@ -337,7 +343,12 @@ async fn storage_payment_register_creation_and_mutation_fails() -> Result<()> {

// this should fail to store as the amount paid is not enough
let (mut register, _cost, _royalties_fees) = client
.create_and_pay_for_register(xor_name, &mut wallet_client, false)
.create_and_pay_for_register(
xor_name,
&mut wallet_client,
false,
Permissions::new_owner_only(),
)
.await?;

sleep(Duration::from_secs(5)).await;
Expand Down