-
Notifications
You must be signed in to change notification settings - Fork 15
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
base: main
Are you sure you want to change the base?
Conversation
❌ 1 Tests Failed:
View the top 1 failed tests by shortest run time
To view more test analytics, go to the Test Analytics Dashboard |
hydentity_cf: Vec<(IdentityAction, Password, BlobIndex)>, | ||
hyllar_cf: Vec<(ERC20Action, ContractName, BlobIndex)>, | ||
staking_cf: Vec<(StakingAction, BlobIndex)>, |
There was a problem hiding this comment.
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 😄
There was a problem hiding this comment.
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(), |
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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 ?
There was a problem hiding this comment.
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é>
There was a problem hiding this comment.
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 :)
There was a problem hiding this comment.
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 ?
There was a problem hiding this comment.
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é
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
}) | ||
} | ||
|
||
pub fn stake(&mut self, staker: Identity, amount: u128) -> Result<String, String> { |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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() { |
There was a problem hiding this comment.
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à ?
There was a problem hiding this comment.
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
let TransactionData::RegisterContract(register_contract_transaction) = contract.transaction_data else { | ||
continue; | ||
}; |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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 ^^
There was a problem hiding this comment.
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, | ||
} |
There was a problem hiding this comment.
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)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💯
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(), | ||
) | ||
}) | ||
} | ||
} |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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"); |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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
There was a problem hiding this 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.
No description provided.