-
Notifications
You must be signed in to change notification settings - Fork 5.4k
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
Update EIP-191: Improve Comprehensibility #5804
Conversation
Hi! I'm a bot, and I wanted to automerge your PR, but couldn't because of the following issue(s): (fail) eip-191.md
|
I know this is an old standard and missing some sections, I am happy to add them. |
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.
Looks good to me, aside from one nitpick
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.
LGTM
EIPS/eip-191.md
Outdated
function submitTransactionPreSigned(address destination, uint value, bytes data, uint nonce, uint8 v, bytes32 r, bytes32 s) | ||
public | ||
returns (bytes32 transactionHash) | ||
{ | ||
function signatureBasedExecution(address target, uint256 nonce, bytes memory payload, bytes memory signature) | ||
public payable { | ||
|
||
// Arguments when calculating hash to validate | ||
// 1: byte(0x19) - the initial 0x19 byte | ||
// 2: byte(0) - the version byte | ||
// 3: this - the validator address | ||
// 4-7 : Application specific data | ||
transactionHash = keccak256(abi.encodePacked(byte(0x19),byte(0),address(this),destination, value, data, nonce)); | ||
sender = ecrecover(transactionHash, v, r, s); | ||
// ... | ||
// 3: address(this) - the validator address | ||
// 4-6 : Application specific data | ||
|
||
bytes32 hash = keccak256(abi.encodePacked(byte(0x19), byte(0), address(this), msg.value, nonce, payload)); | ||
|
||
// recovering the signer from the hash and the signature | ||
addressRecovered = ECDSA.recover(hash, signature); | ||
|
||
// logic of the wallet | ||
if (addressRecovered == owner) executeOnTarget(target,payload); |
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.
This is not the minimal change required to fix errata. Since this is a final EIP, we only allow clarifications and correcting errors. The minimal change would likely be just changing the 7 to a 6, unless there's something else I missed.
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.
I see your point @SamWilsn , I will revert the OZ integration and keep plain ecrecover
but what if the example is not clear ? Just for the sake of backwards compatibility we leave it like this ? (Knowing that no one will use this code snippet)
The name of the function IMO is not perfect, the same for the naming of variables, as it's not a TransactionPreSigned
or a transactionHash
, it's a signed message and hash of a signed message. This whole standard was created to find a standard way to differentiate between signed transactions and signed messages and here the naming is super confusing.
Also the example show how to sign but doesn't give info about what's the possibilities when signing the message. It's just like showing someone a fish hook but not teaching them how to start fishing 😄
I would find a balance between your suggestions and mine like that:
- Reverted the OZ integration
- Made the new logic as a comment just to emphasize on how this signed message could be used
- Made change to the naming of the function and variables
function signatureBasedExecution(address target, uint256 nonce, bytes memory payload, uint8 v, bytes32 r, bytes32 s) public payable {
// Arguments when calculating hash to validate
// 1: byte(0x19) - the initial 0x19 byte
// 2: byte(0) - the version byte
// 3: address(this) - the validator address
// 4-6 : Application specific data
bytes32 hash = keccak256(abi.encodePacked(byte(0x19), byte(0), address(this), msg.value, nonce, payload));
// recovering the signer from the hash and the signature
addressRecovered = ecrecover(hash, v, r, s);
// logic of the wallet
// if (addressRecovered == owner) executeOnTarget(target, payload);
}
Please let me know what do you think 😄 🙏
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.
I think you can go ahead and make this change to the PR. This version is a smaller change.
This comment was marked as spam.
This comment was marked as spam.
Head branch was pushed to by a user without write access
Co-authored-by: Pandapip1 <45835846+Pandapip1@users.noreply.github.com>
0f462d1
@SamWilsn @Pandapip1 Applied the changes 👍 |
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 line 39, ERC needs to be changed to EIP. On line 35, the external link needs to be removed.
@Pandapip1 Done 👍 |
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.
+1 from me. Will need manual merge.
#### Version `0x00` | ||
|
||
``` | ||
0x19 <0x00> <intended validator address> <data to sign> |
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.
Wait, I must be missing something here, are we adding the <0x00> <intended validator address>
to the original EIP-191?
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.
@xinbenlv The version 0x00
was always there in the standard from the start, but it was not explained very well, and that's one of the purposes of the PR
|
||
#### Version `0x01` | ||
|
||
The version `0x01` is for structured data as defined in [EIP-712] |
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.
QQ: Should we mention anything about the EIP-712 "domain" besides the "structured data" here?
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.
What does this PR introduce?
- The formula for the standard
- Why we have 0x19
- What are the different bytes version we have
E
is version0x45
andthereum Signed Message:\n" + len(message)
is version specific data.