ric
New Member
Posts: 43
|
Post by ric on May 20, 2018 10:04:07 GMT 1
Hej!
Den här uppgiften var som sagt "klurig". Jag satt i många timmar igår utan att komma framåt. Jag känner mig mer förvirrad nu än innan jag började.
Jag har plockat ihop en blockheader men fuskar just nu med merklerooten för att komma framåt.
Jag får inte till coinbase transaktionen, jag har tittat på videon ett par gånger samt läst på olika webbsidor.
I videon säger Thomas bl.a. "om man hittar en gammal coinbase output som går till rätt adress, d.v.s. min egen och den är ensam i blocket så det bara finns den, då kan man kopiera alla de här output bytarna". Vart kan jag kopiera detta?
Jag har letat fram ett block som jag minade i tidigare uppgift, transaktionen är "4bb56d8f0c0763a051414a41deee2f1f6b7313859829f740e233cdb3a9faf2a1", jag har tittat på denna med "gettransaction" och "getrawtransaction" .... men hittar inte vad jag söker.....
Jag har även problem med att förstå scripten, exempelvis det där man ska ange sin adress
Jag har hittat en del bra hjälp för att skapa transaktioner men de gör inte coinbase transaktioner, flera av dem säger att coinbase är mer komplex och bara relevant om du är miner, och är du miner kan du detta redan.....
|
|
|
Post by thomaslundqvist on May 20, 2018 20:20:20 GMT 1
Här är din coinbase nedbruten av mig:
02000000 versionnr 0001 segwitflagga 01 antal inputs 0000000000000000000000000000000000000000000000000000000000000000 txid alltid 0 för coinbase ffffffff input index alltid ffffffff för coinbase 05 scriptets längd är 5 (de nästföljande 5 bytes) 0267230101 input script, sista 0101 verkar lite överflödigt, första 3 är viktiga 02 (push 2) betyder att nästa 2 bytes ska läggas på stacken, dessa två bytes måste innehålla blocknumret (height), i exemplet är det 2367 (baklänges, little endian) vilket decimalt blir 0x2367 = 9063 vilket är blocket din coinbase hör till. ffffffff sequence, oftast ffffffff 02 2 st outputs 00f2052a01000000 output 0 värde (50 BTE, 0x000000012a05f200 = 5000000000 satoshis) 16 output 0 skriptlängd 0x16 = 22 bytes 00140800fb73ca9e74d58529ab58ead17a0eed952d1f script, 00 i början betyder segwit, P2WPKH, hash av din bc1 publika nyckel 0000000000000000 output 1 värde (markering för segwit, alltid 0) 26 output 1 längd 0x26 = 38 bytes 6a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf9 output 1 script, innehåller segwitmerkleroot 01 1 st witnessdata 20 witnessobjekt 1, 0x20 = 32 bytes 0000000000000000000000000000000000000000000000000000000000000000 typiskt 0 i coinbase 00000000 locktime
När du i ett block har endast coinbase blir witnessmerklerooten alltid samma. Dvs, hela output 1 kan återanvändas. Om du vill skicka 50 BTE till din miningadress blir output 0 helt identisk. Dvs, du kan lätt kopiera alla bytes från båda 2 outputs rakt av. Input-delen är också väldigt lik. Det enda som ändras i nya block är blockhöjden. Du behöver alltså enbart ändra 2 bytes i inputskriptet. Resten ska typiskt vara samma!
Går det att förstå tro?
|
|
|
Post by thomaslundqvist on May 20, 2018 20:26:50 GMT 1
Obs: nästa problem är att räkna ut txid (som är samma som merkle-rooten för tomma block). Då ska du hasha allt ovan förutom segwit-flaggan (2 bytes) samt witnessdatadelen (1 + 1 + 32 bytes, dvs sista 34 bytes innan de 4 sista locktime). Om du råkar hasha allting inklusive segwitdelarna får du segwits wtxid. Den behöver du inte räkna ut.
|
|
ric
New Member
Posts: 43
|
Post by ric on May 21, 2018 11:16:20 GMT 1
Tack för input!
Jag hinner inte kolla i detalj just nu men gör det och återkommer. Det verkar som att jag har det mesta rätt....
9063 var ett block som jag letat reda på som jag minat. Jag ska väl ta blockheight från blocktemplate + 1?
|
|
|
Post by thomaslundqvist on May 22, 2018 6:24:07 GMT 1
Det är bara att ta blockheight från template rakt av!
|
|
ric
New Member
Posts: 43
|
Post by ric on May 22, 2018 11:30:41 GMT 1
Det är bara att ta blockheight från template rakt av! Blockheight från template är väl det sista blocket och jag försöker ju skapa nästa???
|
|
|
Post by thomaslundqvist on May 23, 2018 6:07:54 GMT 1
Nix, den försöker vara vänlig och ge dig rätt siffra. Anropet är ju till för mining...
|
|
ric
New Member
Posts: 43
|
Post by ric on May 30, 2018 17:11:20 GMT 1
Obs: nästa problem är att räkna ut txid (som är samma som merkle-rooten för tomma block). Då ska du hasha allt ovan förutom segwit-flaggan (2 bytes) samt witnessdatadelen (1 + 1 + 32 bytes, dvs sista 34 bytes innan de 4 sista locktime). Om du råkar hasha allting inklusive segwitdelarna får du segwits wtxid. Den behöver du inte räkna ut. Hej! När jag "lägger ihop" dessa får jag "02000000010000000000000000000000000000000000000000000000000000000000000000ffffffff05ffffffff0200f2052a010000001600140800fb73ca9e74d58529ab58ead17a0eed952d1f00000000" Sedan kör jag encode() samt SHA256 hashar två gånger och får "b'\xdb\xe3\x01\xf2iTj\x89\n+\x9fT\xe9 \xbe\xa5\xf0\xab\xc47\xcc\x13\xea4\xbb\x9ar\x9d\xc7\r\xb2\xde'" vilket ser knasigt ut.....
|
|
|
Post by thomaslundqvist on Jun 1, 2018 6:52:37 GMT 1
Du har rensat bort för mycket, input ska vara med och alla outputs, enbart witnessflaggan och witnessobjekten sist ska bort... och sen får du inte glömma att omvandla till och från hexsiffror...
|
|
|
Post by tedskyvell on Jun 5, 2018 15:10:55 GMT 1
Är 6a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf9 merkelroten i coinbasen ovan? Eller är det bara en del av den?
|
|
|
Post by thomaslundqvist on Jun 5, 2018 18:20:46 GMT 1
Är 6a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf9 merkelroten i coinbasen ovan? Eller är det bara en del av den? En del av den är witness-merklerooten. OBS: inte den vanliga merklerooten, den finns enbart i block-headern. Witness-merklerooten räknas ut på samma sätt som vanliga rooten men man har med all witnessdata i transaktionerna när man räknar ut den (och coinbase räknas som txid 0 i beräkningen). Så här säger segwit-bip-0141 om innehållet: 1-byte - OP_RETURN (0x6a) 1-byte - Push the following 36 bytes (0x24) 4-byte - Commitment header (0xaa21a9ed) 32-byte - Commitment hash: Double-SHA256(witness root hash|witness reserved value) 39th byte onwards: Optional data with no consensus meaning Denna output är identisk för alla block som enbart har en coinbase-transaktion (eftersom alla coinbase har wtxid = 0 så witness root hash blir också alltid 0).
|
|
nikke
New Member
Posts: 30
|
Post by nikke on Jun 10, 2018 11:57:49 GMT 1
Så txid kan räknas ut genom att hasha "sin" coinbase tx - om man tar bort witnessdatan och byter height mot den senaste? Kan man också använda createrawtransaction för att få datan att hasha för txid?
|
|
|
Post by thomaslundqvist on Jun 10, 2018 17:11:37 GMT 1
Så txid kan räknas ut genom att hasha "sin" coinbase tx - om man tar bort witnessdatan och byter height mot den senaste? Kan man också använda createrawtransaction för att få datan att hasha för txid? Ja, bygg din coinbase först, ta bort witnessflaggan (2 bytes) och witnessdatan. Då kan du hasha fram txid som ju är samma som merklerooten för tomma block. Createrawtransaction blir konstigt. När man minar ska man bara använda färdigskapade transaktioner (från mempoolen) förutom coinbase som man enklast bygger själv (kopiera bytes från befintlig coinbase).
|
|
nikke
New Member
Posts: 30
|
Post by nikke on Jun 10, 2018 19:50:19 GMT 1
Ok, jag fick för mej att hex-datan man får tillbaks från createrawtransaction var användbar.
|
|
nikke
New Member
Posts: 30
|
Post by nikke on Jun 11, 2018 16:39:38 GMT 1
Byteskyfflandet vill sig inte. Går det att säga något om felet?
>>> decode.decodeBlock(block) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/m7/pyth/decode.py", line 174, in decodeBlock tx = Tx(raw) File "/m7/pyth/decode.py", line 87, in __init__ input = txInput(blockchain) File "/m7/pyth/decode.py", line 136, in __init__ self.scriptSig = blockchain.read(self.scriptLen) OverflowError: Python int too large to convert to C ssize_t
edit: bråkande blocket
>>> block b'\x00\x00\x00 \xb2(,k\x80\xc4\xb5~D\x04\x0f\x96$\xe1\xc8\xa0T(O\xf7\x15\x1b~d_\x83\x10\xd0\x00\x00\x00\x00}\xb5\xedEKl\xa8\xdf\xd6\n\x02\xae\xe9}\xe0\x9e\x97\xd91g\x82\xe9Ng\xffT+\x0b\x03\xc0\xbe\x89\x08\x95\x1e[\xff\xff\x00\x1d\x00\x00\x00\x00\x02\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x06\x02:\xf4\x02\xe5%\xff\xff\xff\xff\x02\x00\xf2\x05*\x01\x00\x00\x00\x17\xa9\x14\xa84\xe0\x95@\xa7f\x9d\xaf\xde\xf4\xb8\nQ\ny1.\x08[\x87\x00\x00\x00\x00\x00\x00\x00\x00&j$\xaa!\xa9\xed\xe2\xf6\x1c?q\xd1\xde\xfd?\xa9\x99\xdf\xa3iSu\\i\x06\x89y\x99b\xb4\x8b\xeb\xd86\x97N\x8c\xf9\x01 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Det verkar en byte kortare än det jag minade. Om man tar getrawtransaction får man 172 bytes och headern är alltid 80. På det block jag minat är det 01 mellan header och tx, vad är det? Om jag lägger till det kan jag decoda åtm.
|
|