From 6f4429aaf3552031e0ebc19d761c0c9a149d95cc Mon Sep 17 00:00:00 2001 From: Emmanuel Date: Wed, 27 Nov 2024 13:24:51 -0300 Subject: [PATCH 1/3] feat: use new references for zcash tools on tests (#132) * feat: use new references for zcash tools on tests * chore: bump app version * chore: bump snapshots --- app/Makefile.version | 2 +- tests_zemu/snapshots/fl-mainmenu/00004.png | Bin 9838 -> 9633 bytes tests_zemu/snapshots/s-mainmenu/00004.png | Bin 488 -> 484 bytes tests_zemu/snapshots/s-mainmenu/00010.png | Bin 488 -> 484 bytes tests_zemu/snapshots/sp-mainmenu/00004.png | Bin 452 -> 446 bytes tests_zemu/snapshots/sp-mainmenu/00010.png | Bin 452 -> 446 bytes tests_zemu/snapshots/st-mainmenu/00004.png | Bin 11634 -> 11449 bytes tests_zemu/snapshots/x-mainmenu/00004.png | Bin 452 -> 446 bytes tests_zemu/snapshots/x-mainmenu/00010.png | Bin 452 -> 446 bytes zcashtools/Cargo.lock | 47 +++++++++++++----- zcashtools/Cargo.toml | 8 +-- zcashtools/neon/native/Cargo.toml | 6 +-- zcashtools/neon/native/src/lib.rs | 8 +-- zcashtools/neon/native/tests/builder_test.rs | 4 +- zcashtools/neon/native/tests/builder_test2.rs | 4 +- 15 files changed, 50 insertions(+), 29 deletions(-) diff --git a/app/Makefile.version b/app/Makefile.version index 82feb033..5e6df4ea 100644 --- a/app/Makefile.version +++ b/app/Makefile.version @@ -3,4 +3,4 @@ APPVERSION_M=4 # This is the minor version APPVERSION_N=2 # This is the patch version -APPVERSION_P=3 +APPVERSION_P=4 diff --git a/tests_zemu/snapshots/fl-mainmenu/00004.png b/tests_zemu/snapshots/fl-mainmenu/00004.png index fa946076174bbdd91ec7bba6992550e8db2cd27c..5686e50ed6cbf3fad1aad76fa960448b640b659b 100644 GIT binary patch literal 9633 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 A!T8q&bs9X$X6qll08!ORo`0DLKk zQxzV?GQ6%)m83keQ%j22Rq>_EqAy3CC}hmr{{JKY$$;TKZ+}OG>&xP8MA7BW9kps1 zn79Iz8Ar-ksw==sIuBEM5ZaQich#kLz-EA68GP857O;w2uF0s=UK>Cy2eDW(*9GCe zcJ-V4pB9e!=nL0_V)zsnB(Bz~)AP8*M*PUD7n`yifsyw_FJP=?k!&iZB=W;^{DC}8OHW)`(Cx(U&4QF&u9D=1&tZOnz(x$tZGwY09zTd@JL|i_i5oF~26xM{ z^V*JU1>pS0k_+KU%8e1cnVE3G@JRwLXj&SosCa!B^hb^R006Iv(oo{Enl&=Z0OBPS ziQ(8UiFsG+>&n=I@V7iHSsdbpRAt#1kR(ZxBuVm2-fofbB1T{~(EtDd07*qoM6N<$ Eg4ze;>Hq)$ diff --git a/tests_zemu/snapshots/s-mainmenu/00010.png b/tests_zemu/snapshots/s-mainmenu/00010.png index a78e6827221d778de03512e89e1ec8c4ac1e2397..d84dc33b0d465df0284f2ad093d0b6f281024b29 100644 GIT binary patch delta 458 zcmV;*0X6>U1LOmcB!8<(L_t(|ob8#*vcn({U11soJBf}5yW4xW}NU%7fq_7 zAQx>)K@bGNTiIp^IS)zl?j2AWA(y!Aa(i%)-d>&jjT%TJpYG@d2!JAfItQ331|YaA zh+CB&#WuVzsLG;!VW*lDajN1=lSMyG{NZtd;yQr7NnE{I5 zbQ|dBsep6ola(i?DyX^fd#fPjl#3L36E66EhT|Yc_cqRzgVzsT_XO)O@gT24FCWD07*qoM6N<$f|`@r A!T8q&bs9X$X6qll08!ORo`0DLKk zQxzV?GQ6%)m83keQ%j22Rq>_EqAy3CC}hmr{{JKY$$;TKZ+}OG>&xP8MA7BW9kps1 zn79Iz8Ar-ksw==sIuBEM5ZaQich#kLz-EA68GP857O;w2uF0s=UK>Cy2eDW(*9GCe zcJ-V4pB9e!=nL0_V)zsnB(Bz~)AP8*M*PUD7n`yifsyw_FJP=?k!&iZB=W;^{DC}8OHW)`(Cx(U&4QF&u9D=1&tZOnz(x$tZGwY09zTd@JL|i_i5oF~26xM{ z^V*JU1>pS0k_+KU%8e1cnVE3G@JRwLXj&SosCa!B^hb^R006Iv(oo{Enl&=Z0OBPS ziQ(8UiFsG+>&n=I@V7iHSsdbpRAt#1kR(ZxBuVm2-fofbB1T{~(EtDd07*qoM6N<$ Eg4ze;>Hq)$ diff --git a/tests_zemu/snapshots/sp-mainmenu/00004.png b/tests_zemu/snapshots/sp-mainmenu/00004.png index 500d0b8f1c73c8212f68f3adafa1ac60fe9622ed..5ebb8454f0ce1cd51b54d40eb373659586f2b66f 100644 GIT binary patch delta 420 zcmV;V0bBmW1HJ>0B!7iTL_t(|obB0Lvcez?fZ=+^ov{BUv6u7U$S?uY0HH18|2=6X zK*Obq#{mEU00000000000G4>oR}o_@FNP2%D^zO8TMQvo%Nr}{jT$Jadr!uTPIz@o zVQgY)9~?OhKvFJ+>Qqf{t7XbqV=6^?F;1;kl+L%JswId0Ie*smAvzkq#A|UI>3UgD zRhb3LZc}agINOf$DEB4qwgQwHC(2mD6=@~K810+2(z@Q&{8Qh#|KT$LmY(G)Zf#A* zoc4}EiZYgLMXeYB&n+nLYuDYD`;Vis$F=?9B)I~*=2Qw1FOF|cV~qK;F@IZzA3fjy z?B&a*%cyGKs((?fyD&OQ?}{Y`p_yc|f0;_E$^OL{gFCSc-RUIBjKNadr?>U1)$-MF z`Hdp~I;vta_+cR?w000000384T00000uJjLh%U6Mw?Crn+ O0000F1DKvB2Tov{BUv6p^i!Y~pDVFXDg_k1NT z0xTYJ@pSx(I+#R`oY>K0Q<&GODlW}|MDwEZo{i%vv! z%iwHcYaapy3_zimLUXE?ugx+#)|pCCUW`+(6{GXLsAkFAet!e&dJr8=PvWz|_{xOYIll{XOgI8h~dZj^<8H25KdIL^F4{JWj z8IPE=XG*XPpTUQx9q%UoFm91ZlQ@cD7N1}rgxy#HEC0Lh_I4{^MQ@3ebCL618v2X@ zC}*Gbp}a1`1{KEGG-ls4OqDq=@|EOy^{m&gB*nW2)*}Z10000000000003X*AEt~( U6uMo2KmY&$07*qoM6N<$f+6w8_W%F@ diff --git a/tests_zemu/snapshots/sp-mainmenu/00010.png b/tests_zemu/snapshots/sp-mainmenu/00010.png index 500d0b8f1c73c8212f68f3adafa1ac60fe9622ed..5ebb8454f0ce1cd51b54d40eb373659586f2b66f 100644 GIT binary patch delta 420 zcmV;V0bBmW1HJ>0B!7iTL_t(|obB0Lvcez?fZ=+^ov{BUv6u7U$S?uY0HH18|2=6X zK*Obq#{mEU00000000000G4>oR}o_@FNP2%D^zO8TMQvo%Nr}{jT$Jadr!uTPIz@o zVQgY)9~?OhKvFJ+>Qqf{t7XbqV=6^?F;1;kl+L%JswId0Ie*smAvzkq#A|UI>3UgD zRhb3LZc}agINOf$DEB4qwgQwHC(2mD6=@~K810+2(z@Q&{8Qh#|KT$LmY(G)Zf#A* zoc4}EiZYgLMXeYB&n+nLYuDYD`;Vis$F=?9B)I~*=2Qw1FOF|cV~qK;F@IZzA3fjy z?B&a*%cyGKs((?fyD&OQ?}{Y`p_yc|f0;_E$^OL{gFCSc-RUIBjKNadr?>U1)$-MF z`Hdp~I;vta_+cR?w000000384T00000uJjLh%U6Mw?Crn+ O0000F1DKvB2Tov{BUv6p^i!Y~pDVFXDg_k1NT z0xTYJ@pSx(I+#R`oY>K0Q<&GODlW}|MDwEZo{i%vv! z%iwHcYaapy3_zimLUXE?ugx+#)|pCCUW`+(6{GXLsAkFAet!e&dJr8=PvWz|_{xOYIll{XOgI8h~dZj^<8H25KdIL^F4{JWj z8IPE=XG*XPpTUQx9q%UoFm91ZlQ@cD7N1}rgxy#HEC0Lh_I4{^MQ@3ebCL618v2X@ zC}*Gbp}a1`1{KEGG-ls4OqDq=@|EOy^{m&gB*nW2)*}Z10000000000003X*AEt~( U6uMo2KmY&$07*qoM6N<$f+6w8_W%F@ diff --git a/tests_zemu/snapshots/st-mainmenu/00004.png b/tests_zemu/snapshots/st-mainmenu/00004.png index f07b2ba3d1a5b9fcf5ea4ca9a9a594d947636da6..8b04780e36704d88e3b8796e995d401ae3274d11 100644 GIT binary patch delta 9500 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 literal 11634 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 diff --git a/tests_zemu/snapshots/x-mainmenu/00004.png b/tests_zemu/snapshots/x-mainmenu/00004.png index 500d0b8f1c73c8212f68f3adafa1ac60fe9622ed..5ebb8454f0ce1cd51b54d40eb373659586f2b66f 100644 GIT binary patch delta 420 zcmV;V0bBmW1HJ>0B!7iTL_t(|obB0Lvcez?fZ=+^ov{BUv6u7U$S?uY0HH18|2=6X zK*Obq#{mEU00000000000G4>oR}o_@FNP2%D^zO8TMQvo%Nr}{jT$Jadr!uTPIz@o zVQgY)9~?OhKvFJ+>Qqf{t7XbqV=6^?F;1;kl+L%JswId0Ie*smAvzkq#A|UI>3UgD zRhb3LZc}agINOf$DEB4qwgQwHC(2mD6=@~K810+2(z@Q&{8Qh#|KT$LmY(G)Zf#A* zoc4}EiZYgLMXeYB&n+nLYuDYD`;Vis$F=?9B)I~*=2Qw1FOF|cV~qK;F@IZzA3fjy z?B&a*%cyGKs((?fyD&OQ?}{Y`p_yc|f0;_E$^OL{gFCSc-RUIBjKNadr?>U1)$-MF z`Hdp~I;vta_+cR?w000000384T00000uJjLh%U6Mw?Crn+ O0000F1DKvB2Tov{BUv6p^i!Y~pDVFXDg_k1NT z0xTYJ@pSx(I+#R`oY>K0Q<&GODlW}|MDwEZo{i%vv! z%iwHcYaapy3_zimLUXE?ugx+#)|pCCUW`+(6{GXLsAkFAet!e&dJr8=PvWz|_{xOYIll{XOgI8h~dZj^<8H25KdIL^F4{JWj z8IPE=XG*XPpTUQx9q%UoFm91ZlQ@cD7N1}rgxy#HEC0Lh_I4{^MQ@3ebCL618v2X@ zC}*Gbp}a1`1{KEGG-ls4OqDq=@|EOy^{m&gB*nW2)*}Z10000000000003X*AEt~( U6uMo2KmY&$07*qoM6N<$f+6w8_W%F@ diff --git a/tests_zemu/snapshots/x-mainmenu/00010.png b/tests_zemu/snapshots/x-mainmenu/00010.png index 500d0b8f1c73c8212f68f3adafa1ac60fe9622ed..5ebb8454f0ce1cd51b54d40eb373659586f2b66f 100644 GIT binary patch delta 420 zcmV;V0bBmW1HJ>0B!7iTL_t(|obB0Lvcez?fZ=+^ov{BUv6u7U$S?uY0HH18|2=6X zK*Obq#{mEU00000000000G4>oR}o_@FNP2%D^zO8TMQvo%Nr}{jT$Jadr!uTPIz@o zVQgY)9~?OhKvFJ+>Qqf{t7XbqV=6^?F;1;kl+L%JswId0Ie*smAvzkq#A|UI>3UgD zRhb3LZc}agINOf$DEB4qwgQwHC(2mD6=@~K810+2(z@Q&{8Qh#|KT$LmY(G)Zf#A* zoc4}EiZYgLMXeYB&n+nLYuDYD`;Vis$F=?9B)I~*=2Qw1FOF|cV~qK;F@IZzA3fjy z?B&a*%cyGKs((?fyD&OQ?}{Y`p_yc|f0;_E$^OL{gFCSc-RUIBjKNadr?>U1)$-MF z`Hdp~I;vta_+cR?w000000384T00000uJjLh%U6Mw?Crn+ O0000F1DKvB2Tov{BUv6p^i!Y~pDVFXDg_k1NT z0xTYJ@pSx(I+#R`oY>K0Q<&GODlW}|MDwEZo{i%vv! z%iwHcYaapy3_zimLUXE?ugx+#)|pCCUW`+(6{GXLsAkFAet!e&dJr8=PvWz|_{xOYIll{XOgI8h~dZj^<8H25KdIL^F4{JWj z8IPE=XG*XPpTUQx9q%UoFm91ZlQ@cD7N1}rgxy#HEC0Lh_I4{^MQ@3ebCL618v2X@ zC}*Gbp}a1`1{KEGG-ls4OqDq=@|EOy^{m&gB*nW2)*}Z10000000000003X*AEt~( U6uMo2KmY&$07*qoM6N<$f+6w8_W%F@ diff --git a/zcashtools/Cargo.lock b/zcashtools/Cargo.lock index 553a48a6..91663eb7 100644 --- a/zcashtools/Cargo.lock +++ b/zcashtools/Cargo.lock @@ -451,7 +451,7 @@ dependencies = [ [[package]] name = "equihash" version = "0.1.0" -source = "git+https://github.com/Zondax/librustzcash?rev=112eedd27b2e51b9e1b77603a776cd78e738c3ae#112eedd27b2e51b9e1b77603a776cd78e738c3ae" +source = "git+https://github.com/Zondax/librustzcash?rev=ce278848fef35903db46c3dced41658e90bbeb3c#ce278848fef35903db46c3dced41658e90bbeb3c" dependencies = [ "blake2b_simd", "byteorder", @@ -665,8 +665,28 @@ dependencies = [ [[package]] name = "ledger-zcash" +version = "2.0.0" +source = "git+https://github.com/Zondax/ledger-zcash-rs?tag=v2.0.0#e5f3e6d633ea316759b153c7edacaaabf580f32c" +dependencies = [ + "byteorder", + "cfg-if", + "educe", + "hex", + "lazy_static", + "ledger-transport", + "ledger-zondax-generic", + "log", + "serde", + "sha2 0.10.8", + "thiserror", + "tokio", + "zx-bip44", +] + +[[package]] +name = "ledger-zcash-app-builder" version = "0.11.2" -source = "git+https://github.com/Zondax/ledger-zcash-rs?rev=3bad2fa4a7870270627edc25ebdb5b4818fd1855#3bad2fa4a7870270627edc25ebdb5b4818fd1855" +source = "git+https://github.com/Zondax/ledger-zcash-tools?tag=v2.0.0#5e8588cc0fef85a74c22d1012ed951b7b44a5097" dependencies = [ "arrayvec", "byteorder", @@ -678,7 +698,8 @@ dependencies = [ "jubjub", "lazy_static", "ledger-transport", - "ledger-zcash-builder", + "ledger-zcash", + "ledger-zcash-chain-builder", "ledger-zondax-generic", "log", "rand_core", @@ -693,9 +714,9 @@ dependencies = [ ] [[package]] -name = "ledger-zcash-builder" +name = "ledger-zcash-chain-builder" version = "0.11.2" -source = "git+https://github.com/Zondax/ledger-zcash-rs?rev=3bad2fa4a7870270627edc25ebdb5b4818fd1855#3bad2fa4a7870270627edc25ebdb5b4818fd1855" +source = "git+https://github.com/Zondax/ledger-zcash-tools?tag=v2.0.0#5e8588cc0fef85a74c22d1012ed951b7b44a5097" dependencies = [ "bellman", "blake2b_simd", @@ -720,7 +741,7 @@ dependencies = [ "sha2 0.10.8", "thiserror", "tokio", - "zcash_note_encryption 0.1.0 (git+https://github.com/Zondax/librustzcash?rev=112eedd27b2e51b9e1b77603a776cd78e738c3ae)", + "zcash_note_encryption 0.1.0 (git+https://github.com/Zondax/librustzcash?rev=ce278848fef35903db46c3dced41658e90bbeb3c)", "zcash_primitives", "zcash_proofs", ] @@ -1592,7 +1613,7 @@ dependencies = [ [[package]] name = "zcash_encoding" version = "0.1.0" -source = "git+https://github.com/Zondax/librustzcash?rev=112eedd27b2e51b9e1b77603a776cd78e738c3ae#112eedd27b2e51b9e1b77603a776cd78e738c3ae" +source = "git+https://github.com/Zondax/librustzcash?rev=ce278848fef35903db46c3dced41658e90bbeb3c#ce278848fef35903db46c3dced41658e90bbeb3c" dependencies = [ "byteorder", "nonempty", @@ -1613,7 +1634,7 @@ dependencies = [ [[package]] name = "zcash_note_encryption" version = "0.1.0" -source = "git+https://github.com/Zondax/librustzcash?rev=112eedd27b2e51b9e1b77603a776cd78e738c3ae#112eedd27b2e51b9e1b77603a776cd78e738c3ae" +source = "git+https://github.com/Zondax/librustzcash?rev=ce278848fef35903db46c3dced41658e90bbeb3c#ce278848fef35903db46c3dced41658e90bbeb3c" dependencies = [ "chacha20", "chacha20poly1305", @@ -1624,7 +1645,7 @@ dependencies = [ [[package]] name = "zcash_primitives" version = "0.6.0" -source = "git+https://github.com/Zondax/librustzcash?rev=112eedd27b2e51b9e1b77603a776cd78e738c3ae#112eedd27b2e51b9e1b77603a776cd78e738c3ae" +source = "git+https://github.com/Zondax/librustzcash?rev=ce278848fef35903db46c3dced41658e90bbeb3c#ce278848fef35903db46c3dced41658e90bbeb3c" dependencies = [ "aes", "bip0039", @@ -1654,13 +1675,13 @@ dependencies = [ "sha2 0.9.9", "subtle", "zcash_encoding", - "zcash_note_encryption 0.1.0 (git+https://github.com/Zondax/librustzcash?rev=112eedd27b2e51b9e1b77603a776cd78e738c3ae)", + "zcash_note_encryption 0.1.0 (git+https://github.com/Zondax/librustzcash?rev=ce278848fef35903db46c3dced41658e90bbeb3c)", ] [[package]] name = "zcash_proofs" version = "0.6.0" -source = "git+https://github.com/Zondax/librustzcash?rev=112eedd27b2e51b9e1b77603a776cd78e738c3ae#112eedd27b2e51b9e1b77603a776cd78e738c3ae" +source = "git+https://github.com/Zondax/librustzcash?rev=ce278848fef35903db46c3dced41658e90bbeb3c#ce278848fef35903db46c3dced41658e90bbeb3c" dependencies = [ "bellman", "blake2b_simd", @@ -1680,8 +1701,8 @@ name = "zcashtool" version = "0.1.0" dependencies = [ "env_logger", - "ledger-zcash", - "ledger-zcash-builder", + "ledger-zcash-app-builder", + "ledger-zcash-chain-builder", "log", "neon", "neon-serde", diff --git a/zcashtools/Cargo.toml b/zcashtools/Cargo.toml index 28f590b4..9607a839 100644 --- a/zcashtools/Cargo.toml +++ b/zcashtools/Cargo.toml @@ -8,8 +8,8 @@ opt-level = "s" overflow-checks = true [patch.crates-io] -ledger-zcash-builder = { git = "https://github.com/Zondax/ledger-zcash-rs", rev = "3bad2fa4a7870270627edc25ebdb5b4818fd1855" } -ledger-zcash = { git = "https://github.com/Zondax/ledger-zcash-rs", rev = "3bad2fa4a7870270627edc25ebdb5b4818fd1855" } +ledger-zcash-chain-builder = { git = "https://github.com/Zondax/ledger-zcash-tools", tag = "v2.0.0" } +ledger-zcash-app-builder = { git = "https://github.com/Zondax/ledger-zcash-tools", tag = "v2.0.0" } -# ledger-zcash-builder = { path = "../../ledger-zcash-rs/ledger-zcash-builder" } -# ledger-zcash = { path = "../../ledger-zcash-rs/ledger-zcash" } +# ledger-zcash-chain-builder = { path = "../../ledger-zcash-tools/ledger-zcash-chain-builder" } +# ledger-zcash-app-builder = { path = "../../ledger-zcash-tools/ledger-zcash-app-builder" } diff --git a/zcashtools/neon/native/Cargo.toml b/zcashtools/neon/native/Cargo.toml index b3a526fc..ce3622b7 100644 --- a/zcashtools/neon/native/Cargo.toml +++ b/zcashtools/neon/native/Cargo.toml @@ -19,14 +19,14 @@ serde_derive = "1" serde = "1" log = "0.4" snafu = { version = "0.8.2" } -zcash_primitives = { git = "https://github.com/Zondax/librustzcash", rev = "112eedd27b2e51b9e1b77603a776cd78e738c3ae", features = ["transparent-inputs"], package = "zcash_primitives" } +zcash_primitives = { git = "https://github.com/Zondax/librustzcash", rev = "ce278848fef35903db46c3dced41658e90bbeb3c", features = ["transparent-inputs"], package = "zcash_primitives" } neon-serde = { git = "https://github.com/Zondax/neon-serde", branch = "master", default-features = false, features = [ "napi-6", ] } -ledger-zcash-builder = { git = "https://github.com/Zondax/ledger-zcash-rs", rev = "3bad2fa4a7870270627edc25ebdb5b4818fd1855", package = "ledger-zcash-builder" } -ledger-zcash = { git = "https://github.com/Zondax/ledger-zcash-rs", rev = "3bad2fa4a7870270627edc25ebdb5b4818fd1855", package = "ledger-zcash" } +ledger-zcash-chain-builder = { git = "https://github.com/Zondax/ledger-zcash-tools", tag = "v2.0.0", package = "ledger-zcash-chain-builder" } +ledger-zcash-app-builder = { git = "https://github.com/Zondax/ledger-zcash-tools", tag = "v2.0.0", package = "ledger-zcash-app-builder" } [dev-dependencies] serde = { version = "1", features = ["derive"] } diff --git a/zcashtools/neon/native/src/lib.rs b/zcashtools/neon/native/src/lib.rs index 83ceaab8..4b064bbc 100644 --- a/zcashtools/neon/native/src/lib.rs +++ b/zcashtools/neon/native/src/lib.rs @@ -1,9 +1,9 @@ -use ledger_zcash_builder::data::{ +use ledger_zcash_chain_builder::data::{ HsmTxData, InitData, OutputBuilderInfo, SpendBuilderInfo, TransactionSignatures, TransparentInputBuilderInfo, TransparentOutputBuilderInfo, }; -use ledger_zcash_builder::errors::Error; -use ledger_zcash_builder::{hsmauth, txbuilder, txprover}; +use ledger_zcash_chain_builder::errors::Error; +use ledger_zcash_chain_builder::{hsmauth, txbuilder, txprover}; use neon::prelude::*; use std::cell::RefCell; use std::path::Path; @@ -45,7 +45,7 @@ fn calculate_zip0317_fee(mut cx: FunctionContext) -> JsResult { ]; let fee: u64 = - ledger_zcash::builder::Builder::calculate_zip0317_fee(n_tin, n_tout, n_spend, n_sout) + ledger_zcash_app_builder::builder::Builder::calculate_zip0317_fee(n_tin, n_tout, n_spend, n_sout) .into(); Ok(cx.number(fee as f64)) diff --git a/zcashtools/neon/native/tests/builder_test.rs b/zcashtools/neon/native/tests/builder_test.rs index 61e6f01b..09d3a82a 100644 --- a/zcashtools/neon/native/tests/builder_test.rs +++ b/zcashtools/neon/native/tests/builder_test.rs @@ -1,6 +1,6 @@ use env_logger::Env; -use ledger_zcash::builder::Builder as ZcashBuilder; -use ledger_zcash_builder::{ +use ledger_zcash_app_builder::builder::Builder as ZcashBuilder; +use ledger_zcash_chain_builder::{ data::{OutputBuilderInfo, SpendBuilderInfo}, txbuilder::Builder, }; diff --git a/zcashtools/neon/native/tests/builder_test2.rs b/zcashtools/neon/native/tests/builder_test2.rs index 8c17cffc..c7f13b85 100644 --- a/zcashtools/neon/native/tests/builder_test2.rs +++ b/zcashtools/neon/native/tests/builder_test2.rs @@ -1,6 +1,6 @@ use env_logger::Env; -use ledger_zcash::builder::Builder as ZcashBuilder; -use ledger_zcash_builder::{ +use ledger_zcash_app_builder::builder::Builder as ZcashBuilder; +use ledger_zcash_chain_builder::{ data::{TransparentInputBuilderInfo, TransparentOutputBuilderInfo}, txbuilder::Builder, }; From 82b96ad5338eb8dc08fab30d3f741d9939b7600b Mon Sep 17 00:00:00 2001 From: Emmanuel Date: Thu, 28 Nov 2024 10:45:46 -0300 Subject: [PATCH 2/3] update docs (#134) * chore: update wrong names on docs * chore: remove unused instructions * chore: remove instruction code not implemented * chore: update docs again * fix: mermaid diagrams --- app/src/apdu_handler.c | 6 - app/src/coin.h | 4 - app/src/handlers/handler_signing.h | 4 - docs/APDUSPEC.md | 16 +- docs/previuos/zcash_workflow_v1.md | 199 +++++++++++++++ .../zcash_workflow_v2.md} | 8 +- docs/zcash_workflow.md | 227 +++++++++--------- docs/zcash_workflow_version3.md | 212 ---------------- 8 files changed, 331 insertions(+), 345 deletions(-) create mode 100644 docs/previuos/zcash_workflow_v1.md rename docs/{zcash_workflow_version2.md => previuos/zcash_workflow_v2.md} (99%) delete mode 100644 docs/zcash_workflow_version3.md diff --git a/app/src/apdu_handler.c b/app/src/apdu_handler.c index 32397f21..31156be7 100644 --- a/app/src/apdu_handler.c +++ b/app/src/apdu_handler.c @@ -145,12 +145,6 @@ void handleApdu(volatile uint32_t *flags, volatile uint32_t *tx, uint32_t rx) { break; } - case INS_SIGN_SAPLING: { - CHECK_PIN_VALIDATED() - handleSignSapling(); - break; - } - default: THROW(APDU_CODE_INS_NOT_SUPPORTED); } diff --git a/app/src/coin.h b/app/src/coin.h index e0dbaa75..ade19f29 100644 --- a/app/src/coin.h +++ b/app/src/coin.h @@ -66,15 +66,12 @@ extern "C" { #define INS_GET_VERSION 0x00 #define INS_GET_ADDR_SECP256K1 0x01 -#define INS_SIGN_SECP256K1 0x02 #define INS_GET_ADDR_SAPLING_DIV 0x10 #define INS_GET_ADDR_SAPLING 0x11 -#define INS_SIGN_SAPLING 0x12 #define INS_GET_DIV_LIST 0x09 #define INS_INIT_TX 0xa0 -#define INS_KEY_EXCHANGE 0xaa #define INS_EXTRACT_SPEND 0xa1 #define INS_EXTRACT_OUTPUT 0xa2 #define INS_CHECKANDSIGN 0xa3 @@ -85,7 +82,6 @@ extern "C" { #define INS_GET_OVK 0xf1 #define INS_GET_NF 0xf2 #define INS_GET_FVK 0xf3 -#define INS_CRASH_TEST 0xff typedef enum { key_ivk = 0, key_ovk = 1, key_fvk = 2, nf = 3 } key_type_e; diff --git a/app/src/handlers/handler_signing.h b/app/src/handlers/handler_signing.h index e3176abb..e741d7ec 100644 --- a/app/src/handlers/handler_signing.h +++ b/app/src/handlers/handler_signing.h @@ -333,7 +333,3 @@ __Z_INLINE void handleCheckandSign(volatile uint32_t *tx, uint32_t rx) { *tx = 32; THROW(APDU_CODE_OK); } - -__Z_INLINE void handleSignSapling() { - THROW(APDU_CODE_COMMAND_NOT_ALLOWED); -} diff --git a/docs/APDUSPEC.md b/docs/APDUSPEC.md index 4a2717b5..ee63f1e9 100644 --- a/docs/APDUSPEC.md +++ b/docs/APDUSPEC.md @@ -68,7 +68,7 @@ The general structure of commands and responses is as follows: --- -### GET_VERSION +### INS_GET_VERSION #### Command @@ -198,7 +198,7 @@ If a diversifier was not valid, zero-bytes are returned (so always 220 bytes are --- -### INS_GET_IVK_SAPLING +### INS_GET_IVK Returns a sapling incoming viewing key. Forced user confirmation (So P1 needs to be 0x01). @@ -225,7 +225,7 @@ Also returns the default diversifier (starting from index 0). --- -### INS_GET_OVK_SAPLING +### INS_GET_OVK Returns a sapling outgoing viewing key. Forced user confirmation (So P1 needs to be 0x01). @@ -249,7 +249,7 @@ Returns a sapling outgoing viewing key. Forced user confirmation (So P1 needs to --- -### INS_GET_FVK_SAPLING +### INS_GET_FVK Returns a sapling full viewing key fvk = (ak, nk, ovk). Forced user confirmation (So P1 needs to be 0x01). @@ -275,7 +275,7 @@ Returns a sapling full viewing key fvk = (ak, nk, ovk). Forced user confirmation --- -### INS_GET_NF_SAPLING +### INS_GET_NF Returns a sapling nullifier. TODO: Forced user confirmation (So P1 needs to be 0x01). @@ -397,7 +397,7 @@ Data is defined as: Returns a proof generating key (PGK) and randomness (rcv and alpha) for a sapling spend. -- This command requires you already called the INS_INIT_TX_SAPLING. +- This command requires you already called the INS_INIT_TX. - This command requires that it is needed to extract spendinfo. #### Command @@ -425,7 +425,7 @@ Returns a proof generating key (PGK) and randomness (rcv and alpha) for a saplin Returns randomness (rcv and rseed (after ZIP202) and optional Hash_Seed) for a sapling output. -- This command requires you already called the INS_INIT_TX_SAPLING. +- This command requires you already called the INS_INIT_TX. - This command requires you already called the correct number of INS_GET_SPENDINFO. - This command requires that it is needed to extract outputinfo. @@ -560,7 +560,7 @@ Data is defined as: --- -### INS_GET_EXTRACT_TRANSSSIG +### INS_EXTRACT_TRANSSIG Returns a SECP256K1 signature for a sapling transparent input if available. Othrewise, it returns only an error code. diff --git a/docs/previuos/zcash_workflow_v1.md b/docs/previuos/zcash_workflow_v1.md new file mode 100644 index 00000000..46779294 --- /dev/null +++ b/docs/previuos/zcash_workflow_v1.md @@ -0,0 +1,199 @@ +Zcash ledger, first connect: +- Address generation +- Sharing address with host +- Sharing IVK with host +//TODO: change to APDU API +```mermaid + sequenceDiagram + participant LF as Ledger flash storage + participant LC as Ledger computation + participant H as Host + participant N as Network + H ->> LC: compute_address(path: u32) + activate LC + LC -->> LF: store_ivk(ivk) ? + Note over LF: potentially store (path, IVK) + LC ->> H: address: (diversifier, pk_d) + LC ->> H: incoming viewing key: ivk + deactivate LC + Note over H,LC: show address on both screens? +``` + +Zcash ledger, syncing +- Sharing IVK with host +- Decrypt incoming notes and verification note commitments +- TODO: what to do with matching notes? +```mermaid + sequenceDiagram + participant LF as Ledger flash storage + participant LC as Ledger computation + participant H as Host + participant N as Network + H ->> LC: get_ivk(path: u32) + #add minor confirmation + activate LC + LC -->> LF: retrieve_ivk(path) ? + LF -->> LC: ivk ? + Note over LC: compute_ivk(path) + LC ->> H: ivk + deactivate LC + activate H + H ->> N: get_unspend_notes() + N ->> H: [unspend_notes] + Note over H: [matching_notes] = decrypt_all_unspend_notes(ivk, [unspend_notes]) + Note over H: store [matching_notes] (d, pk_d, v, rcm) + deactivate H +``` + +Zcash ledger, make shielded transaction phase 1 +- Verify outputs on screen + +```mermaid + sequenceDiagram + participant LF as Ledger flash storage + participant LC as Ledger computation + participant H as Host + participant N as Network + + Note over H: show amount, address, memo-fields per output + Note over H: validate amount <= total_amount + H ->> LC: initiate_transaction() +N ->> H: anchor of note? +N ->> H: metadata +Note over H: input note selection (path, note) + + activate LC + loop Every output note + H ->> LC: verify_output(d, pk_d, value, memo) + Note over H,LC: approve amount and address and verify on screens + Note over H,LC: approve hash of memo and verify on screens + LC ->> H: approval of output + LC ->> LF: store_output_data(d,pk_d,value,memo) + end + deactivate LC + #compute value balance and approve + Note over LC,H: continue if all approved + ``` + + Zcash ledger, make shielded transaction phase 2 +- Process outputs and store in flash +- Compute hash of all outputs + +```mermaid + sequenceDiagram + participant LF as Ledger flash storage + participant LC as Ledger computation + participant H as Host + participant N as Network + activate LC + loop Every output note + H ->> LC: make_transaction(path) #TODO: which path??? fixed one makes sense?? + Note over LC: compute random rcm + LC ->> LF: update_rcmnew(rcm) + LF ->> LC: (d,pk_d,value) + Note over LC: compute value/note commitments + LC ->> LF: update_valuecommitsum(vc) + LC ->> LF: value/note commitments + LC ->> H: value/note commitments + LF ->> LC: d,pk_d, value, memo + Note over LC: compute eph, c_out, c_enc + LC ->> LF: eph, c_out, c_enc + LC ->> H: eph, c_out, c_enc + deactivate LC + activate H + H -->> LC: get_proof_key(path) #is this necessary? + LC -->> H: proof_key + Note over H: ZK proof of output note + H ->> LC: zk_proof + deactivate H + activate LC + LC ->> LF: zk_proof + end + Note over LC: perform shieldedoutput_hash + LC ->> H: shielded_output_hash + LC ->> LF: shielded_output_hash + deactivate LC + ``` + +Zcash ledger, make shielded transaction phase 3 +- Process spends and store in flash +- Store RCM values in flash +- Compute hash of all outputs + +```mermaid + sequenceDiagram + participant LF as Ledger flash storage + participant LC as Ledger computation + participant H as Host + participant N as Network + loop Every spend note + N ->> H: anchor of note? + H ->> LC: spend_this_note(path, valuecommit, rcm, anchor) # Do we need to verify here that rcm is correct? Is the zkproof of the spend the old one in the blockchain? #what about the valuecommit? + LC ->> LF: (path, valuecommit, anchor) + LC -->> H: proof_gen_key(path) ? #is this needed + + activate LC + LC ->> LF: update_rcmvalue(rcm) + LC ->> LF: update_valuecommitsum(vc) #??? + + note over LC: compute nullifier + LC ->> H: nullifier + LC ->> LF: nullifier + + note over LC: compute randomized verification key + LC ->> H: randomized verification key + LC ->> LF: (path, randomizer value, randomized verification key) + deactivate LC + + Note over H: ZK proof of spend note + H ->> LC: zk_proof + LC ->> LF: zk_proof + + end + Note over LC: perform shieldedspend_hash + LC ->> LF: shieldedspend_hash #does the host actually need this? + LC ->> H: shieldedspend_hash +``` + +Zcash ledger, make shielded transaction phase 4 +- Host gives all remaining transaction (meta) data +- Ledger does the complete TX_HASH_ALL +- Final approval of transaction? +- Ledger signs the necessary parts and shares with host +- Host sends transaction blob to network + +```mermaid + sequenceDiagram + participant LF as Ledger flash storage + participant LC as Ledger computation + participant H as Host + participant N as Network + + H -->> N: retrieve meta_data from network? + N -->> H: meta_data + + H ->> LC: meta_data transaction + LC ->> LF: meta_data transaction + + Note over LC: compute valuebalance and commitment + LC ->> LF: valuebalance and commitment + Note over LF,LC: verify rcm_secretkey/publickey + + Note over LF,LC: perform_tx_hash_all over all data in flash + + LC ->> H: tx_hash_all + + Note over LC,H: final verification/approval of tx before signing? + + LC ->> H: sign(rcm_secretkey, tx_hash_all) + loop Every spend note + LF ->> LC: randomized value + Note over LC: get_secret_key(path) + Note over LC: sign(sk, randomized value, tx_hash_all) + LC ->> H: spend_auth_sign + end + + Note over H: make raw transaction blob + H ->> N: raw_transaction_blob + +``` \ No newline at end of file diff --git a/docs/zcash_workflow_version2.md b/docs/previuos/zcash_workflow_v2.md similarity index 99% rename from docs/zcash_workflow_version2.md rename to docs/previuos/zcash_workflow_v2.md index 8721170b..275f02d6 100644 --- a/docs/zcash_workflow_version2.md +++ b/docs/previuos/zcash_workflow_v2.md @@ -74,7 +74,7 @@ Zcash ledger, make shielded transaction phase 1 end deactivate LC Note over LC,H: continue if all approved - ``` +``` Zcash ledger, make shielded transaction phase 2 - Process outputs and store in flash @@ -114,14 +114,14 @@ Zcash ledger, make shielded transaction phase 1 LC ->> H: shielded_output_hash LC ->> LF: shielded_output_hash deactivate LC - ``` +``` Zcash ledger, make shielded transaction phase 3 - Process spends and store in flash - Store RCM values in flash - Compute hash of all outputs - ```mermaid +```mermaid sequenceDiagram participant LF as Ledger flash storage participant LC as Ledger computation @@ -162,7 +162,7 @@ Zcash ledger, make shielded transaction phase 4 - Ledger signs the necessary parts and shares with host - Host sends transaction blob to network - ```mermaid +```mermaid sequenceDiagram participant LF as Ledger flash storage participant LC as Ledger computation diff --git a/docs/zcash_workflow.md b/docs/zcash_workflow.md index a885b003..2de0dab6 100644 --- a/docs/zcash_workflow.md +++ b/docs/zcash_workflow.md @@ -7,7 +7,8 @@ Zcash ledger, first connect: sequenceDiagram participant LF as Ledger flash storage participant LC as Ledger computation - participant H as Host + participant H as Host (JS) + participant Z as Zcashtools participant N as Network H ->> LC: compute_address(path: u32) activate LC @@ -27,7 +28,8 @@ Zcash ledger, syncing sequenceDiagram participant LF as Ledger flash storage participant LC as Ledger computation - participant H as Host + participant H as Host (JS) + participant Z as Zcashtools participant N as Network H ->> LC: get_ivk(path: u32) #add minor confirmation @@ -47,153 +49,164 @@ Zcash ledger, syncing Zcash ledger, make shielded transaction phase 1 - Verify outputs on screen +- Verify enough balance +- Put relevant data in flash storage ```mermaid sequenceDiagram participant LF as Ledger flash storage participant LC as Ledger computation - participant H as Host + participant H as Host (JS) + participant Z as Zcashtools participant N as Network Note over H: show amount, address, memo-fields per output - Note over H: validate amount <= total_amount - H ->> LC: initiate_transaction() -N ->> H: anchor of note? -N ->> H: metadata -Note over H: input note selection (path, note) + Note over H: Shuffle shielded spends/outputs + Note over H: Treat change address as regular output + Note over H: Make sure amount_in - amount_out = tx-fee + H ->> LC: TX_INPUT_LENGTHS + H ->> LC: T_INPUT_DATA + H ->> LC: T_OUTPUT_DATA + H ->> LC: S_SPEND_DATA + H ->> LC: S_OUTPUT_DATA + Note over LC,H: check input/outputdata on screen and verify + Note over LC: Continue if approved + loop Every transparent input + LC ->> LF: T_INPUT_DATA + end - activate LC - loop Every output note - H ->> LC: verify_output(d, pk_d, value, memo) - Note over H,LC: approve amount and address and verify on screens - Note over H,LC: approve hash of memo and verify on screens - LC ->> H: approval of output - LC ->> LF: store_output_data(d,pk_d,value,memo) + loop Every transparent output + LC ->> LF: T_OUTPUT_DATA end - deactivate LC - #compute value balance and approve - Note over LC,H: continue if all approved - ``` - Zcash ledger, make shielded transaction phase 2 -- Process outputs and store in flash -- Compute hash of all outputs + loop Every shielded spend + Note over LC: Random numbers rcv/alpha + LC ->> LF: S_SPEND_DATA, RND_DATA + end -```mermaid - sequenceDiagram - participant LF as Ledger flash storage - participant LC as Ledger computation - participant H as Host - participant N as Network - activate LC - loop Every output note - H ->> LC: make_transaction(path) #TODO: which path??? fixed one makes sense?? - Note over LC: compute random rcm - LC ->> LF: update_rcmnew(rcm) - LF ->> LC: (d,pk_d,value) - Note over LC: compute value/note commitments - LC ->> LF: update_valuecommitsum(vc) - LC ->> LF: value/note commitments - LC ->> H: value/note commitments - LF ->> LC: d,pk_d, value, memo - Note over LC: compute eph, c_out, c_enc - LC ->> LF: eph, c_out, c_enc - LC ->> H: eph, c_out, c_enc - deactivate LC - activate H - H -->> LC: get_proof_key(path) #is this necessary? - LC -->> H: proof_key - Note over H: ZK proof of output note - H ->> LC: zk_proof - deactivate H - activate LC - LC ->> LF: zk_proof + loop Every shielded output + Note over LC: Random numbers rcv/rcm/esk + LC ->> LF: S_OUTPUT_DATA, RND_DATA end - Note over LC: perform shieldedoutput_hash - LC ->> H: shielded_output_hash - LC ->> LF: shielded_output_hash - deactivate LC - ``` +``` -Zcash ledger, make shielded transaction phase 3 -- Process spends and store in flash -- Store RCM values in flash -- Compute hash of all outputs + Zcash ledger, make shielded transaction phase 2 +- Host processes everything, uses zcashtools builder +- Host asks ledger for random values to use +- Host initiates builder - ```mermaid +```mermaid sequenceDiagram participant LF as Ledger flash storage participant LC as Ledger computation - participant H as Host + participant H as Host (JS) + participant Z as Zcashtools participant N as Network - loop Every spend note - N ->> H: anchor of note? - H ->> LC: spend_this_note(path, valuecommit, rcm, anchor) # Do we need to verify here that rcm is correct? Is the zkproof of the spend the old one in the blockchain? #what about the valuecommit? - LC ->> LF: (path, valuecommit, anchor) - LC -->> H: proof_gen_key(path) ? #is this needed - - activate LC - LC ->> LF: update_rcmvalue(rcm) - LC ->> LF: update_valuecommitsum(vc) #??? - - note over LC: compute nullifier - LC ->> H: nullifier - LC ->> LF: nullifier - - note over LC: compute randomized verification key - LC ->> H: randomized verification key - LC ->> LF: (path, randomizer value, randomized verification key) - deactivate LC - - Note over H: ZK proof of spend note - H ->> LC: zk_proof - LC ->> LF: zk_proof + H ->> Z: builder_init() + H ->> Z: add_transparent_inputs(txdata) + H ->> Z: add_transparent_outputs(txdata) + loop Every shielded spend + H ->> LC: get_spend_data () + LF ->> LC: spend_data + LC ->> H: proofkey, rnd (rcv/alpha) + H ->> Z: add_sapling_spend(txdata, proofkey, rnd) + end + loop Every shielded output + H ->> LC: get_ouput_data () + LF ->> LC: output_data + LC ->> H: rnd (rcv/rcm/esk) + H ->> Z: add_sapling_outpu(txdata, rnd) end - Note over LC: perform shieldedspend_hash - LC ->> LF: shieldedspend_hash #does the host actually need this? - LC ->> H: shieldedspend_hash ``` + Zcash ledger, make shielded transaction phase 4 -- Host gives all remaining transaction (meta) data +- Host gives all remaining transaction data - Ledger does the complete TX_HASH_ALL -- Final approval of transaction? - Ledger signs the necessary parts and shares with host - Host sends transaction blob to network - ```mermaid +```mermaid sequenceDiagram participant LF as Ledger flash storage participant LC as Ledger computation - participant H as Host + participant H as Host (JS) + participant Z as Zcashtools participant N as Network H -->> N: retrieve meta_data from network? N -->> H: meta_data + H ->> Z: build() + Z ->> H: raw_tx_blob + + H ->> LC: t_in_script_data + H ->> LC: spend_data + H ->> LC: output_data + H ->> LC: sighash_data + + LF ->> LC: t_output_data + Note over LC: outputshash = hash(t_output_data) + Note over LC: check outputshash == sighash_data[outputshash] + + LF ->> LC: valuebalance + Note over LC: check valuebalance - H ->> LC: meta_data transaction - LC ->> LF: meta_data transaction + Note over LC: check joinsplits (empty) - Note over LC: compute valuebalance and commitment - LC ->> LF: valuebalance and commitment - Note over LF,LC: verify rcm_secretkey/publickey + loop Every shielded spend + LF ->> LC: S_SPEND_DATA, RND_DATA + Note over LC: check spend data (CV, RK, NF) + end - Note over LF,LC: perform_tx_hash_all over all data in flash + loop Every shielded output + LF ->> LC: S_OUTPUT_DATA, RND_DATA + Note over LC: check output data (CV, CMU, (ENC_C, ENC_OUT)) + end - LC ->> H: tx_hash_all + loop Every transparent input + LF ->> LC: T_INPUT_DATA + Note over LC: check t_input data (script, script_from_pk, value) + Note over LC: sighash_all_script = hash_sigall(sighash_data, t_in_script_data) + Note over LC: secp256k1_sign (sighash_all_script) + LC ->> LF: transparent_signature + end - Note over LC,H: final verification/approval of tx before signing? + loop Every shielded spend + LF ->> LC: S_SPEND_DATA, RND_DATA + Note over LC: sighash_all (sighash_data) + Note over LC: jubjub_sign(ask, alpha, sighash_all) + LC ->> LF: spend_signature + end +LC ->> H: all_ok + +``` + +Zcash ledger, make shielded transaction phase 5 +- Finalize tx + +```mermaid + sequenceDiagram + participant LF as Ledger flash storage + participant LC as Ledger computation + participant H as Host (JS) + participant Z as Zcashtools + participant N as Network + + loop Every transparent input + H ->> LC: next_transparent_signature + LF ->> LC: transparent_signature + LC ->> H: transparent_signature + end + H ->> Z: add_transparent_signatures(t_signatures) - LC ->> H: sign(rcm_secretkey, tx_hash_all) - loop Every spend note - LF ->> LC: randomized value - Note over LC: get_secret_key(path) - Note over LC: sign(sk, randomized value, tx_hash_all) - LC ->> H: spend_auth_sign + loop Every shielded spend + H ->> LC: next_spend_signature + LF ->> LC: spend_signature + LC ->> H: spend_signature end + H ->> Z: add_spend_signatures(s_signatures) - Note over H: make raw transaction blob - H ->> N: raw_transaction_blob + Z ->> N: send_raw_tx ``` \ No newline at end of file diff --git a/docs/zcash_workflow_version3.md b/docs/zcash_workflow_version3.md deleted file mode 100644 index 2f915c1a..00000000 --- a/docs/zcash_workflow_version3.md +++ /dev/null @@ -1,212 +0,0 @@ -Zcash ledger, first connect: -- Address generation -- Sharing address with host -- Sharing IVK with host -//TODO: change to APDU API -```mermaid - sequenceDiagram - participant LF as Ledger flash storage - participant LC as Ledger computation - participant H as Host (JS) - participant Z as Zcashtools - participant N as Network - H ->> LC: compute_address(path: u32) - activate LC - LC -->> LF: store_ivk(ivk) ? - Note over LF: potentially store (path, IVK) - LC ->> H: address: (diversifier, pk_d) - LC ->> H: incoming viewing key: ivk - deactivate LC - Note over H,LC: show address on both screens? -``` - -Zcash ledger, syncing -- Sharing IVK with host -- Decrypt incoming notes and verification note commitments -- TODO: what to do with matching notes? -```mermaid - sequenceDiagram - participant LF as Ledger flash storage - participant LC as Ledger computation - participant H as Host (JS) - participant Z as Zcashtools - participant N as Network - H ->> LC: get_ivk(path: u32) - #add minor confirmation - activate LC - LC -->> LF: retrieve_ivk(path) ? - LF -->> LC: ivk ? - Note over LC: compute_ivk(path) - LC ->> H: ivk - deactivate LC - activate H - H ->> N: get_unspend_notes() - N ->> H: [unspend_notes] - Note over H: [matching_notes] = decrypt_all_unspend_notes(ivk, [unspend_notes]) - Note over H: store [matching_notes] (d, pk_d, v, rcm) - deactivate H -``` - -Zcash ledger, make shielded transaction phase 1 -- Verify outputs on screen -- Verify enough balance -- Put relevant data in flash storage - -```mermaid - sequenceDiagram - participant LF as Ledger flash storage - participant LC as Ledger computation - participant H as Host (JS) - participant Z as Zcashtools - participant N as Network - - Note over H: show amount, address, memo-fields per output - Note over H: Shuffle shielded spends/outputs - Note over H: Treat change address as regular output - Note over H: Make sure amount_in - amount_out = tx-fee - H ->> LC: TX_INPUT_LENGTHS - H ->> LC: T_INPUT_DATA - H ->> LC: T_OUTPUT_DATA - H ->> LC: S_SPEND_DATA - H ->> LC: S_OUTPUT_DATA - Note over LC,H: check input/outputdata on screen and verify - Note over LC: Continue if approved - loop Every transparent input - LC ->> LF: T_INPUT_DATA - end - - loop Every transparent output - LC ->> LF: T_OUTPUT_DATA - end - - loop Every shielded spend - Note over LC: Random numbers rcv/alpha - LC ->> LF: S_SPEND_DATA, RND_DATA - end - - loop Every shielded output - Note over LC: Random numbers rcv/rcm/esk - LC ->> LF: S_OUTPUT_DATA, RND_DATA - end - ``` - - Zcash ledger, make shielded transaction phase 2 -- Host processes everything, uses zcashtools builder -- Host asks ledger for random values to use -- Host initiates builder - -```mermaid - sequenceDiagram - participant LF as Ledger flash storage - participant LC as Ledger computation - participant H as Host (JS) - participant Z as Zcashtools - participant N as Network - H ->> Z: builder_init() - H ->> Z: add_transparent_inputs(txdata) - H ->> Z: add_transparent_outputs(txdata) - loop Every shielded spend - H ->> LC: get_spend_data () - LF ->> LC: spend_data - LC ->> H: proofkey, rnd (rcv/alpha) - H ->> Z: add_sapling_spend(txdata, proofkey, rnd) - end - - loop Every shielded output - H ->> LC: get_ouput_data () - LF ->> LC: output_data - LC ->> H: rnd (rcv/rcm/esk) - H ->> Z: add_sapling_outpu(txdata, rnd) - end - ``` - - -Zcash ledger, make shielded transaction phase 4 -- Host gives all remaining transaction data -- Ledger does the complete TX_HASH_ALL -- Ledger signs the necessary parts and shares with host -- Host sends transaction blob to network - - ```mermaid - sequenceDiagram - participant LF as Ledger flash storage - participant LC as Ledger computation - participant H as Host (JS) - participant Z as Zcashtools - participant N as Network - - H -->> N: retrieve meta_data from network? - N -->> H: meta_data - H ->> Z: build() - Z ->> H: raw_tx_blob - - H ->> LC: t_in_script_data - H ->> LC: spend_data - H ->> LC: output_data - H ->> LC: sighash_data - - LF ->> LC: t_output_data - Note over LC: outputshash = hash(t_output_data) - Note over LC: check outputshash == sighash_data[outputshash] - - LF ->> LC: valuebalance - Note over LC: check valuebalance - - Note over LC: check joinsplits (empty) - - loop Every shielded spend - LF ->> LC: S_SPEND_DATA, RND_DATA - Note over LC: check spend data (CV, RK, NF) - end - - loop Every shielded output - LF ->> LC: S_OUTPUT_DATA, RND_DATA - Note over LC: check output data (CV, CMU, (ENC_C, ENC_OUT)) - end - - loop Every transparent input - LF ->> LC: T_INPUT_DATA - Note over LC: check t_input data (script, script_from_pk, value) - Note over LC: sighash_all_script = hash_sigall(sighash_data, t_in_script_data) - Note over LC: secp256k1_sign (sighash_all_script) - LC ->> LF: transparent_signature - end - - loop Every shielded spend - LF ->> LC: S_SPEND_DATA, RND_DATA - Note over LC: sighash_all (sighash_data) - Note over LC: jubjub_sign(ask, alpha, sighash_all) - LC ->> LF: spend_signature - end -LC ->> H: all_ok - -``` - -Zcash ledger, make shielded transaction phase 5 -- Finalize tx - - ```mermaid - sequenceDiagram - participant LF as Ledger flash storage - participant LC as Ledger computation - participant H as Host (JS) - participant Z as Zcashtools - participant N as Network - - loop Every transparent input - H ->> LC: next_transparent_signature - LF ->> LC: transparent_signature - LC ->> H: transparent_signature - end - H ->> Z: add_transparent_signatures(t_signatures) - - loop Every shielded spend - H ->> LC: next_spend_signature - LF ->> LC: spend_signature - LC ->> H: spend_signature - end - H ->> Z: add_spend_signatures(s_signatures) - - Z ->> N: send_raw_tx - -``` \ No newline at end of file From 1a200aafc5967e74de56ff9d33f0219250569f7a Mon Sep 17 00:00:00 2001 From: emmanuelm41 Date: Mon, 9 Dec 2024 09:19:32 -0300 Subject: [PATCH 3/3] fix: typo in docs --- docs/zcash_workflow.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zcash_workflow.md b/docs/zcash_workflow.md index 2de0dab6..b6545a32 100644 --- a/docs/zcash_workflow.md +++ b/docs/zcash_workflow.md @@ -113,10 +113,10 @@ Zcash ledger, make shielded transaction phase 1 end loop Every shielded output - H ->> LC: get_ouput_data () + H ->> LC: get_output_data () LF ->> LC: output_data LC ->> H: rnd (rcv/rcm/esk) - H ->> Z: add_sapling_outpu(txdata, rnd) + H ->> Z: add_sapling_output(txdata, rnd) end ```