Update Zebra block deserialization for block time #48
5 changed files with 29 additions and 987 deletions
957
librustzcash-wrapper/Cargo.lock
generated
957
librustzcash-wrapper/Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -17,8 +17,6 @@ zcash_primitives = "0.13.0"
|
||||||
zcash_client_backend = "0.10.0"
|
zcash_client_backend = "0.10.0"
|
||||||
zip32 = "0.1.0"
|
zip32 = "0.1.0"
|
||||||
proc-macro2 = "1.0.66"
|
proc-macro2 = "1.0.66"
|
||||||
reqwest = "0.12.1"
|
|
||||||
tokio = { version="1.36.0", features = ["full"] }
|
|
||||||
|
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
|
|
@ -26,7 +26,11 @@ import C.Zcash
|
||||||
import Control.Exception (SomeException(..), try)
|
import Control.Exception (SomeException(..), try)
|
||||||
import Control.Monad.IO.Class
|
import Control.Monad.IO.Class
|
||||||
import Data.Aeson
|
import Data.Aeson
|
||||||
|
import Data.Binary.Get
|
||||||
import qualified Data.ByteString as BS
|
import qualified Data.ByteString as BS
|
||||||
|
import qualified Data.ByteString.Char8 as C
|
||||||
|
import qualified Data.ByteString.Lazy as LBS
|
||||||
|
import Data.HexString
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified Data.Text.Encoding as E
|
import qualified Data.Text.Encoding as E
|
||||||
import Foreign.Rust.Marshall.Variable
|
import Foreign.Rust.Marshall.Variable
|
||||||
|
@ -103,41 +107,8 @@ makeZebraCall host port m params = do
|
||||||
Nothing -> return $ Left "Empty response from Zebra"
|
Nothing -> return $ Left "Empty response from Zebra"
|
||||||
Just zR -> return $ Right zR
|
Just zR -> return $ Right zR
|
||||||
|
|
||||||
-- |
|
getBlockTime :: HexString -> Int
|
||||||
hexDigitToInt :: Char -> Int
|
getBlockTime hex_block =
|
||||||
hexDigitToInt x = case x of
|
fromIntegral $
|
||||||
'0' -> 0
|
runGet getInt32le $
|
||||||
'1' -> 1
|
LBS.fromStrict $ BS.take 4 (BS.drop 100 $ hexBytes hex_block)
|
||||||
'2' -> 2
|
|
||||||
'3' -> 3
|
|
||||||
'4' -> 4
|
|
||||||
'5' -> 5
|
|
||||||
'6' -> 6
|
|
||||||
'7' -> 7
|
|
||||||
'8' -> 8
|
|
||||||
'9' -> 9
|
|
||||||
'a' -> 10
|
|
||||||
'b' -> 11
|
|
||||||
'c' -> 12
|
|
||||||
'd' -> 13
|
|
||||||
'e' -> 14
|
|
||||||
'f' -> 15
|
|
||||||
'A' -> 10
|
|
||||||
'B' -> 11
|
|
||||||
'C' -> 12
|
|
||||||
'D' -> 13
|
|
||||||
'E' -> 14
|
|
||||||
'F' -> 15
|
|
||||||
|
|
||||||
hexStringToInt :: String -> Int -> Int -> Int
|
|
||||||
hexStringToInt [] val _ = val
|
|
||||||
hexStringToInt (x:y:xs) val e =
|
|
||||||
hexStringToInt xs (val + ((hexDigitToInt x)*16 + (hexDigitToInt y))*256^e) (e+1)
|
|
||||||
|
|
||||||
|
|
||||||
getBlockTime :: String -> Int
|
|
||||||
getBlockTime hex_block = do
|
|
||||||
let hex_date = take 8 (drop 200 hex_block)
|
|
||||||
hexStringToInt hex_date 0 0
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -765,10 +765,11 @@ main = do
|
||||||
let bscAdr = SaplingReceiver $ BS.pack cAdr
|
let bscAdr = SaplingReceiver $ BS.pack cAdr
|
||||||
let ca = genSaplingInternalAddress (SaplingSpendingKey $ BS.pack sk)
|
let ca = genSaplingInternalAddress (SaplingSpendingKey $ BS.pack sk)
|
||||||
fromMaybe (SaplingReceiver "") ca `shouldBe` bscAdr
|
fromMaybe (SaplingReceiver "") ca `shouldBe` bscAdr
|
||||||
describe "Call zebra to get Block data" $ do
|
describe "Zebra parsing:" $ do
|
||||||
it "Call genBlockResponse" $ do
|
it "Read block time" $ do
|
||||||
let blkdata <- genBlockResponse
|
let blkdata =
|
||||||
return $ Just blkdata `shouldBe` ""
|
"04000000c732575a3e94b7464c84b35935c2fca26e40d37b6f3278bda3d941877b192a0048cb59da8eeaf9f622d4537ec2a27918415f444d0bb143e8091b470a18a438c117fd96323fd1a9c775ed793154de0e8a2023b551431e89b5ce6f30ef047388f0bdbb0266fe81481f2c006046a8be3bca5b8819209d053a88184bb48753171accb807c38f46d00000fd400500b6a304cbc4e6caecc9b3a29ce42d71752bf5396944e28465e29d1bd7e7f3c680db3c4b85a1488d7c4e21a70c1cf50cfe4e7f70a4f1abb638f144afb90dfa69adfc7c981fd8792df19926da695356699ab76213094431bf6491b80572c310ab8e51c27cda39c771371dbf7adc60089ff5f9614577a92ce3a1e452d5d8280e3d970322e1fc5937c53369623d5e58e57672b48c2edc7a86f7d7de62e06668097547b782a01d3794a50f131695f7de3e4bf038b12abffd29b8eba618820e143ba0be57ccaa67f64511460027efb065c6ddff501376744c6b68ca01d884025e7f939521d230b1a46016d66ad3ab2262dbd477b38bbec234a19425b939dc0f1d868035c3ef99eee635c9dfd62235ede6d62f652fec499127a152e7be4f959a9bb7fcca9b335de98d14aee1330fe37f1ba28be26902a1cddbc3f67f2f6317093d3f278c1c0156e5319a0b35360e38719911b8012a8cc34893f05dc28a22787f3e0461836aef602110e621c8b9d78e991ccc0160deb8c8921f6fd13bd00d47a170b9d0b09ffd57e37467400c138823dce7c12027eb9f919b8d5f4072b331a042f6f5ebb814c6a903110cc97161787d1eb2716c8fb98d747abf321a0b079f3b6a1a0329337b4922a0d739886a03f0d475d41005733f26c675dd9694712d6ee07772a5e8f6b5871789ac14159beced65d3b2196725baa4ce04f059a7034ff0d7ce081e94d23e0115b9d8f0d99fa5b4f9771b4feaac881ac80f178c3575cc70858e40f53f1d0406253edba75e2bb6f40eb2ef4ece3df2b8dadbd3ac168b1743a0cfb68ba81ca4c838435002587852e81e0a0c3c77e11218df892ac0c2f343967b127fbb822712ceabc459ded7f3ca3e95ed5ddfe6cdfe5657da1b12ee47eb63af7a839cdbc1f52f51e349dbf2bd7d8529f814108723d97fcfda7563c4fbe3a24118352e4706f9f91406f11acde3a570e10a258fa6a5415f57a26988249a87e57f192d0408b6f56c2ef65d5e37597d144e8fe1014a4f552dc8c213b0a70b2ccff6747f6f1e0d598715d8cb0da37e0331c01da1f9e0505e9d1907628427d5d032a29fa0e14b75289b10c7d3109b590aec2a4debda9eabcbd3163f6df67efd92687d0c492a71d48b2995a658b34e96814e5674a62e3738efe53e0daf4bfe9d1031e45a246bd3b32c6d581b71c0b60ad711570bca3848c38ba5aed74d977a185d199db721c2677d4868e5afaa6cc2c7369898f58f93738681118d529194d41f0cb6103915d2e99422db387fb90046eae764a79dfe8733a7f68439d0f37e773d16ac7f0ba3a8ce0fd6746d038704b2a0a979659a859682581fee0be3fc50eed13e85e6b52f398d16b59f5f738c1eb289b3861d636b961d9220c1f76bf8a8be3ffd1e2472461202285aa1c5b7eac58564aaab0beedb65e1078517e031888aa3cb8843876aaf19311d5150529a10c9d9bce1538f7533aff126e518ef1ebd919f26aa3869ed1ced167cb1de6075897ad2dc461b9156922c4ee387f8e1635e95564d3964e47d39e6e82079e0220df00614ecd4fd31a5f3d13c9191fc65037ad3cd651f055cc795260f21bb0ba8acd7e3b65b5ff81d5a1b187a777c826f96637e00f8147c4bd43753fe9e0cd73564b53a0e9eab27745505ccd2e4a1a217307c66030ca115580ce6ecb9a8b043ca41bd2de15abd13838d130d3cfecd8d0e3bb6c982bf1f9cdc799c3256e2d722d3f13cd7acdb9d75d7e36483b2ae01e5dcb70db824eadd9c3955d79557d612a879fa6da1da479807640e37bf25a22091f1cf6fb5293e60e5616416fb2adb1d9892258e8ac6859978159338d3b6e2063b9d842a24d61d0616506d5088fe76025df35619febd57f92e30699a0df8731bdbad0775922bb12fb1697d9da833010400008085202f89010000000000000000000000000000000000000000000000000000000000000000ffffffff0603204c2a010cffffffff0480b2e60e000000001976a914278aff0c0f8734638ce81aaef4ab0afddd36552888ac286bee000000000017a9140c0bcca02f3cba01a5d7423ac3903d40586399eb8740787d010000000017a91471e1df05024288a00802de81e08c437859586c878738c94d010000000017a91493916098d2a161a91f3ddebab69dd5db9587b6248700000000204c2a000000000000000000000000"
|
||||||
|
getBlockTime (hexString blkdata) `shouldBe` 1711455165
|
||||||
|
|
||||||
-- | Properties
|
-- | Properties
|
||||||
prop_PhraseLength :: Property
|
prop_PhraseLength :: Property
|
||||||
|
|
|
@ -55,6 +55,7 @@ library
|
||||||
, http-conduit
|
, http-conduit
|
||||||
, http-client
|
, http-client
|
||||||
, memory
|
, memory
|
||||||
|
, binary
|
||||||
, text
|
, text
|
||||||
, haskoin-core
|
, haskoin-core
|
||||||
, secp256k1-haskell
|
, secp256k1-haskell
|
||||||
|
|
Loading…
Reference in a new issue