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

✨ New Staking Contract #453

Open
wants to merge 17 commits into
base: main
Choose a base branch
from
Open

✨ New Staking Contract #453

wants to merge 17 commits into from

Conversation

BertrandD
Copy link
Contributor

No description provided.

Copy link

codecov bot commented Dec 13, 2024

❌ 1 Tests Failed:

Tests completed Failed Passed Skipped
158 1 157 0
View the top 1 failed tests by shortest run time
hyle::consensus_tests e2e_consensus::can_rejoin
Stack Traces | 32.4s run time
Error: deadline has elapsed

To view more test analytics, go to the Test Analytics Dashboard
📢 Thoughts on this report? Let us know!

src/consensus.rs Outdated Show resolved Hide resolved
Comment on lines +56 to +58
hydentity_cf: Vec<(IdentityAction, Password, BlobIndex)>,
hyllar_cf: Vec<(ERC20Action, ContractName, BlobIndex)>,
staking_cf: Vec<(StakingAction, BlobIndex)>,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

c'est pour quoi les _cf ? je vois pas 😄

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

c'est un résidu de hyrun où j'avais appelé ces XXXActions des "call_functions" abbrégés en "cf"

https://github.com/Hyle-org/hyle/blob/main/crates/hyrun/src/lib.rs#L183

let mut contract = StakingContract::new(
ExecutionContext {
callees_blobs: vec![].into(),
caller: self.identity.clone(),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OPT: je pense que c'est pas nécessaire de mettre un caller non?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

je comprends pas, tu voudrais que je mette quoi ?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rien !
Par défaut si on met rien on vérifie que pour l'identité id.<nom_de_contract_d'identité> il y a un blob pour le contract <nom_de_contract_d'identité>

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ici, c'est une "copie" de ce qui ce passe dans le guest. C'est un petit tricks pour réussir à générer le même state que si on passait par le prover. Je passe pas par les blobs, j'execute le code du contrat en "natif", il n'y a pas de verification d'identité là, je cherche juste à re-générer le même state, car on-chain on a que le hash. J'ai besoin de build le vrai "next_state" pour pouvoir itérer sur mon builder....

FYI: ExecutionContext est défini comme ça:

pub struct ExecutionContext {
    pub callees_blobs: RefCell<Vec<Blob>>,
    pub caller: Identity,
}

j'ai pas le choix de passer un caller, et c'est tout à fait normal :)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pas certain de la viabilité du truc, mais on peut pas passer par les indexers ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mais on peut pas passer par les indexers ?

Non, ici on est pré-genesis quand on s'en sert, donc les indexers ne nous sont d'aucune utilité

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

le builder il sert à construire une transaction pouvant contenir autant de blobs qu'on veut dedans (pour le même contract_name), il permet de build les blobs+proofs de manière cohérente en connaissant chaque state intermédiaire au sein de la blobTx.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l'indexer ne peut pas aider pour ça

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

En soit la logique de "process le state d'une TX pour obtenir le state intermédiaire" c'est la logique des indexer, ce que je me demandais c'est s'il y avait pas un peu d'overlap fonctionnel entre les deux. Mais ça mérite clairement plus de réflexion.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oui clairement il y a un overlap entre le TransactionBuilder et le ContractStateIndexer oui, j'aimerais réussir à rassembler les deux un jour

@BertrandD BertrandD marked this pull request as ready for review December 19, 2024 15:48
})
}

pub fn stake(&mut self, staker: Identity, amount: u128) -> Result<String, String> {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

les Result<String, String> dans le code rust de la node c'est pas idéal, idéalement on trouverait une solution plus élégante

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ici on est dans le code du contract

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ici on est dans le code du contract

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C'est appelé aussi depuis la node non ?

self.unsettled_transactions.add(UnsettledBlobTransaction {
identity: tx.identity.clone(),
hash: blob_tx_hash.clone(),
blobs_hash,
blobs,
});

for blob in tx.blobs.clone() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On a besoin du clone là ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

à cause de l'argument "blobs" de:

pub fn parse_structured_blob<Parameters>(blobs: &[Blob], index: &BlobIndex) -> StructuredBlob<Parameters>

oui

Comment on lines +213 to +215
let TransactionData::RegisterContract(register_contract_transaction) = contract.transaction_data else {
continue;
};
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remarque: dans ce cas particulier je pense le if let fait bien le café mais no need to change

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

le if let ajoute un niveau de tabulation de plus, c'est pour ça que j'ai fait ça comme ça ^^

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oui en général je suis pas contre mais je sais pas si on gagne vraiment en lisibilité là :P

pub hyllar: HyllarToken,
pub hydentity: Hydentity,
pub staking: Staking,
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RQ générale sur ce fichier: c'est très clean, mais c'est assez hardcodé, je pense que faire un système un poil plus générique serait cool dans le futur (mais clairement ça demande un peu de boulot de design pour faire quelque chose qui a du sens)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💯

Comment on lines +265 to +282
pub fn iter_prove<'a>(
&'a self,
) -> impl Iterator<
Item = (
Pin<Box<dyn std::future::Future<Output = Result<ProofData>> + Send + 'a>>,
ContractName,
),
> + 'a {
self.runners.iter().map(|runner| {
let future = runner.prove();
(
Box::pin(future)
as Pin<Box<dyn std::future::Future<Output = Result<ProofData>> + Send + 'a>>,
runner.contract_name.clone(),
)
})
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Il te renvoie pas les preuves dans l'ordre de complétion si? Ou il y a de la magie que je ne suis pas. Tel que je lis le code là si on a 3 preuves et qu'elle finisse dans l'ordre on y gagne, mais sinon c'est équivalent à juste attendre les 3.

Tokio a des JoinSet qui exposent une API similaire: https://docs.rs/tokio/latest/tokio/task/struct.JoinSet.html

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cette fonction retourne juste un itérateur, donc si à chaque itération de la boucle tu .await sur la future, en effet tu gagnes rien de plus qu'attendre les 3. Tu gagnes juste que tu peux send les proof au fure et à mesure, plutôt que toutes d'un coup.

Mais, l'utilisateur de cette fonction peut tout à fait itérer là dessus et await toutes les futures en parallèle

@@ -84,6 +84,8 @@ impl E2ECtx {
}

pub async fn new_single(slot_duration: u64) -> Result<E2ECtx> {
std::env::set_var("RISC0_DEV_MODE", "1");
Copy link
Member

@wraitii wraitii Dec 20, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pas obvious pour moi pourquoi on a besoin de set ça ici, on le set dans proof_gen et dans TestProcess

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

le TransactionBuilder n'utilise pas les proof_gen, et peut être utilisé dans n'importe quel test

Copy link
Member

@wraitii wraitii left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Globalement je pense que c'est good to go, j'ai quelques remarques qui me paraissent utile à lire mais en soit rien qui nécessite un changement.

Le transaction_builder est une bonne base mais à étendre avec un boulot de design d'API pour faire un truc flexible et puissant.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants