-
Notifications
You must be signed in to change notification settings - Fork 1.7k
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
Implement extra args codec #16016
base: solana-offchain-plugin
Are you sure you want to change the base?
Implement extra args codec #16016
Conversation
Flakeguard SummaryRan new or updated tests between View Flaky Detector Details | Compare Changes Found Flaky Tests ❌
ArtifactsFor detailed logs of the failed tests, please refer to the artifact failed-test-results-with-logs.json. |
AER Report: CI Core ran successfully ✅AER Report: Operator UI CI ran successfully ✅ |
@@ -43,6 +50,61 @@ func decodeExtraArgsV1V2(extraArgs []byte) (gasLimit *big.Int, err error) { | |||
return ifaces[0].(*big.Int), nil | |||
} | |||
|
|||
func decodeExtraArgsSVMV1(extraArgs []byte) (*message_hasher.ClientSVMExtraArgsV1, error) { |
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 a method to decode from an EVM source chain right?
EVMExtraArgsKey: gas, | ||
}, nil | ||
|
||
case chainsel.FamilySolana: |
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.
The switch on family here is on the source chain selector, meaning this case applies when source was Solana chain.
Thus decoding this requires Solana decoder.
But the implementation is using EVM decoder.
Flakeguard SummaryRan new or updated tests between View Flaky Detector Details | Compare Changes Found Flaky Tests ❌
ArtifactsFor detailed logs of the failed tests, please refer to the artifact failed-test-results-with-logs.json. |
case chainsel.FamilyEVM: | ||
gas, err1 := decodeExtraArgsV1V2(extraArgs) | ||
if err1 != nil { | ||
return nil, fmt.Errorf("failed to decode EVM extra data, %w", err) | ||
} | ||
|
||
return map[string]any{ | ||
EVMExtraArgsKey: gas, | ||
}, nil |
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'd be tempted to do some minor refactoring here so you can write it like this:
case chainsel.FamilyEVM: | |
gas, err1 := decodeExtraArgsV1V2(extraArgs) | |
if err1 != nil { | |
return nil, fmt.Errorf("failed to decode EVM extra data, %w", err) | |
} | |
return map[string]any{ | |
EVMExtraArgsKey: gas, | |
}, nil | |
case chainsel.FamilyEVM: | |
return decodeExtraArgsV1V2(extraArgs) |
Maybe even some moderate refactoring to avoid having SVM code in the EVM package.
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.
decodeExtraArgsV1V2
returns *big.int
. The return type needs to be map[string]any
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.
The way I understand, the SVMExtraArgsv1 is defined for EVM onchain, and requires abi decoding, which is all EVM
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.
Yes, I said there would be minor refactoring.
Flakeguard SummaryRan new or updated tests between View Flaky Detector Details | Compare Changes Found Flaky Tests ❌
ArtifactsFor detailed logs of the failed tests, please refer to the artifact failed-test-results-with-logs.json. |
@@ -55,20 +55,26 @@ func DecodeExtraArgsToMap(extraArgs []byte) (map[string]any, error) { | |||
} | |||
|
|||
var method string | |||
var extraByteOffset int | |||
// for EVMExtraArgs, the first four bytes is the method name | |||
// for SVMExtraArgs there's the four bytes plus another 32 bytes padding for the dynamic array |
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.
nit: move these comments to the actual case block where you set extraByteOffset
func (ExtraArgsCodec) DecodeExtraData(extraArgs cciptypes.Bytes, sourceChainSelector cciptypes.ChainSelector) (map[string]any, error) { | ||
family, err := chainsel.GetSelectorFamily(uint64(sourceChainSelector)) | ||
if err != nil { | ||
return nil, fmt.Errorf("failed to get chain family for selector %d: %w", sourceChainSelector, err) | ||
} | ||
|
||
switch family { | ||
case chainsel.FamilyEVM: | ||
return ccipevm.DecodeExtraArgsToMap(extraArgs) | ||
|
||
case chainsel.FamilySolana: | ||
return ccipsolana.DecodeExtraArgsToMap(extraArgs) | ||
|
||
default: | ||
return nil, fmt.Errorf("unsupported family for extra args type %s", family) | ||
} | ||
} |
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.
Nice 👍
case string(svmExtraArgsV1Tag): | ||
// for SVMExtraArgs there's the four bytes plus another 32 bytes padding for the dynamic array | ||
method = svmV1DecodeName | ||
extraByteOffset = 36 |
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 believe this is no longer needed because common would call the Solana version of this function directly.
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 for the case when source chain is EVM, and we need ABI decoding instead of Borsh
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.
Could you add some comments with pointers to the onchain code? i.e. something like we've done here.
// DecodeExtraArgsToMap is a helper function for converting Borsh encoded extra args bytes into map[string]any, which will be saved in ocr report.message.ExtraArgsDecoded | ||
func DecodeExtraArgsToMap(extraArgs []byte) (map[string]any, error) { |
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.
Previously, the EVM version had this comment and a special offset. What happened to it?
case string(svmExtraArgsV1Tag):
// for SVMExtraArgs there's the four bytes plus another 32 bytes padding for the dynamic array
method = svmV1DecodeName
extraByteOffset = 36
@@ -20,6 +20,10 @@ import ( | |||
|
|||
ccipcommon "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common" | |||
|
|||
<<<<<<< HEAD |
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.
Merge conflicts need resolving.
// for SVMExtraArgs there's the four bytes plus another 32 bytes padding for the dynamic array | ||
// https://github.com/smartcontractkit/chainlink/blob/33c0bda696b0ed97f587a46eacd5c65bed9fb2c1/contracts/src/v0.8/ccip/libraries/Client.sol#L57 | ||
method = svmV1DecodeName | ||
extraByteOffset = 36 |
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 still don't see why this is 36 instead of 4. It looks like it's encoded the same way as EVM args are encoded: https://github.com/smartcontractkit/chainlink/blob/33c0bda696b0ed97f587a46eacd5c65bed9fb2c1/contracts/src/v0.8/ccip/libraries/Client.sol#L74C35-L74C62
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.
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.
Could we rename or move these functions related to decoding to appropriately named files?
helpers.go seems like a bad place.
Maybe call them extradatadecoder.go
Quality Gate passedIssues Measures |
Jira
extra args codec for OCR message. Convert []byte into map[string]any format depends on the source chain.