7. Proof of Stake
Proof of Stake
トークン保有量に⽐例したブロック⽣成権
Proof of Work のようなマイニング資源を必要としない
Tezos の LPoS: 「ベーキング」
Rasberry Pi 4 でさえ可能
⽣成権を委託し報酬を得ることもできる
⼿数料が⾼騰しない
15. SCaml
SCaml
マルチシグコントラクト in SCaml
普通に副作⽤のないOCamlのコード。
open SCaml
type storage =
{ stored_counter : nat
; threshold : nat
; keys : key list
}
type parameter =
{ payload : payload
; sigs : signature option list
}
and payload =
{ counter : nat
; action : action
}
and action =
| T f f t f
29. 楕円曲線
楕円曲線
楕円曲線上の格⼦点を「数」(素体 )として使
う
整数 と の⽣成元 から点 は簡単に計
算できるが、 から を計算するのは困難。
双線形写像
⼆つの楕円曲線上の点を取る「都合のいい」関数
係数を左右に振り替えることができる。ペアリング検査
G
a G P aP
aP a
e(aP , bQ)
e(aP , bQ) = e(P , Q)
ab
33. BLS12-381 による署名検査
BLS12-381 による署名検査
チェーンは検査に特化している。データ作成の便利な命令はない。
本来はオフチェーンでやるべきこと。
open SCaml
open BLS12_381
let [@entry] main _param _storage =
let g1_one (* G1 の⽣成元 P *) = G1Bytes
"0x17f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e8
in
let g2_one (* G2 の⽣成元 Q *) = G2Bytes
"0x13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf1
in
let s (* 秘密鍵 *) = FrBytes "0x012345" in
let p (* 公開鍵 = sP *) = let open G1 in g1_one * s in
let m (* メッセージ *) = FrBytes "0x789012" in
let mQ = let open G2 in g2_one * m in
let sg (* 署名 = smQ *) = let open G2 in mQ * s in
let a1 (* (P, sg) *) = (g1_one, sg) in
let a2 (* (-p, mQ) *) = (G1.(~-) p, mQ) in
(* ペアリング検査 (P ) ( Q) 1 *)
40. Shielded tez
Shielded tez
: 1 shielded tez = 1 tez の匿名コイン
コントラクト内のトランザクションは匿名化
このコントラクトをデプロイすればオレオレ匿名 tez を作れる
sapling_contract.tz
41. tezos-client sapling
tezos-client sapling コマンド
コマンド
Sapling トランザクションを作成してコントラクトに適⽤
GUIウォレットへの対応が待たれる
# 匿名アカウント作成
$ tezos-client sapling gen key <zname>
# 使⽤するスマートコントラクトを指定
$ tezos-client sapling use key <zname> for contract <contract>
# 匿名アドレスを作成
$ tezos-client sapling gen address <zname>
# 通常アカウントから匿名アドレスへの送⾦ 1 tez = 1 shielded tez
$ tezos-client sapling shield <amount> from <name> to <zaddress>
# 匿名アドレスの残⾼照会
$ tezos-client sapling get balance for <zname> in contract <contract>
# 匿名送⾦の作成
$ tezos-client sapling forge transaction <amount> from <zname> to <zaddress>
using <contract>
# 送⾦命令の送信
42. Sapling in Michelson
Sapling in Michelson
Michelson レベルでは Sapling 関連データは抽象化され、
検証命令しか存在しない。
Transaction のためのゼロ知識証明はオフチェーンで作成。
ex. tezos-client sapling コマンド
type n sapling_state (* 状態。 n は整数定数 *)
type n sapling_transaction (* 状態変更 *)
val SAPLING_EMPTY_STATE n : n sapling_state
(** 空の状態 *)
val SAPLING_VERIFY_UPDATE n :
n sapling_transaction -> n sapling_state -> (int * n sapling_state) option
(** State の元で transaction が valid であれば、
transaction を適⽤して新しい state を返す *)
44. Sapling in SCaml
Sapling in SCaml
Michelson の型では 'sz には整数が来る。
でも、定数だし、依存型というわけでもない。
多層バリアントを使って数値から型への変換を⾏う。
サイズ 8 の空 state を作るには:
Saplint.empty_state `n8 : [> `n8] state
module Sapling : sig
type 'sz state = 'sz sapling_state
type 'sz transaction = 'sz sapling_transaction
val empty_state : 'sz -> 'sz state
val verify_update : 'sz transaction -> 'sz state -> (int * 'sz state) option
end
45. Tezos 008 Edo
Tezos 008 Edo
主な新機能:
Ticket
BLS12-381
Sapling
他にも Keccak, SHA3 命令の追加、 PVSS などある