Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. Edit: instrukcja krok po kroku, jak to zrobić na przykładzie lokalnej sieci testowej (regtest), użyte monety są bezwartościowe, więc świetnie nadają się do wszelkich testów:
  2.  
  3. [code]./bitcoin-qt -regtest -choosedatadir -port=18445[/code]
  4. Ta komenda umożliwia wystartowanie klienta Bitcoin Core w trybie regtest i wybranie osobnego folderu do testów (żeby nie ruszać niczego w normalnie używanym portfelu, na wszelki wypadek). Należy wywołać taką komendę z dwoma różnymi portami, przykładowo 18445 oraz 18446 oraz z dwoma różnymi katalogami, na przykład pod Linuksem może to być "/home/user/.bitcoin2" oraz "/home/user/.bitcoin3", ścieżka dowolna, byleby mieć dwa różne foldery. Wszystko po to, aby mieć dwa osobne programy i zobaczyć, jak działają transakcje pomiędzy nimi.
  5.  
  6. Następnie klikamy Window->Console w pierwszym kliencie i możemy wpisywać komendy w konsoli. Generujemy sobie nowy adres:
  7. [code]getnewaddress "górnik" "bech32"
  8. bcrt1qtvuj00ytwvcljqnz4vnkw4l09f050el0slqcy9
  9. dumpprivkey bcrt1qtvuj00ytwvcljqnz4vnkw4l09f050el0slqcy9
  10. cVjmuhoNseAxZgLC9PLDikF6r4JoewgTqc6vBcx1TxFyZEMbg2DS[/code]
  11.  
  12. Teraz potrzebujemy jakichkolwiek środków do testów, więc wykopujemy 101 bloków:
  13. [code]generatetoaddress 101 "bcrt1qtvuj00ytwvcljqnz4vnkw4l09f050el0slqcy9"[/code]
  14.  
  15. To nam pozwoli uzyskać 50 testowych monet. Nowe monety wymagają 100 potwierdzeń, aby mogły zostać użyte, zatem potrzebujemy co najmniej 101 bloków, aby mieć cokolwiek. Najpierw jednak warto podłączyć się do drugiego klienta, aby zobaczyć, czy będzie w stanie odebrać nasze świeżo wygenerowane bloki:
  16. [code]addnode "127.0.0.1" "add"[/code]
  17. [code]addnode "127.0.0.1:18445" "add"[/code]
  18. [code]addnode "127.0.0.1:18446" "add"[/code]
  19.  
  20. Możemy podać samo IP, możemy również podać port. Wywołanie tych trzech komend na obu klientach powinno zagwarantować nawiązanie połączenia. Klikając Window->Peers powinniśmy zobaczyć w każdym kliencie tego drugiego. Jeśli oba węzły są zsynchronizowane, to w prawym dolnym rogu powinno pojawić się jedno połączenie (zamiast zera) oraz klient, który nie wykopał żadnych bloków, powinien być zsynchronizowany, a nie opóźniony o kilka lat względem obecnego stanu sieci.
  21.  
  22. Moglibyśmy mieć trzy węzły testowe (lub więcej), aby uzyskać jeszcze bardziej realistyczne testy i odróżnić górnika od emeryta oraz giełdy/banku/kantoru, ale dwa nam wystarczą do przeprowadzenia tych transakcji. Żeby mieć sytuację podobną do obecnej, możemy utworzyć sto transakcji, które wyślą część z tych nowo wykopanych monet na kolejne adresy. Można to zrobić ręcznie klikając przycisk "Send" lub z konsoli.
  23.  
  24. Żeby zachować prywatność, same adresy powinny być kolejnymi adresami z HD walleta, czyli powinniśmy mieć sto różnych adresów, używać różnych transakcji coinbase jako wejść i ogólnie powinno być tego wszystkiego więcej, aby odzwierciedlić realną sytuację. Moglibyśmy również akumulować monety na jednym adresie, przesyłać monety pomiędzy sobą oraz stosować inne techniki, aby ostatecznie mieć wszystko na jednym wyjściu. W praktyce autor tematu użył jednego adresu, na których ma wiele wyjść z różnych transakcji, zatem w tych testach zrobię tak samo. Liczba monet na poszczególnych wyjściach również powinna być różna, gdyż to zależy od kursu. Ponieważ jednak chcę jedynie pokazać uproszczoną wersję, użyję jednego nowego adresu i włożę sto razy po 0.10 monety.
  25.  
  26. [code]getnewaddress "emerytura" "bech32"
  27. bcrt1q392uzkj22u6gzfhurflc378sd0sae9dx4ytnnx
  28. dumpprivkey "bcrt1q392uzkj22u6gzfhurflc378sd0sae9dx4ytnnx"
  29. cSDXZud1xWh6uzntT98hcda5TZ4aVxzxn6LuQWfpknXHxmuHpuxJ[/code]
  30.  
  31. Uzyskujemy hash transakcji, która zawiera nasze monety. Ponieważ jest to transakcja coinbase, należy dobrać się do wykopanego bloku. Podczas generowania bloków górnik jest w stanie dostać hash wygenerowanego bloku, jesteśmy w stanie również sprawdzić hash transakcji klikając na przycisk "Transactions" i wybierając "Copy Transaction ID". Możemy również zrobić to z konsoli, patrząc na pierwszy wykopany blok, który ma już 100 potwierdzeń i może zostać wydany:
  32.  
  33. [code]getblockhash 1
  34. 4ed67a8e8f290b4db5fce33e02b5ccf6b18d09c9b5eb856eeccff7ace55f639e
  35. getblock 4ed67a8e8f290b4db5fce33e02b5ccf6b18d09c9b5eb856eeccff7ace55f639e
  36. {
  37. "hash": "4ed67a8e8f290b4db5fce33e02b5ccf6b18d09c9b5eb856eeccff7ace55f639e",
  38. "confirmations": 101,
  39. "strippedsize": 213,
  40. "size": 249,
  41. "weight": 888,
  42. "height": 1,
  43. "version": 536870912,
  44. "versionHex": "20000000",
  45. "merkleroot": "b5a899b2354a3404a0095746dd015530b1030353092f000bfb98a3e985591c6f",
  46. "tx": [
  47. "b5a899b2354a3404a0095746dd015530b1030353092f000bfb98a3e985591c6f"
  48. ],
  49. "time": 1606642869,
  50. "mediantime": 1606642869,
  51. "nonce": 0,
  52. "bits": "207fffff",
  53. "difficulty": 4.656542373906925e-10,
  54. "chainwork": "0000000000000000000000000000000000000000000000000000000000000004",
  55. "nTx": 1,
  56. "previousblockhash": "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206",
  57. "nextblockhash": "68abfe10e1bcfcc6b63d51db88f1127ab26f93b34b7b02b767c1c8d28bdd9c56"
  58. }
  59. gettransaction b5a899b2354a3404a0095746dd015530b1030353092f000bfb98a3e985591c6f
  60. {
  61. "amount": 50.00000000,
  62. "confirmations": 101,
  63. "generated": true,
  64. "blockhash": "4ed67a8e8f290b4db5fce33e02b5ccf6b18d09c9b5eb856eeccff7ace55f639e",
  65. "blockheight": 1,
  66. "blockindex": 0,
  67. "blocktime": 1606642869,
  68. "txid": "b5a899b2354a3404a0095746dd015530b1030353092f000bfb98a3e985591c6f",
  69. "walletconflicts": [
  70. ],
  71. "time": 1606642869,
  72. "timereceived": 1606642869,
  73. "bip125-replaceable": "no",
  74. "details": [
  75. {
  76. "address": "bcrt1qtvuj00ytwvcljqnz4vnkw4l09f050el0slqcy9",
  77. "category": "generate",
  78. "amount": 50.00000000,
  79. "label": "górnik",
  80. "vout": 0
  81. }
  82. ],
  83. "hex": "020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03510101ffffffff0200f2052a010000001600145b3927bc8b7331f90262ab276757ef2a5f47e7ef0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000"
  84. }[/code]
  85. Hash transakcji z tego bloku powinien być identyczny z tym, jaki uzyskamy przez interfejs graficzny, klikając na przycisk "Transactions". Komenda "gettransaction" pozwoli dowiedzieć się, który numer wyjścia jest nasz. W realnym przypadku takie rzeczy są również widoczne w różnych block explorerach. Wysyłając transakcję za pomocą przycisku "Send" klient w wersji graficznej będzie w stanie sam ustalić takie rzeczy, robiąc to z konsoli musimy ręcznie znaleźć potrzebne dane i samodzielnie je poskładać.
  86.  
  87. [code]createrawtransaction "[{\"txid\":\"b5a899b2354a3404a0095746dd015530b1030353092f000bfb98a3e985591c6f\",\"vout\":0}]" "[{\"bcrt1q392uzkj22u6gzfhurflc378sd0sae9dx4ytnnx\":0.10000000},{\"bcrt1qtvuj00ytwvcljqnz4vnkw4l09f050el0slqcy9\":49.89999000}]"
  88. 02000000016f1c5985e9a398fb0b002f09530303b1305501dd465709a004344a35b299a8b50000000000ffffffff0280969800000000001600148955c15a4a57348126fc1a7f88f8f06be1dc95a698576d29010000001600145b3927bc8b7331f90262ab276757ef2a5f47e7ef00000000
  89. decoderawtransaction 02000000016f1c5985e9a398fb0b002f09530303b1305501dd465709a004344a35b299a8b50000000000ffffffff0280969800000000001600148955c15a4a57348126fc1a7f88f8f06be1dc95a698576d29010000001600145b3927bc8b7331f90262ab276757ef2a5f47e7ef00000000
  90. {
  91. "txid": "d423be86d0f5d5653a6dc50aaa417c4c7eb4c6c162cbb91c4d9c3d4e5cfec0b7",
  92. "hash": "d423be86d0f5d5653a6dc50aaa417c4c7eb4c6c162cbb91c4d9c3d4e5cfec0b7",
  93. "version": 2,
  94. "size": 113,
  95. "vsize": 113,
  96. "weight": 452,
  97. "locktime": 0,
  98. "vin": [
  99. {
  100. "txid": "b5a899b2354a3404a0095746dd015530b1030353092f000bfb98a3e985591c6f",
  101. "vout": 0,
  102. "scriptSig": {
  103. "asm": "",
  104. "hex": ""
  105. },
  106. "sequence": 4294967295
  107. }
  108. ],
  109. "vout": [
  110. {
  111. "value": 0.10000000,
  112. "n": 0,
  113. "scriptPubKey": {
  114. "asm": "0 8955c15a4a57348126fc1a7f88f8f06be1dc95a6",
  115. "hex": "00148955c15a4a57348126fc1a7f88f8f06be1dc95a6",
  116. "reqSigs": 1,
  117. "type": "witness_v0_keyhash",
  118. "addresses": [
  119. "bcrt1q392uzkj22u6gzfhurflc378sd0sae9dx4ytnnx"
  120. ]
  121. }
  122. },
  123. {
  124. "value": 49.89999000,
  125. "n": 1,
  126. "scriptPubKey": {
  127. "asm": "0 5b3927bc8b7331f90262ab276757ef2a5f47e7ef",
  128. "hex": "00145b3927bc8b7331f90262ab276757ef2a5f47e7ef",
  129. "reqSigs": 1,
  130. "type": "witness_v0_keyhash",
  131. "addresses": [
  132. "bcrt1qtvuj00ytwvcljqnz4vnkw4l09f050el0slqcy9"
  133. ]
  134. }
  135. }
  136. ]
  137. }[/code]
  138.  
  139. Pierwsze wyjście tej transakcji to nasza emerytura, drugie trafia na adres górnika (który mógłby być inny w realnym przypadku, ale tutaj upraszczam pewne kwestie, aby pokazać najprostszy scenariusz). Tutaj zakładam opłatę od transakcji wynoszącą 1000 satoshi, w realnym przypadku mogłaby być mniejsza, klient graficzny jest w stanie to policzyć, wziąć rozmiar całości w bajtach i odpowiednio to skorygować. Teraz taką transakcję należy podpisać.
  140.  
  141. [code]signrawtransactionwithkey "02000000016f1c5985e9a398fb0b002f09530303b1305501dd465709a004344a35b299a8b50000000000ffffffff0280969800000000001600148955c15a4a57348126fc1a7f88f8f06be1dc95a698576d29010000001600145b3927bc8b7331f90262ab276757ef2a5f47e7ef00000000" "[\"cVjmuhoNseAxZgLC9PLDikF6r4JoewgTqc6vBcx1TxFyZEMbg2DS\"]"
  142. {
  143. "hex": "020000000001016f1c5985e9a398fb0b002f09530303b1305501dd465709a004344a35b299a8b50000000000ffffffff0280969800000000001600148955c15a4a57348126fc1a7f88f8f06be1dc95a698576d29010000001600145b3927bc8b7331f90262ab276757ef2a5f47e7ef0247304402203eac34bf61e88e8f897452916452a28873abe43e2b2b8d34761299ed67366ddf022007eb4bd3c65b73772de5886cb9e4dfa6ca62dfca5775e11c5d5e042a77ea29a30121034039b14e1e204a620cbfca0c29a1e341b01489603d90a7759bd66faea13dd54d00000000",
  144. "complete": true
  145. }
  146. decoderawtransaction 020000000001016f1c5985e9a398fb0b002f09530303b1305501dd465709a004344a35b299a8b50000000000ffffffff0280969800000000001600148955c15a4a57348126fc1a7f88f8f06be1dc95a698576d29010000001600145b3927bc8b7331f90262ab276757ef2a5f47e7ef0247304402203eac34bf61e88e8f897452916452a28873abe43e2b2b8d34761299ed67366ddf022007eb4bd3c65b73772de5886cb9e4dfa6ca62dfca5775e11c5d5e042a77ea29a30121034039b14e1e204a620cbfca0c29a1e341b01489603d90a7759bd66faea13dd54d00000000
  147. {
  148. "txid": "d423be86d0f5d5653a6dc50aaa417c4c7eb4c6c162cbb91c4d9c3d4e5cfec0b7",
  149. "hash": "2b7f31ba7a88b695786084260f510755699c9dd25b3d4722a2ddca9b4cd887e5",
  150. "version": 2,
  151. "size": 222,
  152. "vsize": 141,
  153. "weight": 561,
  154. "locktime": 0,
  155. "vin": [
  156. {
  157. "txid": "b5a899b2354a3404a0095746dd015530b1030353092f000bfb98a3e985591c6f",
  158. "vout": 0,
  159. "scriptSig": {
  160. "asm": "",
  161. "hex": ""
  162. },
  163. "txinwitness": [
  164. "304402203eac34bf61e88e8f897452916452a28873abe43e2b2b8d34761299ed67366ddf022007eb4bd3c65b73772de5886cb9e4dfa6ca62dfca5775e11c5d5e042a77ea29a301",
  165. "034039b14e1e204a620cbfca0c29a1e341b01489603d90a7759bd66faea13dd54d"
  166. ],
  167. "sequence": 4294967295
  168. }
  169. ],
  170. "vout": [
  171. {
  172. "value": 0.10000000,
  173. "n": 0,
  174. "scriptPubKey": {
  175. "asm": "0 8955c15a4a57348126fc1a7f88f8f06be1dc95a6",
  176. "hex": "00148955c15a4a57348126fc1a7f88f8f06be1dc95a6",
  177. "reqSigs": 1,
  178. "type": "witness_v0_keyhash",
  179. "addresses": [
  180. "bcrt1q392uzkj22u6gzfhurflc378sd0sae9dx4ytnnx"
  181. ]
  182. }
  183. },
  184. {
  185. "value": 49.89999000,
  186. "n": 1,
  187. "scriptPubKey": {
  188. "asm": "0 5b3927bc8b7331f90262ab276757ef2a5f47e7ef",
  189. "hex": "00145b3927bc8b7331f90262ab276757ef2a5f47e7ef",
  190. "reqSigs": 1,
  191. "type": "witness_v0_keyhash",
  192. "addresses": [
  193. "bcrt1qtvuj00ytwvcljqnz4vnkw4l09f050el0slqcy9"
  194. ]
  195. }
  196. }
  197. ]
  198. }[/code]
  199.  
  200. Mając podpisaną transakcję, możemy również sprawdzić przed wysłaniem, czy mempool ją zaakceptuje w oparciu o domyślne reguły. To może być pomocne przy ustalaniu minimalnej akceptowalnej opłaty przy konkretnej transakcji. W ten sposób możemy również sprawdzić więcej niż jedną transakcję naraz, wymieniając ich szesnastkową postać po przecinku.
  201.  
  202. [code]testmempoolaccept "[\"020000000001016f1c5985e9a398fb0b002f09530303b1305501dd465709a004344a35b299a8b50000000000ffffffff0280969800000000001600148955c15a4a57348126fc1a7f88f8f06be1dc95a698576d29010000001600145b3927bc8b7331f90262ab276757ef2a5f47e7ef0247304402203eac34bf61e88e8f897452916452a28873abe43e2b2b8d34761299ed67366ddf022007eb4bd3c65b73772de5886cb9e4dfa6ca62dfca5775e11c5d5e042a77ea29a30121034039b14e1e204a620cbfca0c29a1e341b01489603d90a7759bd66faea13dd54d00000000\"]"
  203. [
  204. {
  205. "txid": "d423be86d0f5d5653a6dc50aaa417c4c7eb4c6c162cbb91c4d9c3d4e5cfec0b7",
  206. "allowed": true
  207. }
  208. ][/code]
  209.  
  210. Skoro już wiadomo, że transakcja jest akceptowalna, to możemy ją wysłać.
  211.  
  212. [code]sendrawtransaction "020000000001016f1c5985e9a398fb0b002f09530303b1305501dd465709a004344a35b299a8b50000000000ffffffff0280969800000000001600148955c15a4a57348126fc1a7f88f8f06be1dc95a698576d29010000001600145b3927bc8b7331f90262ab276757ef2a5f47e7ef0247304402203eac34bf61e88e8f897452916452a28873abe43e2b2b8d34761299ed67366ddf022007eb4bd3c65b73772de5886cb9e4dfa6ca62dfca5775e11c5d5e042a77ea29a30121034039b14e1e204a620cbfca0c29a1e341b01489603d90a7759bd66faea13dd54d00000000"
  213. d423be86d0f5d5653a6dc50aaa417c4c7eb4c6c162cbb91c4d9c3d4e5cfec0b7[/code]
  214.  
  215. Podobnie możemy postąpić jeszcze sto razy, same komendy są identyczne, kwestia ich powtórzenia. Możemy również zobaczyć, jakie monety mamy do dyspozycji i zarządzać każdą monetą osobno z poziomu interfejsu graficznego. Klikamy Settings->Options->Wallet i zaznaczamy opcję "Enable coin control features". Dzięki temu po kliknięciu "Send" zobaczymy napis "Coin control features" i pojawi się przycisk "Inputs...", który umożliwi wybranie konkretnych monet. W ten sposób jesteśmy w stanie wybrać odpowiednie wejścia transakcji, a dalej klasycznie możemy wybrać wyjścia, opłatę od transakcji i to w zasadzie umożliwi nam skonstruowanie transakcji z dowolnymi wejściami, wyjściami i opłatami z poziomu interfejsu graficznego.
  216.  
  217. Warto również pamiętać, że samo utworzenie stu różnych transakcji z emeryturą zadzieje się "samo", ze względu na zlecenie stałe. Wygenerowanie tego wszystkiego z konsoli bądź z interfejsu graficznego jest potrzebne jedynie po to, aby uzyskać identyczną sytuację przy testach. Dalsze działania są analogiczne bez względu na liczbę wyjść i transakcji, z jakimi będziemy mieli do czynienia, zatem w tym przykładzie wystarczą nam jedynie trzy wejścia, aby pokazać, co zrobić z tym dalej.
  218.  
  219. Możliwości są różne, teraz zależy od nas dokładnie, co chcemy uzyskać. Samo wygenerowanie stu transakcji jest analogiczne do tego, co pokazałem wyżej. Potrzeba jedynie podmienić dane użyte do transakcji. To wystarczy do wygenerowania stu transakcji, ustawienia ich na jakimś komputerze i wysyłania ich co miesiąc bez znajomości kluczy prywatnych. Do wysłania transakcji nie trzeba mieć zainstalowanego klienta Bitcoin Core, choć da się też i w ten sposób. Są strony WWW, gdzie wystarczy wkleić szesnastkową postać transakcji i kliknąć "wyślij", niczego więcej tu nie potrzeba.
  220.  
  221. Żeby jednak takie rozwiązanie było bezpieczne, warto jeszcze zabezpieczyć taką transakcję przez locktime. Spowoduje to tyle, że w razie ataku na wspomniany komputer, wszystkie transakcje nie będą mogły nagle zostać wysłane, ponieważ będą zabezpieczone znacznikiem czasu i wysłanie ich wcześniej spowoduje odrzucenie ich przez sieć.
  222.  
  223. Zatem po kolei: mamy naszą poprzednio utworzoną transakcję, która przenosi nam 0.10 monety na adres oznaczony jako "emerytura". Potrzebujemy adresu odbiorcy, niech to będzie przykładowo "kantor", który wymieni nam nasze monety na złotówki. W drugim kliencie wpisujemy:
  224.  
  225. [code]getnewaddress "kantor" "bech32"
  226. bcrt1qclaryqyeaqc6axm2sspnuxeh2ccf6gkmzqg9t3
  227. dumpprivkey bcrt1qclaryqyeaqc6axm2sspnuxeh2ccf6gkmzqg9t3
  228. cTfvMab2iCnJThzYoRV5oyutmwgZFhdcuvNCWuHvtSE5hAC6W6zQ[/code]
  229.  
  230. [code]createrawtransaction "[{\"txid\":\"d423be86d0f5d5653a6dc50aaa417c4c7eb4c6c162cbb91c4d9c3d4e5cfec0b7\",\"vout\":0}]" "[{\"bcrt1qclaryqyeaqc6axm2sspnuxeh2ccf6gkmzqg9t3\":0.09999000}]" 1606649400
  231. 0200000001b7c0fe5c4e3d9c4d1cb9cb62c1c6b47e4c7c41aa0ac56d3a65d5f5d086be23d40000000000feffffff019892980000000000160014c7fa320099e831ae9b6a84033e1b3756309d22db3886c35f
  232. decoderawtransaction 0200000001b7c0fe5c4e3d9c4d1cb9cb62c1c6b47e4c7c41aa0ac56d3a65d5f5d086be23d40000000000feffffff019892980000000000160014c7fa320099e831ae9b6a84033e1b3756309d22db3886c35f
  233. {
  234. "txid": "422eb83007718fb1ff10b6cc54743e3229b842b3890483ab82fbc32228995364",
  235. "hash": "422eb83007718fb1ff10b6cc54743e3229b842b3890483ab82fbc32228995364",
  236. "version": 2,
  237. "size": 82,
  238. "vsize": 82,
  239. "weight": 328,
  240. "locktime": 1606649400,
  241. "vin": [
  242. {
  243. "txid": "d423be86d0f5d5653a6dc50aaa417c4c7eb4c6c162cbb91c4d9c3d4e5cfec0b7",
  244. "vout": 0,
  245. "scriptSig": {
  246. "asm": "",
  247. "hex": ""
  248. },
  249. "sequence": 4294967294
  250. }
  251. ],
  252. "vout": [
  253. {
  254. "value": 0.09999000,
  255. "n": 0,
  256. "scriptPubKey": {
  257. "asm": "0 c7fa320099e831ae9b6a84033e1b3756309d22db",
  258. "hex": "0014c7fa320099e831ae9b6a84033e1b3756309d22db",
  259. "reqSigs": 1,
  260. "type": "witness_v0_keyhash",
  261. "addresses": [
  262. "bcrt1qclaryqyeaqc6axm2sspnuxeh2ccf6gkmzqg9t3"
  263. ]
  264. }
  265. }
  266. ]
  267. }
  268. signrawtransactionwithkey "0200000001b7c0fe5c4e3d9c4d1cb9cb62c1c6b47e4c7c41aa0ac56d3a65d5f5d086be23d40000000000feffffff019892980000000000160014c7fa320099e831ae9b6a84033e1b3756309d22db3886c35f" "[\"cSDXZud1xWh6uzntT98hcda5TZ4aVxzxn6LuQWfpknXHxmuHpuxJ\"]"
  269. {
  270. "hex": "02000000000101b7c0fe5c4e3d9c4d1cb9cb62c1c6b47e4c7c41aa0ac56d3a65d5f5d086be23d40000000000feffffff019892980000000000160014c7fa320099e831ae9b6a84033e1b3756309d22db0247304402201e8c38ae0401aeb53f702a2ab71ed61502e8f6de25f935ae05d1085fc1ab867a02206b10c459c81b319b7bad65872fda533d4f60e8d21f0da56c3a202af8027b9c430121022e070224b4738c8242b6ff8c06033a9c8c4eae7b0efb36f9a6edc18fe85d1f013886c35f",
  271. "complete": true
  272. }
  273. [/code]
  274.  
  275. Prościej nie będzie, jedno wejście, jedno wyjście. Taka transakcja zwykle oznacza, że mamy tak zwany "sweep", czyli przesuwamy swoje własne środki z jednego adresu na drugi. Może to jednak sugerować również, że wszystkie nasze monety wysyłamy do jakiegoś kantoru, zatem można rozbudować taką transakcję o dodatkowe wejścia i wyjścia. Na potrzeby testów zostawię to tak, jak jest, aby pokazać najprostszy możliwy przypadek.
  276.  
  277. Dodatkowo jako ostatni parametr widzimy locktime. Może to być liczba sekund od pierwszego stycznia 1970 (Unix time) lub też numer bloku (jeśli mamy liczbę mniejszą od 500000000, co dawałoby datę przed 5 listopada 1985). Ponieważ bloki mogą się pojawiać częściej lub rzadziej, tutaj wybieramy pierwszą opcję. Żeby sprawdzić, jaki czas daje jaka liczba, możemy wpisać w konsoli:
  278. [code]date --date='@1606649000'[/code]
  279. Wpisanie "unix timestamp" lub czegoś podobnego w wyszukiwarce również powinno dać nam odpowiednie wyniki.
  280.  
  281. Jeśli czas określony przez locktime jest w przyszłości, nie będziemy mogli wysłać tak utworzonej transakcji.
  282. [code]sendrawtransaction "02000000000101b7c0fe5c4e3d9c4d1cb9cb62c1c6b47e4c7c41aa0ac56d3a65d5f5d086be23d40000000000feffffff019892980000000000160014c7fa320099e831ae9b6a84033e1b3756309d22db0247304402201e8c38ae0401aeb53f702a2ab71ed61502e8f6de25f935ae05d1085fc1ab867a02206b10c459c81b319b7bad65872fda533d4f60e8d21f0da56c3a202af8027b9c430121022e070224b4738c8242b6ff8c06033a9c8c4eae7b0efb36f9a6edc18fe85d1f013886c35f"
  283. non-final (code -26)[/code]
  284. Osiągnęliśmy zatem to, co trzeba. Transakcja jest niewydawalna przed upłynięciem określonego czasu. Analogicznie możemy przygotować pozostałe transakcje, odpowiednio zwiększając numer locktime, zmieniając w ten sposób datę.
  285.  
  286. Żeby jednak ostatecznie móc wydać te środki, klient może wymagać, aby transakcja była potwierdzona. Dodajemy zatem sześć bloków, aby ją potwierdzić.
  287. [code]generatetoaddress 6 "bcrt1qtvuj00ytwvcljqnz4vnkw4l09f050el0slqcy9"[/code]
  288.  
  289. Ponieważ klient korzysta nie tylko z czasu systemowego, ale również z czasu podanego w blokach, może się zdarzyć tak, że transakcja będzie możliwa do wydania dopiero po nadejściu nowych bloków tuż po upłynięciu podanego czasu. Z tego powodu nie należy wysyłać tej transakcji od razu, tylko najpierw poczekać na nowe bloki. Jest to jedno z zabezpieczeń w celu uniknięcia problemów w sieci Bitcoin w razie gdyby zegar na komputerze lokalnym się spieszył/spóźniał.
  290.  
  291. Daj znać, czy to rozwiązanie jest w porządku, czy mam opisywać kolejne przypadki. Możesz poćwiczyć w regteście, pobawić się tym, samemu poklikać sporo rzeczy z interfejsu graficznego i zobaczyć, czy to wystarczy.