mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-31 01:41:03 +00:00
Implemented seal_ecdsa_recovery function in the contract pallet (#9686)
* Implemented `seal_ecdsa_recovery` function in the contract pallet. Added benchmark and unit test. * Run `cargo fmt` * Skip fmt for slices * Changes according comments in pull request. * Fix build without `unstable-interface` feature * Applied suggestion from the review * Apply suggestions from code review Co-authored-by: Alexander Theißen <alex.theissen@me.com> * Apply suggestions from code review Co-authored-by: Alexander Theißen <alex.theissen@me.com> * Changed RecoveryFailed to EcdsaRecoverFailed * Manually updated weights.rs * Apply suggestions from code review Co-authored-by: Michael Müller <mich@elmueller.net> Co-authored-by: Alexander Theißen <alex.theissen@me.com> Co-authored-by: Michael Müller <mich@elmueller.net>
This commit is contained in:
committed by
GitHub
parent
110ba540ec
commit
a36e881783
@@ -0,0 +1,55 @@
|
||||
;; This contract:
|
||||
;; 1) Reads signature and message hash from the input
|
||||
;; 2) Calls ecdsa_recover
|
||||
;; 3) Validates that result is Success
|
||||
;; 4) Returns recovered compressed public key
|
||||
(module
|
||||
(import "__unstable__" "seal_ecdsa_recover" (func $seal_ecdsa_recover (param i32 i32 i32) (result i32)))
|
||||
(import "seal0" "seal_return" (func $seal_return (param i32 i32 i32)))
|
||||
(import "seal0" "seal_input" (func $seal_input (param i32 i32)))
|
||||
(import "env" "memory" (memory 1 1))
|
||||
|
||||
(func $assert (param i32)
|
||||
(block $ok
|
||||
(br_if $ok
|
||||
(get_local 0)
|
||||
)
|
||||
(unreachable)
|
||||
)
|
||||
)
|
||||
|
||||
(func (export "deploy"))
|
||||
|
||||
;; [4, 8) len of signature + message hash - 65 bytes + 32 byte = 97 bytes
|
||||
(data (i32.const 4) "\61")
|
||||
|
||||
;; Memory layout during `call`
|
||||
;; [10, 75) signature
|
||||
;; [75, 107) message hash
|
||||
(func (export "call")
|
||||
(local $signature_ptr i32)
|
||||
(local $message_hash_ptr i32)
|
||||
(local $result i32)
|
||||
(local.set $signature_ptr (i32.const 10))
|
||||
(local.set $message_hash_ptr (i32.const 75))
|
||||
;; Read signature and message hash - 97 bytes
|
||||
(call $seal_input (local.get $signature_ptr) (i32.const 4))
|
||||
(local.set
|
||||
$result
|
||||
(call $seal_ecdsa_recover
|
||||
(local.get $signature_ptr)
|
||||
(local.get $message_hash_ptr)
|
||||
(local.get $signature_ptr) ;; Store output into message signature ptr, because we don't need it anymore
|
||||
)
|
||||
)
|
||||
(call $assert
|
||||
(i32.eq
|
||||
(local.get $result) ;; The result of recovery execution
|
||||
(i32.const 0x0) ;; 0x0 - Success result
|
||||
)
|
||||
)
|
||||
|
||||
;; exit with success and return recovered public key
|
||||
(call $seal_return (i32.const 0) (local.get $signature_ptr) (i32.const 33))
|
||||
)
|
||||
)
|
||||
Reference in New Issue
Block a user