1. 引言

前序博客有:

Mina系列博客有:

Mina基于Pasta曲线实现了相应的Schnorr signature。

Mina中采用Schnorr签名对支付交易 和 质押委托交易进行签名的代码示例有:

Mina Schnorr签名模块实现有:

2. Mina中的Schnorr signature实现

Mina中的Schnorr签名方案不同于Bitcoin的Schnorr signature方案,Bitcoin的签名结果为 ( R , s ) (R,s) (R,s),而Mina的签名结果为 ( R . x , s ) (R.x, s) (R.x,s)。其中 R ∈ G , R . x ∈ F p , s ∈ F r R\in \mathbb{G},R.x\in \mathbb{F}_p, s\in\mathbb{F}_r RG,R.xFp,sFr G \mathbb{G} G为group point, F p \mathbb{F}_p Fp为base field, F r \mathbb{F}_r Fr为scalar field。

Mina中的Schnoor签名方案见Mina Schnorr Signatures
Mina Schnorr签名流程:

  • Input:
    • Secret key d: an integer in the range 1..n-1
    • Public key P: a curve point
    • Message m: message to be signed
    • Network id id: blockchain instance identifier
  • To sign m for public key P = dG:
    • Let k = derive_nonce(d, P, m, id)
    • Let R = [k]G
    • If odd(y(R)) then negate(k)
    • Let e = message_hash(P, x(R), m, id)
    • Let s = k + e*d
  • The signature σ = (x(R), s)

Mina Schnorr验签流程:

  • Input:
    • Public key P: a curve point
    • Message m: message
    • Signature σ: signature on m
    • Network id id: blockchain instance identifier
  • The signature is valid if and only if the algorithm below does not fail.
    • Let e = message_hash(P, x(R), m, id)
    • Let R = [s(σ)]G - [e]P
    • Fail if infinite(R) OR odd(y(R)) OR x(R) != x(σ)

实际代码实现时,根据不同的network id设置了不同的derive_nonce派生实现:

let derive =
      let open Mina_signature_kind in
      match signature_kind with
      | None ->
          Message.derive
      | Some Mainnet ->
          Message.derive_for_mainnet
      | Some Testnet ->
          Message.derive_for_testnet

参考资料

[1] Mina Schnorr Signatures

附录1. Mina系列博客

Mina系列博客有:

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐