geir
New Member
Posts: 9
|
Post by geir on May 2, 2018 21:59:29 GMT 1
Hej, Hmmm - jag tror inte jag riktigt förstår hur det funkar med APIet... Nu får jag fel när jag försöker signa: def make_sign_raw_transaction_call(id, txid, vout, address, amount): param1 = str(id) param2 = {"txid": str(txid), "vout": int(vout)} payload = { "method": "signrawtransaction", "params": [param1, param2] } I detta fall använder jag en transaction som input som finns i plånboken så då behövs ingen nyckel? {'result': None, 'error': {'code': -3, 'message': 'Expected type array, got object'}, 'id': None} createRawTransaction förväntar att du skickar en input och en output. I ditt fall är param2 din input (som också behöver att ha ett par [] runt sig) och output ska vara en array av address(er) och amount, som så: output = {address: amount}
|
|
l8
New Member
Posts: 31
|
Post by l8 on May 6, 2018 15:03:17 GMT 1
Jag börjar se ljuset i tunneln men jag skulle behöva lite bitcons i olika transaktioner för att enklare kunna göra klart labben... Jag har minat fram en del men det är så otroligt tidsödande...:-)
|
|
s
New Member
1SeanW4LgPMph7N5g5ZT38bEoHXQU4dn6
Posts: 31
|
Post by s on May 6, 2018 17:30:39 GMT 1
Är 3DbKxfVkkctv3LdMzSiZj7PaJ1WLtP6Vbq din? Två inkommande tx på gång.
Jag kämpar här med "createrawtransaction" som i mitt automatiserade test ger felmeddelande: RPC error: {'code': -3, 'message': 'Expected type array, got string'}
Jag har: inputs = [{'txid': '32803a854ef999a07a5e863d9a59ec7b969d7e1fd5721fa206fe7d84bf5db0f7', 'vout': 0}, {'txid': '32803a854ef999a07a5e863d9a59ec7b969d7e1fd5721fa206fe7d84bf5db0f7', 'vout': 1}] summa coins i inputs = 48.9 outputs = {'1KhroVeXUs8QjVUVpi4JGKbCvXwSBARmVX': 45.85982874}
och anropar createrawtransaction med "method": "createrawtransaction", "params": [inputs, outputs]
|
|
l8
New Member
Posts: 31
|
Post by l8 on May 6, 2018 18:27:30 GMT 1
Japp, Tack! Jag ska se om jag kan hjälpa dig med frågan!
|
|
l8
New Member
Posts: 31
|
Post by l8 on May 6, 2018 18:35:04 GMT 1
Jag har aldrig provat skicka två inputs men det är inte så att du behöver få var change summan ska skickas också i outputten?
param2 = {str(data["to_address"]): float(data["amount"]), str(data["change_address"]): float(data["rest_amount"])} där jag räknat ut rest_amount till rest_amount = float(amount) - float(spend_amount) - float(fee)
där amount är tillgänglig summa för den txid, spend_amount är den summa som jag matat in som användare och fee är avgiften som användaren matat in?
|
|
l8
New Member
Posts: 31
|
Post by l8 on May 6, 2018 18:40:19 GMT 1
Jag blir inte riktigt klok på mina outputs och hr jag kan spendera dessa: listunspent ger följande: +------------------------------------------------------------------+------+------------+------------------------------------+ | txid | vout | amount | address | +------------------------------------------------------------------+------+------------+------------------------------------+ | 9d6ab027f1ba079a58183e9c0142fb6f0bb6a5493592013455295d5253d29b35 | 1 | 0.35 | 3DbKxfVkkctv3LdMzSiZj7PaJ1WLtP6Vbq | | 7a610937c9d4921d18140c448adc3972d38677ae276ff5463ab734d2347bf68f | 1 | 2.94 | 3DbKxfVkkctv3LdMzSiZj7PaJ1WLtP6Vbq | | 795ecceb1eebab18d6d2f5b234e69aebeff5237a06c99f19450b836933782999 | 1 | 1.02 | 3DbKxfVkkctv3LdMzSiZj7PaJ1WLtP6Vbq | | 9c080c28079f3b41561c9579aefd53ff6962118a42396d63223dbfd3f50e74bc | 0 | 5.0 | 3GAmtV63EWDmUvHuDGEHhGW2M3zQS82Bnd | | 9c080c28079f3b41561c9579aefd53ff6962118a42396d63223dbfd3f50e74bc | 1 | 46.5280344 | 3BNK5f7HmzuR1ihkTukTZL1WmGSavrx4qL | +------------------------------------------------------------------+------+------------+------------------------------------+ Sen försöker jag fråga efter första transactionen: {'method': 'gettransaction', 'params': ['9d6ab027f1ba079a58183e9c0142fb6f0bb6a5493592013455295d5253d29b35']} L8 response: {'result': {'amount': -0.1, 'fee': -0.006, 'confirmations': 2, 'blockhash': '000000000774da3b13edd7d621c866d2c8e522ca48c239529fa1bd13c0e05d0a', 'blockindex': 3, 'blocktime': 1525627041, 'txid': '9d6ab027f1ba079a58183e9c0142fb6f0bb6a5493592013455295d5253d29b35', 'walletconflicts': [], 'time': 1525625836, 'timereceived': 1525625836, 'bip125-replaceable': 'no', 'details': [{'account': '', 'address': '1MdSAM4fqsScDf3DPDHZuFytTFm8o9xu45', 'category': 'send', 'amount': -0.1, 'vout': 0, 'fee': -0.006, 'abandoned': False}, {'account': '', 'address': '3DbKxfVkkctv3LdMzSiZj7PaJ1WLtP6Vbq', 'category': 'send', 'amount': -0.35, 'label': '', 'vout': 1, 'fee': -0.006, 'abandoned': False}, {'account': '', 'address': '3DbKxfVkkctv3LdMzSiZj7PaJ1WLtP6Vbq', 'category': 'receive', 'amount': 0.35, 'label': '', 'vout': 1}], 'hex': '020000000001016c5a337a0465b2f70f720562acd3a7e087f4eae846d59dc695b79e08091fad500100000017160014d31761eb50a83aa360a763b03ae5df95be8ae907ffffffff0280969800000000001976a914e2467e66fd924017beb98330ffb106ad1ab32a8288acc00e16020000000017a914828e11de7ace0b5db9adbcd853b735264a7aa0128702483045022100e8533b3d0134bc661530a5e463f2d650135bf78cd6d2aec6dc09d8bf9d92f9810220143cb9e9db318b25be16a2d0450e9e0a302cc44b0bc9e925c1394c1a049ca6190121026503bca68a018e465b1922e0587ebd6539fc4b8efaa469dcef216ab221083b1c00000000'}, 'error': None, 'id': None} {'amount': -0.1, 'fee': -0.006, 'confirmations': 2, 'blockhash': '000000000774da3b13edd7d621c866d2c8e522ca48c239529fa1bd13c0e05d0a', 'blockindex': 3, 'blocktime': 1525627041, 'txid': '9d6ab027f1ba079a58183e9c0142fb6f0bb6a5493592013455295d5253d29b35', 'walletconflicts': [], 'time': 1525625836, 'timereceived': 1525625836, 'bip125-replaceable': 'no', 'details': [{'account': '', 'address': '1MdSAM4fqsScDf3DPDHZuFytTFm8o9xu45', 'category': 'send', 'amount': -0.1, 'vout': 0, 'fee': -0.006, 'abandoned': False}, {'account': '', 'address': '3DbKxfVkkctv3LdMzSiZj7PaJ1WLtP6Vbq', 'category': 'send', 'amount': -0.35, 'label': '', 'vout': 1, 'fee': -0.006, 'abandoned': False}, {'account': '', 'address': '3DbKxfVkkctv3LdMzSiZj7PaJ1WLtP6Vbq', 'category': 'receive', 'amount': 0.35, 'label': '', 'vout': 1}], 'hex': '020000000001016c5a337a0465b2f70f720562acd3a7e087f4eae846d59dc695b79e08091fad500100000017160014d31761eb50a83aa360a763b03ae5df95be8ae907ffffffff0280969800000000001976a914e2467e66fd924017beb98330ffb106ad1ab32a8288acc00e16020000000017a914828e11de7ace0b5db9adbcd853b735264a7aa0128702483045022100e8533b3d0134bc661530a5e463f2d650135bf78cd6d2aec6dc09d8bf9d92f9810220143cb9e9db318b25be16a2d0450e9e0a302cc44b0bc9e925c1394c1a049ca6190121026503bca68a018e465b1922e0587ebd6539fc4b8efaa469dcef216ab221083b1c00000000'}
Nu är helt plötsligt amount negativt och sen gr det ju inte något bra att skicka bitcoins därifrån... så är det med alla mina transactioner...
|
|
l8
New Member
Posts: 31
|
Post by l8 on May 6, 2018 20:51:25 GMT 1
Tack! Behöver jag ha med någonting annat än transactionsid och privata nyckeln när jag signar? if private_key is None: param1 = [trans_id] else: param1 = [trans_id][private_key] sign_raw_transaction = make_rpc_call("signrawtransaction", param1)
Detta funkar bra när jag använder bitcoins i plånboken, då jag har satt private_key None. Däremot tror jag inte det funkar när jag använder mina egengenererade adresser och måste skicka med privata nyckeln... Min tanke var att först plocka coins ur plånboken och skicka till min första egengenererade adress. Detta verkar funka bra. Sen tänkte jag skicka vidare till ytterligare en egengenererad adress men det går inte pga sign går fel... Nu har jag dessutom lyckats göra mig av med mina coins igen... :-(
|
|
s
New Member
1SeanW4LgPMph7N5g5ZT38bEoHXQU4dn6
Posts: 31
|
Post by s on May 6, 2018 21:12:10 GMT 1
Tips: kolla ['category'] på de som har negativ amount. Med RPC-anropet gettransaction kan man få ut inputs och outputs, och bland outputs kan vissa vara ej spenderbara - det har jag nog själv inte sett till att filtrera bort.
PS. Tack för uppmärksamhet på outputs - jag hade två fel (felfiltrerade category 'generate' samt missade kolla summa inputs > 0) och hamnade i optimeringsfallet där en växeladress i outputs går hoppa över. Med det fixat är jag tillbaks i att endast (tror jag) ha fel i hur signrawtransaction anropas. Det fungerar om jag inte lägger med några parametrar utöver rawtx som hex string (dvs för nycklar som är kända). Så jag måste göra något fel i formateringen eller ordningen av parametrar gör jag fel på för egenskapade nycklar.
|
|
s
New Member
1SeanW4LgPMph7N5g5ZT38bEoHXQU4dn6
Posts: 31
|
Post by s on May 6, 2018 22:11:55 GMT 1
Tips: Får man felmeddelandet "Invalid amount" så kan det handla om precisionsfel i float. Specifikt, om jag försöker spendera 3.14 så går det inte, men 3.141 eller 3.1 går bra. En sån sak kan man fastna på en stund.
|
|
s
New Member
1SeanW4LgPMph7N5g5ZT38bEoHXQU4dn6
Posts: 31
|
Post by s on May 6, 2018 22:14:54 GMT 1
|
|
s
New Member
1SeanW4LgPMph7N5g5ZT38bEoHXQU4dn6
Posts: 31
|
Post by s on May 6, 2018 23:53:23 GMT 1
På bitcoin.stackexchange.com/questions/32148/why-is-the-scriptpubkey-required-when-using-signrawtransaction beskrivs att parametern scriptPubKey i `createrawtransaction` egentligen inte behövs (gäller för redan mine:ade transaktioner) utan beräknas fram. Jag försökte naivt räkna från bitcoinadress till scriptPubKey hex (med Vitaliks pybitcointools, lite klurigt gömda på github.com/vbuterin/pybitcointools). Någon gjorde upptäckter ang. magiska bytes för att gå i omvänd riktninghär bitcoin.stackexchange.com/questions/46337/from-b58check-to-hex-and-backMen b58check_to_hex(bitcoinadress) => '2973e7d2252363a7ef0a90064d60ff8f9fc76771' (som inte är vad jag behöver... felmeddelandet jag fick i detta läget var dessutom rejält underligt). Insikten är att b58check_to_hex (dvs bitcoinadressen konverterad till hexadecimal form) ger den publika nyckeln, medan en bitcoin-output (en vout eller TXO) är ett script runt denna publika nyckel. Kompositionen decodetransation·getrawtransaction - dvs två RCP-anrop decoderawtransaction(getrawtransaction(transaktionsid)) ger 'vout': [{'value': 50.0000332, 'n': 0, 'scriptPubKey': {'asm': 'OP_HASH160 2973e7d2252363a7ef0a90064d60ff8f9fc76771 OP_EQUAL', 'hex': 'a9142973e7d2252363a7ef0a90064d60ff8f9fc7677187', 'reqSigs': 1, 'type': 'scripthash', 'addresses': [...bitcoinadress...]}
Tack vare att man får samma vout-numrering, så går det få rätt scriptPubKey via ['vout'][samma_vout_siffra]['scriptPubKey']['hex'] -- och har nu kanske äntligen rett ut alla buggar för att klara enkla transaktioner...puh!
|
|
|
Post by thomaslundqvist on May 7, 2018 5:58:32 GMT 1
Småtips:
- l8: Gör en manuell betalning först där du delar upp dina pengar i massa små så har du massa outputs och leka med...
- scriptPubKey är onödigt om man signerar en befintlig output som redan finns i kedjan, noden letar själv upp den gamla outputen
- float-värden är luriga. De har ibland för många decimaler (pga avrundningseffekter). Bitcoinvärden får max ha 8 decimaler (hela satoshis). round-funktionen är användbar.
|
|
|
Post by thomaslundqvist on May 7, 2018 6:07:49 GMT 1
Jag blir inte riktigt klok på mina outputs och hr jag kan spendera dessa: listunspent ger följande: +------------------------------------------------------------------+------+------------+------------------------------------+ | txid | vout | amount | address | +------------------------------------------------------------------+------+------------+------------------------------------+ | 9d6ab027f1ba079a58183e9c0142fb6f0bb6a5493592013455295d5253d29b35 | 1 | 0.35 | 3DbKxfVkkctv3LdMzSiZj7PaJ1WLtP6Vbq | | 7a610937c9d4921d18140c448adc3972d38677ae276ff5463ab734d2347bf68f | 1 | 2.94 | 3DbKxfVkkctv3LdMzSiZj7PaJ1WLtP6Vbq | | 795ecceb1eebab18d6d2f5b234e69aebeff5237a06c99f19450b836933782999 | 1 | 1.02 | 3DbKxfVkkctv3LdMzSiZj7PaJ1WLtP6Vbq | | 9c080c28079f3b41561c9579aefd53ff6962118a42396d63223dbfd3f50e74bc | 0 | 5.0 | 3GAmtV63EWDmUvHuDGEHhGW2M3zQS82Bnd | | 9c080c28079f3b41561c9579aefd53ff6962118a42396d63223dbfd3f50e74bc | 1 | 46.5280344 | 3BNK5f7HmzuR1ihkTukTZL1WmGSavrx4qL | +------------------------------------------------------------------+------+------------+------------------------------------+ Du kan använda dessa ovan för att spendera men dessa är plånbokens outputs där plånboken ansvarar för de privata nycklarna. Det är bättre att du först gör manuella överföringar till dina egengenererade adresser som ditt program har de privata nycklarna till. För att spendera en tidigare output behöver du ju den privata nyckeln som hör till output-adressen.
|
|
l8
New Member
Posts: 31
|
Post by l8 on May 7, 2018 16:10:48 GMT 1
Du menar att jag först genererar ett gäng egna adresser. Sen skickar jag från min plånbok till dessa adresser som jag sedan använder i mitt program (med typ hårdkodad lista på adresser och nycklar)?
|
|
l8
New Member
Posts: 31
|
Post by l8 on May 7, 2018 20:07:20 GMT 1
Det är något jag inte alls förstår med egengenererade samt plånboksadresser... Jag genererar en ny adress och skickar sen från plånboken (via Bitcoin EDU) till min egna adress. Om jag sen gör listtransactions i mitt program så ser jag transaktionen där fast med negativ amount. Visar "listtransactions" bara det som finns (inte finns i detta fall) i plånboken? Om jag sedan ska langa detta vidare så funkar det inte jättebra med en negativ summa tänker jag... Hur ser jag vad jag har tillgängligt ¨på min egengenererade adress? (getreceivedbyaddress returnerar bara att den inte finns i plånboken...).
|
|