Bitcoin full node and query server

March 2018

Archive of the libbitcoin Slack #general channel.

Thursday, March 1, 2018

Z
zoranc01:16
Hello people!
neillm01:17
@zoranc greetings!
Z
zoranc01:18
I am trying to get into libbitcoin development by making witness_address class. So I am looking at payment_address for guidance and most of it is clear. However I have hard time understanding the extract_input() and extract_output() functions...
Not sure if I need to look deeper into script class, into bitcoin specs, or (most likely) both of them. 😉
neillm01:20
which parts in particular? the src/chain/script code does often require a closer look
evoskuil01:20
extraction is the process of matching a "standard" script to obtain its corresponding payment address.
I don't recall the details WRT segwit addressing, but I believe that the patterns required for extraction are implemented (above).
extract_input is for extracting an address from an input script, extract_output from an output script.
(edited)
Z
zoranc01:38
👍
evoskuil01:39
The witness_address class would be used for native segwit addressing, with encoding in base_32...
👍 1
Z
zoranc01:39
what i don't understand for instance is why the extract_input in the sign_key_hash case has two possible addresses? isn't it the hash of the public key the correct address?
👍 1
evoskuil01:40
It also differs from payment_address in that there are two distint byte lengths (for the pre-encoded value).
Z
zoranc01:40
(i suck at slack thumbs up myself - lol)
evoskuil01:41
🙂
I don't follow the question. What two values?
Z
zoranc01:42
in the payment_address code the return statement has an array of two values because of ambiguity
evoskuil01:42
That's a consequence of ambiguity for an input script.
So we record two possible addresses.
The only way to resolve the ambiguity is to use the output and not the input.
Z
zoranc01:43
from where comes the ambiguity? isn't it always two pushes?
evoskuil01:43
The script matches two patterns.
(edited)
a script of sign_key_hash pattern is always also a potential sign_script_hash.
(edited)
Z
zoranc01:44
ow
evoskuil01:45
yeah, it sucks
significantly expands store volume unless you look up outputs to disambiguate
Z
zoranc01:47
i guess the second line is the p2pkh case, right?
evoskuil01:47
{ bitcoin_short_hash(script.back().data()), p2sh_version } <= p2sh
👍 1
Z
zoranc01:47
looking at the next case that's wrong
yeah!
evoskuil01:48
Note that it is also possible for a script to be sign_script_hash without being sign_key_hash.
So both cases are explicitly included for readability.
Note also that sign_public_key cannot be extracted from an input, must have output.
Though that's no longer standard, history still matters.
Z
zoranc01:51
thanks for the explanation!
evoskuil01:51
np, thanks for the help!
Z
zoranc01:52
one last question: is this correct code for the 1. case: { ec_public{ script.back().data() }, p2kh_version }
haven't done much yet - still mostly learning.
neillm02:13
@evoskuil was the zmq tarball patch meant to be backported to v3? i just realized running install.sh still uses the 'bad' version and corrupts the store on shutdown
evoskuil07:38
bad version?
evoskuil09:28
You mean it's using the current zmq build? I assume it can be backported, that's been phillip's thing.
neillm13:06
the master branch of zmq has a regression that causes a bad bs exit and corrupts the store. the zmq tarball fix was to 1) avoid that, and 2) lock in something stable and known working. i consider the current master repo state to be a 'bad version'
neillm14:15
grr, sourceforge has been having some issues lately, so our installer is failing to download source tarballs like boost ...
sometimes, not always
Ah. "
The sourceforge.net website is temporarily in static offline mode.
Only a very limited set of project pages are available until the main website returns to service. "
at some point, it might be worth considering creating a libbitcoin-install repo or something, where we just download the dependencies and make them available from there. github seems to be pretty reliable, although I suspect someday that may bite us too
👍 1
or i'll host a mirror at some point. so we can try the original location and fall back to the mirror if it doesn't match md5sum. just thinking out loud, probably not urgent
evoskuil19:43
I tried this once via github, which had some issues but I forget what exactly.

Friday, March 2, 2018

James C.19:19
Hi @evoskuil @neillm, I'm working on the EC documentation chapter and reliving a bit of Bitcoin history whilst looking at recoverable sigs. I gather this was discussed around 2011 by core devs, but obviously DERs still in use (consensus). Was this implemented in Libbitcoin in anticipation of potential hardfork back then? potentially eliminating redundant PubKey in TX? Or are recoverable sigs used anywhere else in Bitcoin?
Separate thought related to EC: I tried implementing building a petersen's commitment C = rH + xG with ec_add(), but realised i cannot add two arbitrary points on the curve, of which I do not explicitly know their scalar values s1, s2 from s1*G, s2*G. Am I missing something? Thank you in advance!
3 replies · James C., evoskuil · last Mar 02, 2018
James C.19:49
Thanks! I didn't know message signing was done via recoverable sigs in most wallets!
(edited)
evoskuil20:04
👍
evoskuil20:04
I don't know about the EC question.

Saturday, March 3, 2018

evoskuil00:05
With a recent update to the address index (server only), the size has been reduced from 86 GiB to 44GiB.
This brings total server store size down to 210GiB (though we might be short a couple GiB for lack of SegWit address indexing). By comparison bitcoind with ElectrumX address indexing is 203GiB. We are smaller than bitcoind and slightly larger than ElectrumX, but I fully expect to be smaller than both by the v4 release. And of course much faster 🙂.
👍 1🎉 1
neillm00:10
👍 nice work!
James C.18:52
I have drafted a EC/Signature chapter and added both existing chapters to the wiki and wiki menu so anybody can edit. Thanks for the help so far, I enjoyed making this: https://github.com/libbitcoin/libbitcoin/wiki/Elliptic-Curve-Operations-&-Signing Feedback welcome! Next step: (hd) wallet chapter, integrate examples as tests
(edited)
1 reply · James C. · last Mar 03, 2018
James C.20:40
I need to edit and add determistic ecsda signature description, msg-dependent k via hmac
evoskuil20:39
This is too hard:
//Generate 256 bit entropy. data_chunk myEntropy(ec_secret_size); //256bits pseudo_random_fill(myEntropy); //Construct private key with Entropy ec_secret mySecret; //256bit byte_array mySecret = to_array<ec_secret_size>(myEntropy); //Not all possible 256bits are member of Fp std::cout << verify(mySecret);
pseudo_random_fill should become a template-based implementation so that it can accept arrays as well, then you would just pass an ec_secret.
👍 1
2 replies · James C., evoskuil · last Mar 06, 2018
James C.08:39
Can I capture this as an issue in the repo?
evoskuil21:51
It's already been implemented in master (PR still open), but feel free and link it to the PR.
👍 1
evoskuil21:21
myScalar1_add <= this is a mix of camel casing and lower casing. libbitcoin strictly uses lower cased identifiers, with the exception of macros (upper case) and template arguments (Pascal cased). Good to use the same style in examples.
👍 1
ec_secret mySecret; //256bit byte_array mySecret = to_array<ec_secret_size>(myEntropy); reduces to: auto mySecret = to_array<ec_secret_size>(myEntropy); which prevents a second allocation.
👍 1
ec_secret myScalar1 = base16_literal => auto my_scalar1 = base16_literal(...)
std::cout << unsigned(myRecoverableSig.recovery_id); <= might want to explain why you are upcasting here (or find an clearer way to resolve).
(edited)
👍 1

Sunday, March 4, 2018

Y
Yang09:05
Hello,my friends
evoskuil09:08
Hello

Monday, March 5, 2018

James C.14:45
Hi Eric, I don't know why, but wallet::decode_mnemonic(my_word_list, my_string) won't compile with the 2nd string (passphrase) parameter. In the source code, the preprocessor directive #ifdef WITH_ICU precedes the specific function signature with 2 args in question. Could it be that I am building it wrong? wallet::decode_mnemonic(my_word_list) with single argument no probs. https://github.com/libbitcoin/libbitcoin/blob/master/include/bitcoin/bitcoin/wallet/mnemonic.hpp#L78-L87
(edited)
neillm14:48
@James C. yes, it requires an icu build (i.e. --with-icu --build-icu)
James C.14:49
ah! great thank you, what does icu stand for?
ICU - International Components for Unicode
James C.14:50
yes its in the readme as well
awesome, cheers Neill!
neillm14:51
in short, the mnemonic dictionaries and passphrases can be in multiple languages, so we rely on icu to normalize them to match the specifications of bip-39
👍 1
without the normalization, we still support mnemonic decoding, but can't properly support the passphrases
in the sense that it's better to provide no output than the wrong output ;-)
👍 1
evoskuil20:16
The dependency is conditional because it is vary large yet is required for only a tiny fraction of the codebase and scenarios. Same for qrcode/png.
👍 1

Tuesday, March 6, 2018

James C.16:23
Wallet Chapter is drafted: https://github.com/libbitcoin/libbitcoin/wiki/Addresses-&-HD-Wallets Let me know what you think! Fixes & Ideas appreciated! Next: P2PKH transactions...
(edited)
evoskuil18:04
👍👍
evoskuil21:55
I recommend splitting this into two topics. I think same for the previous.
👍 1

Wednesday, March 7, 2018

James C.07:37
I agree -> came out to be more than I initially thought ...

Friday, March 9, 2018

Y
Yang02:14
How do you think UPnp?🙂
James C.07:22
Hello everybody, I am working on the p2sh tx documentation chapter (& slicing prev chap into smaller ones). I don't quite understand the active_forks argument in script.to_string(active_forks). It seems this argument is the same as the block version miner signaling for softforks, but as far as I can tell, only affects "nop2->CLTV" or "nop3->CSV" in the returned string. So to get CLTV or CSV as the string output, I have to explicitly input the uin32_t active_fork argument with the respective bit activated. Q: Why only specifically these 2 cases, and only for the tx script.to_string method? Thanks in advance!!
evoskuil07:33
Because these are the only opcodes that change behavior as the result of supported forks. The arguments is not the block version number, it’s the set of active forks.
👍 1
The reason they apply to that method is because the textual serialization will change based on what forks are presumed active. This serialization is generally for human consumption.
James C.07:42
Ah ok, got it! Interesting, only two op_code (re)assignments so far? I will read-up on these two BIPs ...
evoskuil07:52
Right, two NOPs have been converted.
So because we want to present meaningful textual representation we need to know the intended context.
UPnp 👍
James C.08:03
I will check out interpreter files, haven't looked into it yet. I was looking at this: https://github.com/libbitcoin/libbitcoin/blob/master/src/machine/opcode.cpp#L312-L316 Thanks Eric!
(edited)
evoskuil08:06
NP, that code is the serializer, but the interpreter shows why it’s that way. The design of the script machine is intended so that c++ beginners can follow it, but with little performance loss. Lemee know how we did :).
(edited)
😁 1
James C.08:12
i can't comment on the script machine yet, but overall its has a been a real case study for me on how to properly structure a library👍👍 Still, so much to learn!
evoskuil08:14
Nice to hear. I’m always focused on what’s wrong with it :).
I’ll be in Paris 3/12-3/13 meeting with Cody Wilson and a DarkWallet group. If anyone wants to meet up just ping me.

Sunday, March 11, 2018

James C.19:51
I have drafted the chapter on building transactions: https://github.com/libbitcoin/libbitcoin/wiki/Building-Transactions Feedback welcome! I feel it is developing a bit in the direction of: Bitcoin + Libbitcoin doc, but maybe that's ok or a good thing. Next: Slicing previous chapters into smaller ones. Other topics: P2SH/Segwit/Stealth Addresses ... moving examples into tests(once I revise the earlier chapters).
(edited)
1 reply · James C. · last Mar 12, 2018
James C.21:18
Ok, so there are some index errors in the examples, will correct tom once I have better internet. sorry.

Tuesday, March 13, 2018

neillm18:48
Can all community server update to the latest v3 code? We'd like to make these the default seed nodes for libbitcoin going forward

Wednesday, March 14, 2018

lclc08:14
Building 3.5 now
evoskuil08:16
The top of master is versioned 3.5 but with changes pending a 3.6 release tag. Thanks for supporting the community server pool Lucas!
lclc08:25
I can also run master otherwise The server is mostly for me to gain experience, so far
How can I get the servers version with bx ?
evoskuil08:29
Oops, I meant to say the top of Version3.
There isn’t a server version command yet. Trivial to add though. Create an issue if you are interested in it.
The server build version can be obtained from its own command line however.
lclc08:33
Ok 👍
Yes I saw that. And I though I pulled 3.5 (modified the install.sh script to grab a specific version instead of master) but the ./bs --verison output is still 3.4. Even through I’m on 3.5 according to the pulled repo: git log --oneline --decorate a1dc181 (grafted, HEAD, tag: v3.5.0) Simplify Visual Studio build instructions.
is that hardcoded somewhere?
GitHub
libbitcoin-server - Bitcoin Full Node and Query Server
So my server is on 3.5 now actually 🙂
Running on 32 GB RAM, 8 CPU Cores, 400 GB Disk buried underground the Alps in a former military anti-atomic command and control center (not that i matters but it sounds cool^^..)
evoskuil08:43
Either the build metadata is out of date or the code generation was not run prior to tagging. But you need to build from head in any case.
lclc08:44
You mean latest of branch version3 instead of tag 3.5 ?
evoskuil08:49
Yes, to get latest address protocol updates.
Resync not required.
lclc09:27
ok, rebuilding
evoskuil09:36
As a community server you should generally build from release branch head (default install.sh) so that we get changes fully vetted in live environments before tagging release.
lclc10:41
Ok, running now with version3 branch HEAD
evoskuil11:25
👍
DNS working? Mainnet and testnet?
lclc11:44
DNS works but I only have a mainnet instance running bx fetch-height tcp://mainnet4.libbitcoin.net:9091 513485
Do you have a mainnet and testnet on the same instance ?
evoskuil11:44
Yes
Set up a config file for testnet and use the -c command line option to run testnet with same binary.
lclc11:46
ok, will do that
evoskuil11:59
Soon we can do that with litecoin, feathercoin ;)
🎉 1😄 1
One binary to run them all.
neillm13:02
Seeding on mainnet is working very well for me, using all 4 community servers. If anyone sees any issue, let us know
lclc13:02
Syncing testnet now
neillm13:04
👍

Monday, March 19, 2018

James C.13:27
Hello everybody, I am working on documenting segwit TXs, but this part has been killing me, stuck on it for a while: Would like to create a witness for P2WSH(multisig): [][sig1][sig2][witnessScript] The problem happens when I try to push on [witnessScript] onto the oplist... witness_oplist.push_back(operation(witness_script.to_data(false))); ...it adds a OP_PUSHDATA1/76/Hex(4c) in front of it. Why does it add the 4c opcode? That doesn't seem to happen if I push back, lets say operation(to_chunk(my_hash_digest)) Here is just the [witnessScript], a 2/3 multisig, parses fine with bx script-decode: 5221026ccfb8061f235cc110697c0bfb3afb99d82c886672f6b9b5393b25a434c0cbf32103befa190c0c22e2f53720b1be9476dcf11917da4665c44c9c71c3a2d28a933c352102be46dc245f58085743b1cc37c82f0d63a960efa43b5336534275fc469b49f4ac53ae After pushing it to the operation::list, I serialise it and get: 4c695221026ccfb8061f235cc110697c0bfb3afb99d82c886672f6b9b5393b25a434c0cbf32103befa190c0c22e2f53720b1be9476dcf11917da4665c44c9c71c3a2d28a933c352102be46dc245f58085743b1cc37c82f0d63a960efa43b5336534275fc469b49f4ac53ae (notice the leading hex(4c)) Any help much appreciated!
(edited)
evoskuil20:47
Scripts consist only of opcodes 0-255. Some opcodes have associated data. When you create an operation from data the data opcode is determined for you. Given that there are potentially multiple choices of data opcode (based on length) it will chose the "minimal" (shortest mapping) opcode. The other convention is to use the "nominal" (simpler mapping) data opcode. You'll see both terms in the comments and parameter names. The construction you are using is: operation(data_chunk&& uncoded, bool minimal=true).
(edited)
James C.22:15
Hmm, this is new to me: I am now looking at https://github.com/libbitcoin/libbitcoin/blob/master/include/bitcoin/bitcoin/impl/machine/operation.ipp#L212-L219 So data lengths beyond 0x4b will require a preceding opcode OP_PUSHDATA1 , OP_PUSHDATA2 depending on the data size? I will have a closer look to better understand the multiple possible mappings you mentioned. But there are still 2 observations I cannot explain: 1) Looking at a P2SH(P2WSH) example from the BIP143 proposal, I noticed the [witnessScript] data in the witnessScript simply has a preceding cf to indicate the number of following data bytes, but no OP_PUSHDATA. I noticed cf>4b. 2) When I try to pass the script object /w the data operation OP_PUSHDATA1 to the witness object: witness my_witness(script.to_data(false), false);, it remains empty. Witness objects constructed from scripts with simple data pushes, such as [number of bytes][data bytes], work fine. Based on the BIP143 example and my troubles with the above witness object, I am guessing the witness doesn't work with the OP_PUSHDATA opcode. Could that be? Thanks in advance!
(edited)
evoskuil22:18
A witness is not a script, it’s a data stack.
You should use the witness object for encoding a witness.
Also, bx does not provide witness commands, nor is there a witness payment object yet.
P2P, validation and serialization are fully supported though.
👍 1
James C.23:08
Ok I understand now! 🙂 I will populate a data stack for the witness object, rather than passing in a serialised script. Somehow I was looking at the serialised format of the witness and thinking that it was basically a script. Thx a lot Eric, was stuck on this for (way to long)!

Tuesday, March 20, 2018

evoskuil00:31
It’s a bit odd that a different serialization was created. I initially implemented as a script, and then as a common base class, but in the end I decided that was more complex that a distinct type.
👍 1
evoskuil06:53
$ bx fetch-height tcp://mainnet1.libbitcoin.net:9091 514353 $ bx fetch-height tcp://mainnet2.libbitcoin.net:9091 514353 $ bx fetch-height tcp://mainnet3.libbitcoin.net:9091 514353 $ bx fetch-height tcp://mainnet4.libbitcoin.net:9091 514353 $ bx fetch-height tcp://mainnet1.libbitcoin.net:9081 "0HxgF^7dEzWu)$R^YE/q7mm0=t@o7RDUT}K.@oY@" 514353 $ bx fetch-height tcp://mainnet2.libbitcoin.net:9081 "}[YQ:ks:iKd0F1!ycPgj:4CVzfV-=jsF}x&%ff=/" 514353 $ bx fetch-height tcp://mainnet3.libbitcoin.net:9081 "f!qCf4(YHm3rp/J15Q+!l>{jz>>eUkW9}6&pc0tB" 514353 $ bx fetch-height tcp://mainnet4.libbitcoin.net:9081 "8=mvk8!F=+>$k&-.65NCPp}4e4j)<N3wk{+N!*hM" 514353 $ bx fetch-height tcp://testnet1.libbitcoin.net:19091 1288674 $ bx fetch-height tcp://testnet2.libbitcoin.net:19091 1288674 $ bx fetch-height tcp://testnet3.libbitcoin.net:19091 1288674 $ bx fetch-height tcp://testnet4.libbitcoin.net:19091 1288674 $ bx fetch-height tcp://testnet1.libbitcoin.net:19081 ")nNv4Ji=CU:}@<LOu-<QvB)b-PIh%PX[)?mH>XAl" 1288674 $ bx fetch-height tcp://testnet2.libbitcoin.net:19081 "M>dfC.16SBU&O9hA@rUWP:k]>DF=xTJ73Iw}HE0g" 1288674 $ bx fetch-height tcp://testnet3.libbitcoin.net:19081 "ZW4K2g{E>*a@n>NqZ<VeI^2ANqw.7Ub<?>UgSiNq" 1288674 $ bx fetch-height tcp://testnet4.libbitcoin.net:19081 "8=mvk8!F=+>$k&-.65NCPp}4e4j)<N3wk{+N!*hM" 1288674
🙂
Welcome mainnet4/testnet4!
lclc07:01
😄
👍 1
James C.09:00
@James C. uploaded a file: piping_bx_witness.jpg and commented: Regarding script vs witness: I made the mistake of naively piping the witness into bx script-encode and assuming it was script 🙂 Thanks for pointing that out. Thats not a criticism of bx in any way, bx has been awesome in analysing/learning serialised formats.
piping_bx_witness.jpg
evoskuil09:09
👍

Wednesday, March 21, 2018

James C.23:05
Draft of Segwit Documentation Sections are up: https://github.com/libbitcoin/libbitcoin/wiki/Segwit-P2WPKH https://github.com/libbitcoin/libbitcoin/wiki/Segwit-P2SH(P2WPKH) https://github.com/libbitcoin/libbitcoin/wiki/Segwit-P2WSH https://github.com/libbitcoin/libbitcoin/wiki/Segwit-P2SH(P2WSH) Corrections & feedback welcome! Next: Redrafting of previous chapters, and associated examples, rethink these to fit into tests.
(edited)

Saturday, March 24, 2018

evoskuil01:10
Please avoid crappy Satoshi terminology (ie scriptSig, scriptPubKey). These aren’t used in the code as they really just don’t make sense. We have input.script and output.script in code.
👍 2😁 1
Slackbot01:10
👻
evoskuil01:12
We also don’t use the term “segwit”. It’s a portmanteau of two abbreviations. Just use “witness”, as in the code. Segregation is redundant.
And avoid jamming textual descriptions into camel/pascal casing. Just use normal English sentence/phrasing (eg PubKeyHash -> public key hash).
IOW don’t let code infect descriptions unless you are describing some specific code example, and then highlight the code symbols as code symbols.
Avoid incorporating type info into symbol names (_string in btc_amount_string).
Use consistent comment style: space after //, capitalize first letter, end with period.
“tx” is an allowed/exceptional abbreviation in the source, but use “transaction” in descriptions.
Values internal to libbitcoin are always satoshi, do value/amount are generally sufficient. Adding “satoshi” becomes a type qualifier, which we try to avoid. We may do this in parameter lists as the concept requires explicitness in at least one location.
👍 2
6 replies · James C., Slackbot, evoskuil · last Mar 24, 2018
James C.14:22
Hi Eric - Can you help me understand what you mean with "satoshi" becoming a type qualifier. I only know type qualifier in the context of "const" type for example ... thx
Slackbot14:22
👻
evoskuil14:26
I mean that you are including type information into variable names. So a variable name shouldn’t include things like “string” or “list” but in this case shouldn’t include “satoshi” because all values in libbitcoin are satoshis, so you would just use “amount” or “value”.
👍 1
Slackbot14:26
👻
James C.14:27
Clear!
evoskuil14:34
👍
Slackbot01:26
👻
evoskuil01:27
redeem_script vs. redeemscript
Script/Serialization -> Script
Transactions are “sent” to outputs, outputs are “spent” by transactions.
Avoid magic numbers. This is either a symbol or can be defaulted: 0xffffffff
oplist is again embedded type info, just use “operations”.
👍 1
N
narodnik06:35
hello, nice to see everybody here. I've created a docker image for cross compiling apps for Android using libbitcoin and Qt: https://polyteknik.org/docker-dw.html
👍🏾 3

Sunday, March 25, 2018

N
narodnik14:08
dockerfile for my setup https://github.com/narodnik/lbdocker
GitHub
lbdocker - libbitcoin docker files

Monday, March 26, 2018

N
narodnik10:38
Hello everyone, I made a pull request for adding ec_sum to math/ https://github.com/libbitcoin/libbitcoin/pull/922
GitHub
Provided unit test. Neccessary for modern privacy schemes which hide sharing amounts. They involve summing points from different curves together: A + B + C. This function provides that functionality.
👍 2
9 replies · James C., narodnik · last Mar 29, 2018
James C.11:58
This is great! I was trying to do petersen commitment (C = rH + aG) with ec math a couple weeks ago in Libbitcoin, and this was exactly what I needed! Previously could only add multiples of Generator points.
James C.12:05
Question regarding "summing points from different curves together", perhaps I misunderstand, is this about summing discrete EC points on the secp256k1?
N
narodnik14:44
it's exactly what you say. It enables you to add 2 or more points together
N
narodnik14:48
value_one = [0, 0, 0, ..., 0, 1] G = secret_to_public(value_one) H = ec_multiply(G, some_constant) rH = ec_multiply(H, r) aG = ec_multiply(G, a) output = ec_sum([rH, aG]) (libbitcoin psuedo code)
👍 1
N
narodnik14:49
well I guess H should be precomputed without some_constant being in the actual code
👍 1
James C.15:12
very cool! homomorphic commitments now possible with Libbitcoin 🙂
(edited)
James C.15:21
I'll add a pedersen commitment example and demonstrate homomorphism in the wiki once its merged.
James C.14:05
James C.14:05
now possible with ec_sum()
James C.12:02
@evoskuil Sorry, i just accidentally requested a code review on github from you, please ignore.
evoskuil22:35
👍

Tuesday, March 27, 2018

Revive02:04
Cool! I forgot you were attending this
evoskuil02:13
I met satoshi!!
😅 1
Slackbot02:13
👻
evoskuil02:41
I was too nervous to ask him for a selfie though.
😁 1
N
narodnik10:35
wow
👍 1
N
narodnik11:05
I love how troubled you looked talking about hash collisions... like it was a matter of life and death you didn't get that optimization
I felt your pain
evoskuil13:20
Yeah, it was more that I felt like I had fucked up the explanation. I didn’t want people to think we were using the tx/header hashes as hash table keys. Really it wasn’t important enough to worry about. But yeah, the nonoptimal bucket counts bugs me.
N
narodnik18:44
I know you don't look nietzsche, but you're the superman
😄 1
N
narodnik18:53
we actually made the gateway in old dw to translate zmq to websockets so good news it will be included in v4
evoskuil18:54
👍
Revive21:46
I also enjoyed the video yesterday. There's still so much technical details i wasnt able to understand as of yet
👍 1

Wednesday, March 28, 2018

evoskuil00:19
Me too! :)

Saturday, March 31, 2018

N
narodnik18:20
GitHub
libbitcoin - Bitcoin Cross-Platform C++ Development Toolkit
James C.20:01
👍Thank you for ec_sum. I'm not definitely not there where I can explain how pedersen commitments are used for confidential transactions yet...but working on it, that would be cool 🙂