In the account abstraction of 4337, in order to prevent replay attacks, a nonce variable is introduced into the AA wallet contract, which must be updated every time Tx is executed, thereby increasing the Gas overhead
StateHash, RecrusiveStateHash iterative maintenance process
Prove process circom syntax description:
signal input UserAddress[N];
signal input CurUserNonce[N];
signal input CurRecrusiveStateHash;
signal input PreRecrusiveStateHash;
signal input CurStateHash;
signal input NewUserNonce[N];
signal output NewRecrusiveStateHash;
signal output NewStateHash;
signal output PubCurStateHash;
signal output PubCurRecrusiveStateHash;
assert(MerkelHash(CurUserNonce[N]) == CurHash);
assert(Hash(PreRecrusiveStateHash, CurHash) == CurRecrusiveStateHash);
for(var i = 0; i < N;i ++) {
assert(CurUserNonce[i] + 1 == NewUserNonce[i]);
}
NewStateHash <== MerkelHash(NewUserNonce[N]);
NewRecrusiveStateHash <== Hash(CurRecrusiveStateHash, NewStateHash);
PubCurStateHash <== MerkleHash(CurUserNonce[N]);
PubCurRecrusiveStateHash <== CurRecrusiveStateHash;
Prove results:
ProofData;
PublicInputs:{
NewStateHash,
NewRecrusiveStateHash,
PubCurStateHash,
PubCurRecrusiveStateHash,
}
The process of updating the status after Verify (EVM environment):
require(Verify(ProofData,PublicInputs)==True);
require(self.CurStateHash == PublicInputs.PubCurStateHash);
require(self.CurRecrusiveStateHash == PublicInputs.PubCurRecrusiveStateHash);
self.CurStateHash = PublicInputs.NewStateHash;
self.CurRecrusiveStateHash = PublicInputs.PubCurRecrusiveStateHash;