Depending on which format of result you are interested, can also try 3&(128!:6) _3&(128!:6) bfh header_hex
On Mon, Apr 13, 2020 at 9:36 AM Thomas McGuire <[email protected]> wrote: > Thanks Bill and Devon for the responses. I guess I’m prejudiced against > negative numbers and should have read a little farther down in the foreigns > page. > > So the _3&(128!:6)^:2 bfh header_hex works as you say returning now packed > binary as characters. Which now need to be converted into hex if I care to > read them. > > So I applied the following: > ,hfd a. i. _3&(128!:6)^:2 bfh header_hex > 1dbd981fe6985776b644b173a4d0385ddc1aa2a829688d1e0000000000000000 > > And get back the correct answer. > When I run timing on my MacBook Pro circa 2016 I get the following timing > which surprised me: > > NB. My old way with extrinsic multiple calls > timespacex '3&(128!:6) bfh 3&(128!:6) bfh header_hex' > 1.1e_5 7040 > > NB. Bill’s way using the power conjunction > timespacex ',hfd a. i. _3&(128!:6)^:2 bfh header_hex' > 2.6e_5 14976 > > NB. Bill’s way leaving the result in binary character array > timespacex '_3&(128!:6)^:2 bfh header_hex' > 1.1e_5 6848 > > So the extra time seems to be due to the sequence of calls: ,hfd a. i. > ‘bfh’ takes very little time and relies on ‘dfh’ for its processing: > timespacex 'bfh > ''b9d751533593ac10cdfb7b8e03cad8babc67d8eaeac0a3699b82857dacac9390''' > 6e_6 5888 > > ‘a. i.’ Is similarly quick I won’t reproduce the timing > > I would expect that ‘hfd’ is similarly quick but it turns out that if is > slower than ‘bfh’ > > NB. Preprocess to obtain a decimal array (I ran timespacex a few times and > report the lowest time) > decimalarray =: a. i. _3&(128!:6)^:2 bfh header_hex > timespacex 'hfd decimalarray' > 1.6e_5 12736 > > ‘hfd’ produces a 2 dimensional array (multiple rows with 2 colums) I guess > that’s where the extra processing lies? > > ‘pdfesc_jzplot_’ which transcribes bytes into printable characters or > escape sequences takes a longer time as well though I haven’t delved into > its source code as yet: > > binarray =: _3&(128!:6)^:2 bfh header_hex > pdfesc_jzplot_"1 binarray > > \035\275\230\037\346\230Wv\266D\261s\244\3208]\334\032\242\250\)h\215\036\000\000\000\000\000\000\000\000 > > timespacex 'pdfesc_jzplot_"1 binarray' > 3.5e_5 6656 > > > On Apr 12, 2020, at 4:40 AM, bill lam <[email protected]> wrote: > > > > try > > _3&(128!:6)^:2 bfh header_hex > > > > On Sun, Apr 12, 2020, 3:50 PM Thomas McGuire <[email protected] > <mailto:[email protected]>> wrote: > > > >> In a round about way (it started with reading slashdot) I was > researching > >> Bitcoin hashing. I came across a python explanation of taking a bitcoin > >> header and SHA256 hashing it twice to see if it produces the desired > number > >> of leading (or terminating depending on the endian of your machine) > '0’s. > >> > >> The snippet of python code is here at a bitcoin wiki site: > >> https://en.bitcoin.it/wiki/Block_hashing_algorithm < > https://en.bitcoin.it/wiki/Block_hashing_algorithm> < > >> https://en.bitcoin.it/wiki/Block_hashing_algorithm < > https://en.bitcoin.it/wiki/Block_hashing_algorithm>> > >> > >> I won’t reproduce it in its entirety here since it’s only a few lines of > >> code I figured I should be able to do the same in J. > >> > >> First I grabbed the header as ascii hex > >> > >> hex_header =: > >> > '0100000081cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc122bc7f5d74df2b9441a42a14695' > >> > >> Then came the issue of turning this into binary. After reviewing the J > >> programming archives finding a thread on packed python structures, a few > >> attempts in J and some code in C to make sure I was doing it right, I > came > >> to the realization that I only had to index pairs of hex characters into > >> ‘a.’ After using the ‘dfh’ function to convert the pair. So I made a bfs > >> tacit to do the work: > >> > >> bfh =: a. {~ [: dfh _2 ]\ ] > >> > >> (As an aside I cheated and used the 13 : functional form and let J > figure > >> out the tacit.) > >> > >> NB. Python double hash: > >> hashlib.sha256(hashlib.sha256(header_bin).digest()).digest(). > >> > >> 3&(128!:6)^:2 bfh header_hex NB. Seemingly direct implementation > in J > >> 8ac7142a625bdd47e177ab584d60de449d0a844eb56173bd1c9aa0dbe69b61a4 > >> > >> Now the above is the incorrect answer. The reason being is that our SHA > >> foreigns convert the answer from underlying binary to a hex string > >> representation. I need to convert the answer with ‘bfh’ and then call > the > >> SHA256 algorithm again: > >> > >> 3&(128!:6) bfh 3&(128!:6) bfh header_hex > >> 1dbd981fe6985776b644b173a4d0385ddc1aa2a829688d1e0000000000000000 > >> > >> This is the correct double hash that is agreement with the wiki article > >> listed above. > >> > >> So 2 questions from all of this: > >> > >> 1) is there a more efficient way of converting a string of hex > characters > >> into a binary character array? > >> > >> 2) Shouldn’t the SHA algorithms send the raw binary back so that you can > >> use the power conjunction with it to do multiple hashes? > >> ---------------------------------------------------------------------- > >> For information about J forums see http://www.jsoftware.com/forums.htm > <http://www.jsoftware.com/forums.htm> > >> > > ---------------------------------------------------------------------- > > For information about J forums see http://www.jsoftware.com/forums.htm < > http://www.jsoftware.com/forums.htm> > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
