Compare commits
1313 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ef49d8a6ca | ||
|
|
e99b8eae65 | ||
|
|
ab877a2dde | ||
|
|
b50ac8f73e | ||
|
|
53f21f6ee7 | ||
|
|
b4d0588d06 | ||
|
|
eab61cd0b2 | ||
|
|
4db9705dd8 | ||
|
|
ddd9b39bd4 | ||
|
|
bdf2f7e711 | ||
|
|
4adf78bad3 | ||
|
|
c60aec9c20 | ||
|
|
7b465b663a | ||
|
|
94eaab7710 | ||
|
|
0b3f3657c8 | ||
|
|
c1131a28ad | ||
|
|
6853e627f1 | ||
|
|
e9b95e4f6c | ||
|
|
903a255836 | ||
|
|
b95e6376d0 | ||
|
|
32ebde4612 | ||
|
|
e653578db3 | ||
|
|
ae81b82fb8 | ||
|
|
9e5322d23a | ||
|
|
3a6e468d9a | ||
|
|
4ffbdcc0f5 | ||
|
|
e9e7bb968b | ||
|
|
ff3b235580 | ||
|
|
b898c8fce6 | ||
|
|
8bc52d0692 | ||
|
|
9ec4fa7b50 | ||
|
|
3552497ae5 | ||
|
|
5c5d310a0a | ||
|
|
887b9d4113 | ||
|
|
514b18722a | ||
|
|
65ba3e2f50 | ||
|
|
a4e6ae101a | ||
|
|
5a105cdb7d | ||
|
|
8ad100a55b | ||
|
|
3504801778 | ||
|
|
c923fe71b4 | ||
|
|
74567f7ef1 | ||
|
|
1ff3583e41 | ||
|
|
ad9ceecf9c | ||
|
|
074d584a04 | ||
|
|
2f7f2a5fca | ||
|
|
452506fc41 | ||
|
|
6ccff2cbde | ||
|
|
f4769e44a3 | ||
|
|
e297ea999e | ||
|
|
07e2882366 | ||
|
|
9a7e5ed3b0 | ||
|
|
7dd4001b40 | ||
|
|
20091df725 | ||
|
|
e8e0e23d20 | ||
|
|
f33a43efdf | ||
|
|
002a4dcad0 | ||
|
|
a8b95ce6ed | ||
|
|
4dcad1d294 | ||
|
|
f8acc29fca | ||
|
|
eec44dad17 | ||
|
|
45723584c5 | ||
|
|
ab1bbe5492 | ||
|
|
5902040874 | ||
|
|
3a570dc80a | ||
|
|
01cc526318 | ||
|
|
d9867551fc | ||
|
|
b53d6284eb | ||
|
|
cc2567e32f | ||
|
|
e93bf37e86 | ||
|
|
4b603f1cd6 | ||
|
|
4e67a6216b | ||
|
|
d28ed9c98e | ||
|
|
a1ef0d19b1 | ||
|
|
a8c108bca1 | ||
|
|
609acbf43d | ||
|
|
13945b2a61 | ||
|
|
9a1ce86969 | ||
|
|
36eccc5174 | ||
|
|
adea540e38 | ||
|
|
81cadd74d2 | ||
|
|
565c4771b6 | ||
|
|
ee1d6e4ed0 | ||
|
|
b14bd4df58 | ||
|
|
6b8a5ab622 | ||
|
|
5df25e78db | ||
|
|
17e2c24645 | ||
|
|
f7f2a36925 | ||
|
|
010c4fc0b5 | ||
|
|
99cec89cb3 | ||
|
|
f8937b2d3b | ||
|
|
c1ffdc5801 | ||
|
|
0961c2fc0d | ||
|
|
3fc4c3a9f1 | ||
|
|
a4f2c8419f | ||
|
|
c7eb151ad0 | ||
|
|
0920ad152f | ||
|
|
16d6963ef6 | ||
|
|
da799d92fa | ||
|
|
90efeb5ddb | ||
|
|
b8afa21fad | ||
|
|
864e49a12c | ||
|
|
2fc80399b7 | ||
|
|
806704c237 | ||
|
|
3e52aaf212 | ||
|
|
15f3ad4dbd | ||
|
|
54d02f158d | ||
|
|
700f942692 | ||
|
|
2d294e080c | ||
|
|
9b490f71b0 | ||
|
|
88367a5fb8 | ||
|
|
0465c41c84 | ||
|
|
e122e42354 | ||
|
|
3c66913cd2 | ||
|
|
e674680ddd | ||
|
|
59090133c0 | ||
|
|
7337b343cd | ||
|
|
67c6994370 | ||
|
|
5dd7318db7 | ||
|
|
217208a36d | ||
|
|
6083295f46 | ||
|
|
53c6c12886 | ||
|
|
c1e667222a | ||
|
|
3f94dfa25f | ||
|
|
38fd861fff | ||
|
|
c4149423f9 | ||
|
|
b4af75c07f | ||
|
|
83312d7c6c | ||
|
|
1837644c4a | ||
|
|
2c1fd3c395 | ||
|
|
d33cc2b5e3 | ||
|
|
78b3bf56f7 | ||
|
|
95cea79e39 | ||
|
|
b56658bdad | ||
|
|
0295912479 | ||
|
|
b7598ceefa | ||
|
|
3448ce56f4 | ||
|
|
9b9e2f1748 | ||
|
|
a0d2f9a12d | ||
|
|
f077d1ad62 | ||
|
|
94723e27ad | ||
|
|
5a3dea451d | ||
|
|
f92f022eda | ||
|
|
9406696578 | ||
|
|
83f4cd156e | ||
|
|
49c8e53ee2 | ||
|
|
b760e25458 | ||
|
|
0535644b30 | ||
|
|
cbd959c473 | ||
|
|
ff4bd3977a | ||
|
|
fd5eaf323f | ||
|
|
074653973e | ||
|
|
6a0296791d | ||
|
|
04f9a37c71 | ||
|
|
905cbf0bf8 | ||
|
|
e39f925655 | ||
|
|
e4626e94f4 | ||
|
|
dc0c768760 | ||
|
|
e03209979b | ||
|
|
c5eed9a1ae | ||
|
|
a79401b31d | ||
|
|
cc558f0603 | ||
|
|
3a7c4d89de | ||
|
|
adb8a55b46 | ||
|
|
e077cce617 | ||
|
|
cf9195c808 | ||
|
|
69e87633bc | ||
|
|
7b7d46be89 | ||
|
|
a687d4f574 | ||
|
|
0a70a3f4d8 | ||
|
|
7464e647de | ||
|
|
712077a760 | ||
|
|
ec74e8a443 | ||
|
|
4785e6df74 | ||
|
|
0aca8577b5 | ||
|
|
fb462ab272 | ||
|
|
b53e277ba1 | ||
|
|
b2d1129f27 | ||
|
|
c5aa1b139a | ||
|
|
c591cc50eb | ||
|
|
fb45259967 | ||
|
|
7a15d4ff67 | ||
|
|
86fd7c5af6 | ||
|
|
bca179e8bd | ||
|
|
2f4c30fd85 | ||
|
|
36d9b2311d | ||
|
|
783c636c73 | ||
|
|
dd7868364d | ||
|
|
ed02c95d50 | ||
|
|
123e5bd998 | ||
|
|
7db3b75b3e | ||
|
|
f662cefd85 | ||
|
|
e3c26b2573 | ||
|
|
541e585d8e | ||
|
|
cb6c4b883d | ||
|
|
471426fb3b | ||
|
|
6cc4a62c0e | ||
|
|
b0243da77c | ||
|
|
21189a42a7 | ||
|
|
927aaa0f27 | ||
|
|
ce39dfe425 | ||
|
|
8af99d1893 | ||
|
|
f43f46c175 | ||
|
|
6c85cbecf1 | ||
|
|
b7bcaf940d | ||
|
|
3f0816e3d9 | ||
|
|
829e21733b | ||
|
|
e40bef3c0a | ||
|
|
1224a14ae4 | ||
|
|
ae8adeb90a | ||
|
|
3bb23e5c8b | ||
|
|
bef41ada0d | ||
|
|
d2cbb14d7c | ||
|
|
b4ada906c0 | ||
|
|
adce862c27 | ||
|
|
98deeaef15 | ||
|
|
e4dde849ae | ||
|
|
33e28c9948 | ||
|
|
507fd9d15b | ||
|
|
82dc6426b4 | ||
|
|
e49b83bb12 | ||
|
|
99860de3c9 | ||
|
|
865ed8a1e5 | ||
|
|
dac48972d5 | ||
|
|
872b1f3e4c | ||
|
|
317c733572 | ||
|
|
c7286112ef | ||
|
|
b2fd0ca1cb | ||
|
|
8c4738d5a7 | ||
|
|
b90c9ecb13 | ||
|
|
d0d9486f44 | ||
|
|
eb72eae304 | ||
|
|
59ed5cb398 | ||
|
|
8acb491eef | ||
|
|
2f8f51d1e4 | ||
|
|
498a2c9b16 | ||
|
|
0a76546ae9 | ||
|
|
c648b589be | ||
|
|
72173ffaca | ||
|
|
25133bd74b | ||
|
|
7c3002bf27 | ||
|
|
ec93a0e219 | ||
|
|
9f0ac16942 | ||
|
|
b2120e223a | ||
|
|
2c3691d53d | ||
|
|
3c8cecda1f | ||
|
|
a8330e0049 | ||
|
|
5f6a654d3e | ||
|
|
e707d29dd6 | ||
|
|
02962ba848 | ||
|
|
8a62fec3ee | ||
|
|
437173f430 | ||
|
|
fcedd45c3c | ||
|
|
4e5d88ce26 | ||
|
|
b0849613bf | ||
|
|
fb390d3505 | ||
|
|
f839f96578 | ||
|
|
c359ac9128 | ||
|
|
856aacf388 | ||
|
|
db7f023417 | ||
|
|
330c190958 | ||
|
|
e74e8a184a | ||
|
|
d4e3cb4c03 | ||
|
|
00f4f8d54c | ||
|
|
126185aaa7 | ||
|
|
ffccb56914 | ||
|
|
bd1e54bc0b | ||
|
|
eb20f3c8f5 | ||
|
|
95699e1730 | ||
|
|
32de8cd062 | ||
|
|
2351a3fc9f | ||
|
|
1b39201966 | ||
|
|
186f3e2f0c | ||
|
|
01a509fa26 | ||
|
|
2ccd47596b | ||
|
|
82303fc3ca | ||
|
|
918150048a | ||
|
|
a99ac8d3f4 | ||
|
|
2566b30c38 | ||
|
|
4d2ef6e5b6 | ||
|
|
6e903b0b32 | ||
|
|
5762295ec3 | ||
|
|
10d680cff4 | ||
|
|
ce364b2d7a | ||
|
|
1565698169 | ||
|
|
9326234109 | ||
|
|
364685e195 | ||
|
|
d8f5c59a59 | ||
|
|
05bcf7089e | ||
|
|
33208fb557 | ||
|
|
dedf83a19b | ||
|
|
a5e1325879 | ||
|
|
f0ec774d9c | ||
|
|
8c2143d4d8 | ||
|
|
04f38adf73 | ||
|
|
2f5d380943 | ||
|
|
1aafe34a08 | ||
|
|
19fba3cd24 | ||
|
|
3b59297b36 | ||
|
|
53d65b5500 | ||
|
|
ee014e5b10 | ||
|
|
e1f13129e8 | ||
|
|
b5b1d1a66b | ||
|
|
7df001be94 | ||
|
|
384625c1a6 | ||
|
|
687c82558c | ||
|
|
a139ed74f2 | ||
|
|
aa7c5e7ceb | ||
|
|
b63241d451 | ||
|
|
a0eb1d151f | ||
|
|
dd61035645 | ||
|
|
1e89d5d2fe | ||
|
|
690c723e5f | ||
|
|
5326a31249 | ||
|
|
491ad6db50 | ||
|
|
c0b892fee8 | ||
|
|
83c8d678aa | ||
|
|
f2b10f6469 | ||
|
|
587e52855a | ||
|
|
ca1dbe10ed | ||
|
|
67ed7d9d49 | ||
|
|
e780b94bd3 | ||
|
|
e285ffcd05 | ||
|
|
bbae0fc9ef | ||
|
|
a9ba47101a | ||
|
|
a8c50c06e3 | ||
|
|
2af40a5013 | ||
|
|
daa1a7398f | ||
|
|
f5472574a7 | ||
|
|
591dcaf681 | ||
|
|
b6d19aefa0 | ||
|
|
a7dd11c6da | ||
|
|
8a13456f3a | ||
|
|
1a925b8e60 | ||
|
|
2eac3a6dec | ||
|
|
64c991da2a | ||
|
|
7beada58cd | ||
|
|
8b936b617f | ||
|
|
73cd5e5212 | ||
|
|
c2da35319d | ||
|
|
643160f6e7 | ||
|
|
29f9e4e400 | ||
|
|
174b3eddc0 | ||
|
|
8ea1c9a418 | ||
|
|
68e327ae7b | ||
|
|
24c835b0b6 | ||
|
|
ca40e581eb | ||
|
|
03f8b54565 | ||
|
|
a75e1e3292 | ||
|
|
9e3e21efeb | ||
|
|
993d37b90b | ||
|
|
1907b96d69 | ||
|
|
8dcffd4d07 | ||
|
|
5df0b03c95 | ||
|
|
cb61b8dc4c | ||
|
|
2ffba736e9 | ||
|
|
03fbd79049 | ||
|
|
6801782096 | ||
|
|
e609c468d9 | ||
|
|
241844eab0 | ||
|
|
b5f918cbd6 | ||
|
|
2a429030ff | ||
|
|
9b9cd3dd20 | ||
|
|
9958e09dbc | ||
|
|
a5e6d72339 | ||
|
|
133ccbe408 | ||
|
|
88cab1e4a3 | ||
|
|
97f908e483 | ||
|
|
d421117620 | ||
|
|
a24b23622e | ||
|
|
19366be186 | ||
|
|
a35ee96336 | ||
|
|
249c6818f1 | ||
|
|
ea37fb9187 | ||
|
|
f8be324ace | ||
|
|
5b0fc31b1c | ||
|
|
608810a3e7 | ||
|
|
76aed0141c | ||
|
|
5b2f35167f | ||
|
|
77b615ceba | ||
|
|
494fc9a857 | ||
|
|
065d743019 | ||
|
|
3a10d1c493 | ||
|
|
24271c542b | ||
|
|
d655a26c9d | ||
|
|
36cd1ad5c9 | ||
|
|
a2606bad09 | ||
|
|
3fd18faaf6 | ||
|
|
8c41469140 | ||
|
|
cee69980b0 | ||
|
|
60d2f8662c | ||
|
|
0d7b28e52e | ||
|
|
9cd22ab862 | ||
|
|
b8cbbc2c28 | ||
|
|
84c3c2ebe7 | ||
|
|
93752b8a39 | ||
|
|
225e60ce34 | ||
|
|
d5e9d0000d | ||
|
|
d5115a71a1 | ||
|
|
2a097fc5ed | ||
|
|
e9fd7d9fad | ||
|
|
24a0def8cd | ||
|
|
116df55e21 | ||
|
|
4ea952d5c0 | ||
|
|
d0538a81bb | ||
|
|
858cebed7d | ||
|
|
225f222c9f | ||
|
|
d7f1d200ab | ||
|
|
f85c097449 | ||
|
|
ecf1c79aad | ||
|
|
df40181417 | ||
|
|
0ca8324f59 | ||
|
|
0fa89d8e81 | ||
|
|
61e3c011f5 | ||
|
|
696d34069a | ||
|
|
0bad8e4237 | ||
|
|
aaa468563b | ||
|
|
7414733bea | ||
|
|
96f34cd5c4 | ||
|
|
0efda1a79e | ||
|
|
b6b039d84e | ||
|
|
fbeb5fb483 | ||
|
|
81598083e7 | ||
|
|
98545d2cdf | ||
|
|
ddebdd9a8f | ||
|
|
4e87d341f7 | ||
|
|
aa0bcaaf2b | ||
|
|
230b894779 | ||
|
|
4a843976e0 | ||
|
|
df5ccbd2b2 | ||
|
|
eee0d2391c | ||
|
|
6c9498147f | ||
|
|
a48c671957 | ||
|
|
354f2dd094 | ||
|
|
c87cdc9160 | ||
|
|
0b814f9ea3 | ||
|
|
7668631d1b | ||
|
|
ea8440d742 | ||
|
|
adad8e46c9 | ||
|
|
f54d59ba4a | ||
|
|
2eace48d9a | ||
|
|
fa989f42c1 | ||
|
|
aa496b75c2 | ||
|
|
460cd40aa5 | ||
|
|
51d7cc07f1 | ||
|
|
35105534e7 | ||
|
|
3ddf10e5ca | ||
|
|
f08736405e | ||
|
|
c05d011fba | ||
|
|
83b8237046 | ||
|
|
d8aeb8dd2a | ||
|
|
84c8506e90 | ||
|
|
c1aacf0be3 | ||
|
|
acd6501610 | ||
|
|
8ffec99b07 | ||
|
|
610121480c | ||
|
|
ba3d0255fc | ||
|
|
0002bdddfa | ||
|
|
a7e506d698 | ||
|
|
94fe42a945 | ||
|
|
3479849dc4 | ||
|
|
5eaa1b435c | ||
|
|
ae3d0aba15 | ||
|
|
42c405ad23 | ||
|
|
33c75fd9aa | ||
|
|
fbaee7a853 | ||
|
|
d52a0f3bca | ||
|
|
fac047480d | ||
|
|
e599246803 | ||
|
|
393adf7acd | ||
|
|
8bca4099c7 | ||
|
|
e1f3d64c4a | ||
|
|
64c8b69948 | ||
|
|
e94010b239 | ||
|
|
825aa7d8d8 | ||
|
|
bb0d9ce226 | ||
|
|
7ec552676c | ||
|
|
09923991e5 | ||
|
|
3f0950ea01 | ||
|
|
e9f61c8787 | ||
|
|
9390431ce4 | ||
|
|
06c903b26c | ||
|
|
fa105b1d3a | ||
|
|
b8f174a5ce | ||
|
|
59f9c8e8c9 | ||
|
|
9dfb2d2814 | ||
|
|
3913c387c9 | ||
|
|
8fe2308b34 | ||
|
|
d547a44332 | ||
|
|
096a890097 | ||
|
|
482e57812b | ||
|
|
21e47f8d04 | ||
|
|
fc27eb188f | ||
|
|
b4b536d782 | ||
|
|
a76899624a | ||
|
|
1a19fc17b2 | ||
|
|
ecde936aee | ||
|
|
154e25ff60 | ||
|
|
c1ffa5b1c5 | ||
|
|
669b0a5835 | ||
|
|
ebff5c40a2 | ||
|
|
013df1cc3b | ||
|
|
05da981f05 | ||
|
|
bb82fdb543 | ||
|
|
f48b4c8897 | ||
|
|
9cd1dfe898 | ||
|
|
cfbcb1de66 | ||
|
|
58d9badfe2 | ||
|
|
12a4af47c2 | ||
|
|
ee1f884229 | ||
|
|
c4286dc6ee | ||
|
|
b73ab2d885 | ||
|
|
056d2ad312 | ||
|
|
362efb24c1 | ||
|
|
7fbeca05c9 | ||
|
|
e5b47b4328 | ||
|
|
05bae43c3c | ||
|
|
f8b5028cd1 | ||
|
|
b5384e93ed | ||
|
|
cdff41c12e | ||
|
|
ce8f78a7bb | ||
|
|
ab90d6e62a | ||
|
|
0052fe7bbc | ||
|
|
4973174534 | ||
|
|
44d16327c1 | ||
|
|
f03c31db82 | ||
|
|
c60015a260 | ||
|
|
64f125f353 | ||
|
|
8b040f812a | ||
|
|
c16eb94945 | ||
|
|
d61b7d13e4 | ||
|
|
d56c6f312c | ||
|
|
ef079e183b | ||
|
|
929eb9dc6c | ||
|
|
6ed283946c | ||
|
|
ceb6d4e11d | ||
|
|
19a5975d5a | ||
|
|
20f3f4ac16 | ||
|
|
786bfc3bb7 | ||
|
|
3a3eabb57a | ||
|
|
ecd3e728b7 | ||
|
|
3e76df7481 | ||
|
|
3cfe12c1b7 | ||
|
|
4d410cfce9 | ||
|
|
8111e27905 | ||
|
|
d8dda9de84 | ||
|
|
8baf865c94 | ||
|
|
7aff3d5852 | ||
|
|
34fa178243 | ||
|
|
e913574e02 | ||
|
|
c9e70d4c0a | ||
|
|
e8ef3da713 | ||
|
|
d0d80170a2 | ||
|
|
d99f5a470c | ||
|
|
d3800d59d5 | ||
|
|
cae5264a4c | ||
|
|
42e950aa69 | ||
|
|
0030c1bd6c | ||
|
|
a404b1512a | ||
|
|
38deedc1b5 | ||
|
|
c88e14fe26 | ||
|
|
40951d81a7 | ||
|
|
6665c2431b | ||
|
|
c774b16976 | ||
|
|
77ba3ab99c | ||
|
|
ed2c01405f | ||
|
|
daaee738fc | ||
|
|
47c6215c22 | ||
|
|
5f280ff557 | ||
|
|
b9e80983a5 | ||
|
|
f5927f5b32 | ||
|
|
c92fc340a2 | ||
|
|
50d08dc1e1 | ||
|
|
54e903a543 | ||
|
|
84114e341d | ||
|
|
f193c57a63 | ||
|
|
18b99e3f69 | ||
|
|
1179257bfd | ||
|
|
98705aa51c | ||
|
|
679592720a | ||
|
|
3c7ebaedcd | ||
|
|
04e442070d | ||
|
|
2207f5e201 | ||
|
|
926e14b362 | ||
|
|
aa0c5e87e8 | ||
|
|
a6b2115963 | ||
|
|
0f9ee792d9 | ||
|
|
eade213197 | ||
|
|
6cab66354d | ||
|
|
0eeb4f5d5b | ||
|
|
245ab4d0ac | ||
|
|
4acfe655d5 | ||
|
|
45c4a0b354 | ||
|
|
7df70c000a | ||
|
|
0f3981bea9 | ||
|
|
aa52972660 | ||
|
|
e4347a43b9 | ||
|
|
553af2f702 | ||
|
|
e61cfaf5c1 | ||
|
|
89c94b5578 | ||
|
|
eeac8727bc | ||
|
|
8c69f1fb25 | ||
|
|
aec8763a8e | ||
|
|
58557b5aff | ||
|
|
cf450e1b4c | ||
|
|
64c7ee7e6b | ||
|
|
e89b9f6a2a | ||
|
|
b1ef1b24ce | ||
|
|
a790ec5884 | ||
|
|
19ea44208f | ||
|
|
c02ec54269 | ||
|
|
6f460bace6 | ||
|
|
40dc7e6e1d | ||
|
|
c60da7355e | ||
|
|
9399225b81 | ||
|
|
5363cb05f6 | ||
|
|
f15df6bb7a | ||
|
|
6315130e60 | ||
|
|
39cf857db9 | ||
|
|
e83474f2eb | ||
|
|
249300aebe | ||
|
|
02d87b3aa3 | ||
|
|
92ab03afc8 | ||
|
|
d066e25744 | ||
|
|
3ac5aa4a95 | ||
|
|
ab2fe68fd8 | ||
|
|
18cf214528 | ||
|
|
0424613ba2 | ||
|
|
c428d9e76a | ||
|
|
37f793c631 | ||
|
|
ce148944c7 | ||
|
|
76d660ebd3 | ||
|
|
ca93cc563e | ||
|
|
0304f4a759 | ||
|
|
ba4081c1fc | ||
|
|
e051f1b510 | ||
|
|
5813089e0b | ||
|
|
5e1feddcb6 | ||
|
|
a299e551fe | ||
|
|
18e39300e6 | ||
|
|
b734954a63 | ||
|
|
4181184acf | ||
|
|
725d460e4b | ||
|
|
a777f7b9b5 | ||
|
|
c30075142f | ||
|
|
5b0dc80bf7 | ||
|
|
66d536ed07 | ||
|
|
6854a2ade6 | ||
|
|
6de1326ba4 | ||
|
|
65ee333ae0 | ||
|
|
2661f2f7c4 | ||
|
|
3a8182c105 | ||
|
|
60152827e3 | ||
|
|
8e86dca256 | ||
|
|
c6710c7a70 | ||
|
|
04bc3f0a63 | ||
|
|
a9d3af8821 | ||
|
|
6717457390 | ||
|
|
352b4ea5b9 | ||
|
|
822f2e3ddf | ||
|
|
b7726d924e | ||
|
|
6f07e22210 | ||
|
|
09d1484b22 | ||
|
|
e3d884479a | ||
|
|
7a234cdae5 | ||
|
|
39105dac1b | ||
|
|
00b8acdf49 | ||
|
|
9e0576587b | ||
|
|
467c31ea0a | ||
|
|
352083cb23 | ||
|
|
cddc003e70 | ||
|
|
e29b623db3 | ||
|
|
4663e339b8 | ||
|
|
afacb3406d | ||
|
|
a4b4cc290c | ||
|
|
75ff9d841b | ||
|
|
b9e41844c0 | ||
|
|
64bca50d54 | ||
|
|
2547f1f7e5 | ||
|
|
9d9a4e874d | ||
|
|
ca81b168d9 | ||
|
|
48208883de | ||
|
|
dab03e34f5 | ||
|
|
4e6303d397 | ||
|
|
482cb65690 | ||
|
|
44384a4602 | ||
|
|
5c94371f9a | ||
|
|
e104c79374 | ||
|
|
7c05877df2 | ||
|
|
e457b02142 | ||
|
|
ef1b844e7b | ||
|
|
df6dfb4ab8 | ||
|
|
9357dcf68e | ||
|
|
9aef9bca3d | ||
|
|
f96681c5e4 | ||
|
|
c51f051257 | ||
|
|
5d5990dc8f | ||
|
|
c3e0734dbc | ||
|
|
c6dd35f03d | ||
|
|
968d55aafa | ||
|
|
92f20d53fb | ||
|
|
6630c1cbf5 | ||
|
|
1d7e321c10 | ||
|
|
8c937da5f2 | ||
|
|
5fecb27c1e | ||
|
|
63760fa1cd | ||
|
|
12a1256c1d | ||
|
|
f6c18bc9ed | ||
|
|
3e1ea1c025 | ||
|
|
e923f8188d | ||
|
|
0eba00447e | ||
|
|
dd8e82f797 | ||
|
|
f79efbab6f | ||
|
|
f488e7358d | ||
|
|
0856c1a03e | ||
|
|
a452d9ee2d | ||
|
|
af531f0449 | ||
|
|
213f763630 | ||
|
|
0649b6af90 | ||
|
|
1d418728b0 | ||
|
|
bd39b48f19 | ||
|
|
5e1e458ecb | ||
|
|
db69432dcd | ||
|
|
7709ee622c | ||
|
|
a757ed886a | ||
|
|
6740ad3706 | ||
|
|
7609e35f10 | ||
|
|
3d962315f2 | ||
|
|
db3b14c960 | ||
|
|
20d28e6031 | ||
|
|
77172463a3 | ||
|
|
2bfda1be11 | ||
|
|
e426776598 | ||
|
|
ca253d5911 | ||
|
|
00af90ab3c | ||
|
|
a9ea3cd76d | ||
|
|
d21876cdb8 | ||
|
|
54c465f25d | ||
|
|
e295947d04 | ||
|
|
32a1753e61 | ||
|
|
1fcf6f038e | ||
|
|
ec39b59a03 | ||
|
|
95f748c54e | ||
|
|
08cf0629f5 | ||
|
|
11adda400f | ||
|
|
8968bf2e36 | ||
|
|
858ff187f5 | ||
|
|
18cab09a95 | ||
|
|
1c528eeee9 | ||
|
|
ad88e7626b | ||
|
|
e4c3232f42 | ||
|
|
7ee8e5bf86 | ||
|
|
cbb2b59a90 | ||
|
|
69a27a4ec6 | ||
|
|
69ae372b51 | ||
|
|
813a3b438f | ||
|
|
fbe6d5defa | ||
|
|
98199faa0b | ||
|
|
010ca705df | ||
|
|
6c5064b5c3 | ||
|
|
97c9d444ae | ||
|
|
31f2931281 | ||
|
|
6b783965c4 | ||
|
|
b201c1f600 | ||
|
|
769e457d94 | ||
|
|
b3ff4878f8 | ||
|
|
0c97aa9e14 | ||
|
|
270e944e30 | ||
|
|
112262cb24 | ||
|
|
6d62d2fb56 | ||
|
|
29bbcab6b4 | ||
|
|
fdd7d04744 | ||
|
|
edd309e537 | ||
|
|
40c2614ef4 | ||
|
|
ed0c143242 | ||
|
|
1512d5ce64 | ||
|
|
f23f9a03c8 | ||
|
|
b90626021b | ||
|
|
fb7e2901b7 | ||
|
|
992ff49b43 | ||
|
|
f441949515 | ||
|
|
00bcfe0b7e | ||
|
|
85663f2c18 | ||
|
|
223b6f1ba4 | ||
|
|
6a8062a30d | ||
|
|
69d605f410 | ||
|
|
c22feee634 | ||
|
|
bcb971f930 | ||
|
|
f53faffb91 | ||
|
|
545a679aed | ||
|
|
2097c09a9b | ||
|
|
c24d047b9c | ||
|
|
6644d98d9e | ||
|
|
1f2e0df865 | ||
|
|
95f5b36772 | ||
|
|
4d1bb15e31 | ||
|
|
b8e302eb53 | ||
|
|
871f9979c6 | ||
|
|
efe06e1efd | ||
|
|
73eb306cfd | ||
|
|
9398bf946c | ||
|
|
5d1d69453a | ||
|
|
1a6d504a38 | ||
|
|
3f323a61fe | ||
|
|
d5da2f7b37 | ||
|
|
3a7abc2c77 | ||
|
|
0fd01780e9 | ||
|
|
df577886e4 | ||
|
|
8812ce7b27 | ||
|
|
4b2e21e7ee | ||
|
|
aa4a9c5250 | ||
|
|
3a8029f033 | ||
|
|
2a2487514a | ||
|
|
a630da6400 | ||
|
|
a6a5bb7c20 | ||
|
|
af94377667 | ||
|
|
0522725754 | ||
|
|
de11d82856 | ||
|
|
04a667b076 | ||
|
|
832fb114a7 | ||
|
|
94ccfa8c5d | ||
|
|
053980bb19 | ||
|
|
13740b7ed1 | ||
|
|
d9068ad5a1 | ||
|
|
e8adcf88cd | ||
|
|
91b8932eb1 | ||
|
|
59d18adc4c | ||
|
|
b17be7e14b | ||
|
|
c0430f42b8 | ||
|
|
6244e44999 | ||
|
|
752e598a16 | ||
|
|
e6ad2c8792 | ||
|
|
1355cfe131 | ||
|
|
4d27c96033 | ||
|
|
f79405b5e1 | ||
|
|
aaa1c3c400 | ||
|
|
ec86134a0d | ||
|
|
2fb1124b0f | ||
|
|
4408034bcd | ||
|
|
2f62b1299f | ||
|
|
62b427ec55 | ||
|
|
894031bbd9 | ||
|
|
5c4aeb779f | ||
|
|
5f56b28629 | ||
|
|
d299c28ecc | ||
|
|
3451c5a9b3 | ||
|
|
e5577d5541 | ||
|
|
b99c23af40 | ||
|
|
519365cfa5 | ||
|
|
8737e1ee20 | ||
|
|
fbfbf94deb | ||
|
|
d67cfd146a | ||
|
|
bd3bd83dda | ||
|
|
3b7925eb7d | ||
|
|
76160f784a | ||
|
|
2296647e01 | ||
|
|
249aff45c2 | ||
|
|
06d9156b8d | ||
|
|
ddbc4647fa | ||
|
|
dec289e821 | ||
|
|
26e0de41c3 | ||
|
|
2d9b9fecd5 | ||
|
|
be2fa90b94 | ||
|
|
84c3fb07b0 | ||
|
|
a925c32cca | ||
|
|
1a5364bd19 | ||
|
|
64ad448adc | ||
|
|
ca5884873e | ||
|
|
344888addd | ||
|
|
8857aeb223 | ||
|
|
5ec05f0a28 | ||
|
|
72e962cf55 | ||
|
|
6a76c60e6c | ||
|
|
e93e5349cb | ||
|
|
657cfe721b | ||
|
|
f285d4f4f3 | ||
|
|
bf3a0902ef | ||
|
|
9a189be740 | ||
|
|
9ff411f7f7 | ||
|
|
a381eb8ddb | ||
|
|
17616eac17 | ||
|
|
a584320357 | ||
|
|
5aef2c0d55 | ||
|
|
973800b52f | ||
|
|
d7f0287235 | ||
|
|
b37f09aa2e | ||
|
|
66fb32d267 | ||
|
|
485dda9774 | ||
|
|
d89d456655 | ||
|
|
c59b6f704c | ||
|
|
79706a8e48 | ||
|
|
2e8b33824f | ||
|
|
aca3f961db | ||
|
|
335e878be8 | ||
|
|
d12ea887bc | ||
|
|
d98beea894 | ||
|
|
198fd7b0bd | ||
|
|
0a4cb86976 | ||
|
|
57b7fe4e6f | ||
|
|
6f074b71bb | ||
|
|
f5f1878ba1 | ||
|
|
b26141e2c5 | ||
|
|
a2b6c1930d | ||
|
|
8bb5edc1c9 | ||
|
|
454bc86479 | ||
|
|
3a47bf7265 | ||
|
|
8203ec4b11 | ||
|
|
0b8e4738f9 | ||
|
|
d38e683a6f | ||
|
|
c3f140033c | ||
|
|
1c09a4adb2 | ||
|
|
a07dca7cd2 | ||
|
|
b7ebc662eb | ||
|
|
f30dabb2ac | ||
|
|
e2e5f5cd9d | ||
|
|
27b7f3b43a | ||
|
|
4b88647966 | ||
|
|
d43fd8a038 | ||
|
|
2abd56f428 | ||
|
|
1bf9b3b06f | ||
|
|
dfd059173d | ||
|
|
b931ed8563 | ||
|
|
88abf70386 | ||
|
|
5de8b54c51 | ||
|
|
f4f2987273 | ||
|
|
8f58d0dbc8 | ||
|
|
12e091842f | ||
|
|
81d3b1c825 | ||
|
|
32fb5dfef7 | ||
|
|
ca221e6c21 | ||
|
|
fe460d47b0 | ||
|
|
448b4516ff | ||
|
|
f684aec4f3 | ||
|
|
cbc920d474 | ||
|
|
b104df742d | ||
|
|
8e5aaada2e | ||
|
|
c1f74f152b | ||
|
|
279ab5e62f | ||
|
|
e1205e4d15 | ||
|
|
ea7cd31751 | ||
|
|
a79409afa9 | ||
|
|
dda48ccd0f | ||
|
|
f36b494aeb | ||
|
|
395c1f44bd | ||
|
|
411493b1f7 | ||
|
|
a14bf1946d | ||
|
|
8a9cad44a5 | ||
|
|
6665aca024 | ||
|
|
c993ac6932 | ||
|
|
a357424a25 | ||
|
|
5078a54b52 | ||
|
|
84711b18bc | ||
|
|
84778a5b46 | ||
|
|
3415b15a56 | ||
|
|
8314b7f5e6 | ||
|
|
32e94947dc | ||
|
|
b0ad55a08a | ||
|
|
87504abb07 | ||
|
|
789259d2e7 | ||
|
|
83b9f42796 | ||
|
|
ccd7fe8de5 | ||
|
|
2175c9dae1 | ||
|
|
10e135af70 | ||
|
|
4d9b223ac2 | ||
|
|
6696beed45 | ||
|
|
d787e00a3b | ||
|
|
e6e87891a9 | ||
|
|
930a07c3f5 | ||
|
|
0d0bd331ae | ||
|
|
5a3e82f9f5 | ||
|
|
9cbae55a6e | ||
|
|
cf7c1874fe | ||
|
|
47908a8907 | ||
|
|
8fd402bfcf | ||
|
|
d2e2cb0d27 | ||
|
|
98ba262a48 | ||
|
|
768b41017c | ||
|
|
bd7d9140f9 | ||
|
|
b1ca5eb58a | ||
|
|
f0b7952caa | ||
|
|
b1a657a00d | ||
|
|
d9711a5798 | ||
|
|
10abe4f26e | ||
|
|
84e7ad922b | ||
|
|
4698dd9a02 | ||
|
|
c90ea2bd6d | ||
|
|
fdec7fe203 | ||
|
|
18cb92ab18 | ||
|
|
86c0af514b | ||
|
|
2aadc8bb5b | ||
|
|
ae42d69d72 | ||
|
|
5284e1b60e | ||
|
|
05563e9ef2 | ||
|
|
458cf9070b | ||
|
|
245e1b4fdb | ||
|
|
87c1947d49 | ||
|
|
8b8d59eefb | ||
|
|
dbe79d3451 | ||
|
|
10152506fe | ||
|
|
aaac71d38f | ||
|
|
415535e47b | ||
|
|
3475caf8f5 | ||
|
|
f1307515b7 | ||
|
|
ab931be45b | ||
|
|
d9574c2f14 | ||
|
|
1d23c74361 | ||
|
|
0654e1c4ef | ||
|
|
ed4e8830d7 | ||
|
|
c9f70b381d | ||
|
|
b4671902f2 | ||
|
|
76e97c4002 | ||
|
|
1aefe491fb | ||
|
|
04a9217dcf | ||
|
|
fa446a563e | ||
|
|
2eb09b66ef | ||
|
|
80be6e69a9 | ||
|
|
009d5fb41f | ||
|
|
f86655fddd | ||
|
|
0ded557af6 | ||
|
|
72b9861635 | ||
|
|
5f88e8887a | ||
|
|
ddb68acebe | ||
|
|
2d96276e24 | ||
|
|
86c2bdfd5d | ||
|
|
cba3a1741a | ||
|
|
5568d82c26 | ||
|
|
1c0bf23ba2 | ||
|
|
8250760617 | ||
|
|
59948a6e1c | ||
|
|
55c43da5d8 | ||
|
|
809ee79592 | ||
|
|
629e37dde1 | ||
|
|
bc530fe89f | ||
|
|
fc73ad644f | ||
|
|
9c17a685bd | ||
|
|
986b5e257e | ||
|
|
97ee01ad89 | ||
|
|
d12e53ea09 | ||
|
|
8220180133 | ||
|
|
a206a23980 | ||
|
|
0a87c91692 | ||
|
|
865c3a2383 | ||
|
|
f03304a9c7 | ||
|
|
bdde31d787 | ||
|
|
0575c0a667 | ||
|
|
bfd471f53e | ||
|
|
6f8ba620c2 | ||
|
|
84d7c981dc | ||
|
|
24324d83e8 | ||
|
|
b7ccd48dd8 | ||
|
|
94073ecf7b | ||
|
|
776d0f3459 | ||
|
|
262430f705 | ||
|
|
e4ff4e6898 | ||
|
|
593f74b9cb | ||
|
|
298a771494 | ||
|
|
2d8b65e837 | ||
|
|
51d9b435cd | ||
|
|
f35e21e2e4 | ||
|
|
683bcb9154 | ||
|
|
11c570cfb4 | ||
|
|
c4679ad0f1 | ||
|
|
2f7a9997c8 | ||
|
|
8595d31ee8 | ||
|
|
026c5f7617 | ||
|
|
222e3de4be | ||
|
|
910bd45756 | ||
|
|
a0cd439788 | ||
|
|
838e8c9166 | ||
|
|
695aa2d5a2 | ||
|
|
e2a186af10 | ||
|
|
5d4b0c9026 | ||
|
|
461764cbbe | ||
|
|
de374ba6b1 | ||
|
|
3b8848fa4e | ||
|
|
3cac997e19 | ||
|
|
be7eecafd2 | ||
|
|
c891967b6f | ||
|
|
2ea321d85a | ||
|
|
c285051c08 | ||
|
|
2ce73dbe85 | ||
|
|
07c46dac87 | ||
|
|
d9c6b09ac4 | ||
|
|
2ea5fa0710 | ||
|
|
bcd88403e2 | ||
|
|
d1e4a866ad | ||
|
|
5cbf75324d | ||
|
|
2bda554be4 | ||
|
|
2fad3d34b7 | ||
|
|
cc8005b4e7 | ||
|
|
77cd030ac3 | ||
|
|
ed54768f5f | ||
|
|
83082f04a4 | ||
|
|
687c5ef794 | ||
|
|
103849419a | ||
|
|
7d5d89856d | ||
|
|
0a27bd065e | ||
|
|
1b5e57e935 | ||
|
|
b22c884231 | ||
|
|
a2ae4a8a0f | ||
|
|
dc8adc3b48 | ||
|
|
5ccee900a0 | ||
|
|
178152f604 | ||
|
|
369010406e | ||
|
|
a790fa46f4 | ||
|
|
6ce5af574f | ||
|
|
81b2d877fb | ||
|
|
3764c12b1f | ||
|
|
9b8eb4d690 | ||
|
|
8d13ca1f11 | ||
|
|
645cc8cf49 | ||
|
|
1c21b7943d | ||
|
|
172f006020 | ||
|
|
6aeb45187b | ||
|
|
a43a7dfa58 | ||
|
|
efae3da41d | ||
|
|
fe37c35018 | ||
|
|
4b36f34d6d | ||
|
|
3df62878c3 | ||
|
|
71cc095cb2 | ||
|
|
43e4a2a289 | ||
|
|
fdbf76d4f4 | ||
|
|
c8ad9b8375 | ||
|
|
41016bfc46 | ||
|
|
c39b06866e | ||
|
|
2323664a37 | ||
|
|
4968232490 | ||
|
|
00728c24e7 | ||
|
|
90e165aa0c | ||
|
|
7629d36a53 | ||
|
|
8555125a1a | ||
|
|
3f64753779 | ||
|
|
14002c8eba | ||
|
|
a2120986ff | ||
|
|
f1e1fb4bde | ||
|
|
8c9479c6bb | ||
|
|
6690680538 | ||
|
|
d743f03552 | ||
|
|
2742fdfda2 | ||
|
|
0a61b0df12 | ||
|
|
343328c6b8 | ||
|
|
d3631907d6 | ||
|
|
87cfcfd374 | ||
|
|
522dfe3422 | ||
|
|
c545563d46 | ||
|
|
7a37c906a1 | ||
|
|
5b721607b1 | ||
|
|
2ef9cfa5b8 | ||
|
|
7d7797b141 | ||
|
|
401926283a | ||
|
|
2201a0808e | ||
|
|
05454818dc | ||
|
|
43deefa435 | ||
|
|
21ca2d833b | ||
|
|
bb3fd02930 | ||
|
|
c923cdbd5b | ||
|
|
019b456605 | ||
|
|
7d489192fd | ||
|
|
44a0de1861 | ||
|
|
a01d5876fa | ||
|
|
15399da9fe | ||
|
|
6da916d4ac | ||
|
|
e540144b2e | ||
|
|
76793dc969 | ||
|
|
6ac7f9f144 | ||
|
|
08fee75201 | ||
|
|
85de7d7c0c | ||
|
|
d4c6b90ca3 | ||
|
|
4bd188c438 | ||
|
|
2d12315c94 | ||
|
|
7f71fd13ae | ||
|
|
01cd2fdaf3 | ||
|
|
819adfff6f | ||
|
|
f5d2bc8a36 | ||
|
|
9db7bf5f52 | ||
|
|
410b618d18 | ||
|
|
4287732797 | ||
|
|
0cff7a8aa7 | ||
|
|
fb83d28768 | ||
|
|
342e1b7338 | ||
|
|
c2fa70ddfd | ||
|
|
8a38d5663a | ||
|
|
dd9e71843b | ||
|
|
94cfec07fd | ||
|
|
e6b7ab5749 | ||
|
|
0c50722270 | ||
|
|
b34e8c3c36 | ||
|
|
2c06be915d | ||
|
|
73aa262647 | ||
|
|
6ff5f718b6 | ||
|
|
e1cb7ce017 | ||
|
|
01bed1828b | ||
|
|
a75560d828 | ||
|
|
ec82517c89 | ||
|
|
31ffe954b6 | ||
|
|
872d60f6e4 | ||
|
|
757f0769d8 | ||
|
|
17b2740289 | ||
|
|
f6f8237a74 | ||
|
|
0bd084011a | ||
|
|
2689f4d02b | ||
|
|
3dd20ff2f8 | ||
|
|
f79751c299 | ||
|
|
813505cc13 | ||
|
|
9f35575ca3 | ||
|
|
520f367319 | ||
|
|
b6dc3b517b | ||
|
|
f0c11b1917 | ||
|
|
40cd036941 | ||
|
|
793200e5e9 | ||
|
|
6966768a55 | ||
|
|
7d46f9250c | ||
|
|
3b7cd5d89a | ||
|
|
fe98cf8dc5 | ||
|
|
e96cd730d1 | ||
|
|
4110f33cde | ||
|
|
8e79c64750 | ||
|
|
05708fc63e | ||
|
|
e8bff10f07 | ||
|
|
ae922a36a4 | ||
|
|
673a6d15d9 | ||
|
|
0bbc812f48 | ||
|
|
d01eaf0421 | ||
|
|
a30b56ebe7 | ||
|
|
6e5d67e827 | ||
|
|
20c6bfad1e | ||
|
|
50d49d9c2e | ||
|
|
d882773789 | ||
|
|
d77eac25b2 | ||
|
|
f077bc0f48 | ||
|
|
06c4716396 | ||
|
|
8700fae12a | ||
|
|
340120853f | ||
|
|
3c3fc50c79 | ||
|
|
6344edc36f | ||
|
|
445520bf38 | ||
|
|
8efd8f7f47 | ||
|
|
36bb88e1b9 | ||
|
|
161c38ba60 | ||
|
|
68b973a913 | ||
|
|
24ba1b64e9 | ||
|
|
6a4a35549b | ||
|
|
e5681bb121 | ||
|
|
bed005b639 | ||
|
|
f93d5f9ffe | ||
|
|
2ca1758832 | ||
|
|
1da44d2e96 | ||
|
|
42605ce8bc | ||
|
|
124baa4ccb | ||
|
|
2d98de1b3a | ||
|
|
966cca4bd4 | ||
|
|
2cffa7ce31 | ||
|
|
d7d80a74d5 | ||
|
|
6557910ccf | ||
|
|
c2430126d7 | ||
|
|
cb420a1dfc | ||
|
|
0184604aaf | ||
|
|
75199de534 | ||
|
|
c6ab3cf6d9 | ||
|
|
e480659765 | ||
|
|
2b63e68bbf | ||
|
|
5253d1ab77 | ||
|
|
64a474a49b | ||
|
|
c4319e678f | ||
|
|
c85dfb148a | ||
|
|
98500d70a8 | ||
|
|
fa9dbd6b62 | ||
|
|
75990a46a7 | ||
|
|
c41226d847 | ||
|
|
082e725b33 | ||
|
|
53d508072b | ||
|
|
8be979d9ae | ||
|
|
cb0f89646f | ||
|
|
9a36562347 | ||
|
|
312c2c42b6 | ||
|
|
e2c2648c14 | ||
|
|
adb50ffe32 | ||
|
|
e899779450 | ||
|
|
e39bc50eb4 | ||
|
|
651d335569 | ||
|
|
4ea3f3da1a | ||
|
|
b075bbf986 | ||
|
|
107d9e288d | ||
|
|
52f4cb4859 | ||
|
|
c5c7911dab | ||
|
|
b349e3dca8 | ||
|
|
70e79525c9 | ||
|
|
956468c29a | ||
|
|
b4e235f9f2 | ||
|
|
8b4cefd324 | ||
|
|
8acda009d9 | ||
|
|
300d4608f2 | ||
|
|
e4c05d3177 | ||
|
|
b7362c07ae | ||
|
|
4ac57f013e | ||
|
|
5750932cdf | ||
|
|
fe9f3d626d | ||
|
|
32d490313b | ||
|
|
a0c17c03eb | ||
|
|
e8474beb6f | ||
|
|
dc73b326f9 | ||
|
|
dd519206a6 | ||
|
|
fa2a0338d3 | ||
|
|
e39dfe8ea6 | ||
|
|
99cef996c7 | ||
|
|
0cc05617d1 | ||
|
|
661f878002 | ||
|
|
429187c6a8 | ||
|
|
6d97df0e99 | ||
|
|
dba0fd9b6a | ||
|
|
8dca7864f7 | ||
|
|
465e1d99f2 | ||
|
|
e071a3f6c0 |
21
.gitignore
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
src/*.exe
|
||||
src/bitcoin
|
||||
src/bitcoind
|
||||
.*.swp
|
||||
*.*~*
|
||||
*.bak
|
||||
*.rej
|
||||
*.orig
|
||||
*.o
|
||||
*.patch
|
||||
.bitcoin
|
||||
#compilation and Qt preprocessor part
|
||||
*.qm
|
||||
Makefile
|
||||
bitcoin-qt
|
||||
#resources cpp
|
||||
qrc_*.cpp
|
||||
#qt creator
|
||||
*.pro.user
|
||||
#mac specific
|
||||
.DS_Store
|
||||
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
Copyright (c) 2009-2011 Bitcoin Developers
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
9
INSTALL
Normal file
@@ -0,0 +1,9 @@
|
||||
Building Bitcoin
|
||||
|
||||
See doc/readme-qt.rst for instructions on building Bitcoin QT,
|
||||
the intended-for-end-users, nice-graphical-interface, reference
|
||||
implementation of Bitcoin.
|
||||
|
||||
See doc/build-*.txt for instructions on building bitcoind,
|
||||
the intended-for-services, no-graphical-interface, reference
|
||||
implementation of Bitcoin.
|
||||
42
README.md
Normal file
@@ -0,0 +1,42 @@
|
||||
|
||||
Bitcoin integration/staging tree
|
||||
|
||||
Development process
|
||||
===================
|
||||
|
||||
Developers work in their own trees, then submit pull requests when
|
||||
they think their feature or bug fix is ready.
|
||||
|
||||
If it is a simple/trivial/non-controversial change, then one of the
|
||||
bitcoin development team members simply pulls it.
|
||||
|
||||
If it is a more complicated or potentially controversial
|
||||
change, then the patch submitter will be asked to start a
|
||||
discussion (if they haven't already) on the mailing list:
|
||||
http://sourceforge.net/mailarchive/forum.php?forum_name=bitcoin-development
|
||||
|
||||
The patch will be accepted if there is broad consensus that it is a
|
||||
good thing. Developers should expect to rework and resubmit patches
|
||||
if they don't match the project's coding conventions (see coding.txt)
|
||||
or are controversial.
|
||||
|
||||
The master branch is regularly built and tested, but is not guaranteed
|
||||
to be completely stable. Tags are regularly created to indicate new
|
||||
official, stable release versions of Bitcoin. If you would like to
|
||||
help test the Bitcoin core, please contact QA@BitcoinTesting.org.
|
||||
|
||||
Feature branches are created when there are major new features being
|
||||
worked on by several people.
|
||||
|
||||
From time to time a pull request will become outdated. If this occurs, and
|
||||
the pull is no longer automatically mergeable; a comment on the pull will
|
||||
be used to issue a warning of closure. The pull will be closed 15 days
|
||||
after the warning if action is not taken by the author. Pull requests closed
|
||||
in this manner will have their corresponding issue labeled 'stagnant'.
|
||||
|
||||
Issues with no commits will be given a similar warning, and closed after
|
||||
15 days from their last activity. Issues closed in this manner will be
|
||||
labeled 'stale'.
|
||||
|
||||
Requests to reopen closed pull requests and/or issues can be submitted to
|
||||
QA@BitcoinTesting.org.
|
||||
201
base58.h
@@ -1,201 +0,0 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
|
||||
//
|
||||
// Why base-58 instead of standard base-64 encoding?
|
||||
// - Don't want 0OIl characters that look the same in some fonts and
|
||||
// could be used to create visually identical looking account numbers.
|
||||
// - A string with non-alphanumeric characters is not as easily accepted as an account number.
|
||||
// - E-mail usually won't line-break if there's no punctuation to break at.
|
||||
// - Doubleclicking selects the whole number as one word if it's all alphanumeric.
|
||||
//
|
||||
|
||||
|
||||
static const char* pszBase58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
||||
|
||||
|
||||
inline string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend)
|
||||
{
|
||||
CAutoBN_CTX pctx;
|
||||
CBigNum bn58 = 58;
|
||||
CBigNum bn0 = 0;
|
||||
|
||||
// Convert big endian data to little endian
|
||||
// Extra zero at the end make sure bignum will interpret as a positive number
|
||||
vector<unsigned char> vchTmp(pend-pbegin+1, 0);
|
||||
reverse_copy(pbegin, pend, vchTmp.begin());
|
||||
|
||||
// Convert little endian data to bignum
|
||||
CBigNum bn;
|
||||
bn.setvch(vchTmp);
|
||||
|
||||
// Convert bignum to string
|
||||
string str;
|
||||
str.reserve((pend - pbegin) * 138 / 100 + 1);
|
||||
CBigNum dv;
|
||||
CBigNum rem;
|
||||
while (bn > bn0)
|
||||
{
|
||||
if (!BN_div(&dv, &rem, &bn, &bn58, pctx))
|
||||
throw bignum_error("EncodeBase58 : BN_div failed");
|
||||
bn = dv;
|
||||
unsigned int c = rem.getulong();
|
||||
str += pszBase58[c];
|
||||
}
|
||||
|
||||
// Leading zeroes encoded as base58 zeros
|
||||
for (const unsigned char* p = pbegin; p < pend && *p == 0; p++)
|
||||
str += pszBase58[0];
|
||||
|
||||
// Convert little endian string to big endian
|
||||
reverse(str.begin(), str.end());
|
||||
return str;
|
||||
}
|
||||
|
||||
inline string EncodeBase58(const vector<unsigned char>& vch)
|
||||
{
|
||||
return EncodeBase58(&vch[0], &vch[0] + vch.size());
|
||||
}
|
||||
|
||||
inline bool DecodeBase58(const char* psz, vector<unsigned char>& vchRet)
|
||||
{
|
||||
CAutoBN_CTX pctx;
|
||||
vchRet.clear();
|
||||
CBigNum bn58 = 58;
|
||||
CBigNum bn = 0;
|
||||
CBigNum bnChar;
|
||||
while (isspace(*psz))
|
||||
psz++;
|
||||
|
||||
// Convert big endian string to bignum
|
||||
for (const char* p = psz; *p; p++)
|
||||
{
|
||||
const char* p1 = strchr(pszBase58, *p);
|
||||
if (p1 == NULL)
|
||||
{
|
||||
while (isspace(*p))
|
||||
p++;
|
||||
if (*p != '\0')
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
bnChar.setulong(p1 - pszBase58);
|
||||
if (!BN_mul(&bn, &bn, &bn58, pctx))
|
||||
throw bignum_error("DecodeBase58 : BN_mul failed");
|
||||
bn += bnChar;
|
||||
}
|
||||
|
||||
// Get bignum as little endian data
|
||||
vector<unsigned char> vchTmp = bn.getvch();
|
||||
|
||||
// Trim off sign byte if present
|
||||
if (vchTmp.size() >= 2 && vchTmp.end()[-1] == 0 && vchTmp.end()[-2] >= 0x80)
|
||||
vchTmp.erase(vchTmp.end()-1);
|
||||
|
||||
// Restore leading zeros
|
||||
int nLeadingZeros = 0;
|
||||
for (const char* p = psz; *p == pszBase58[0]; p++)
|
||||
nLeadingZeros++;
|
||||
vchRet.assign(nLeadingZeros + vchTmp.size(), 0);
|
||||
|
||||
// Convert little endian data to big endian
|
||||
reverse_copy(vchTmp.begin(), vchTmp.end(), vchRet.end() - vchTmp.size());
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool DecodeBase58(const string& str, vector<unsigned char>& vchRet)
|
||||
{
|
||||
return DecodeBase58(str.c_str(), vchRet);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
inline string EncodeBase58Check(const vector<unsigned char>& vchIn)
|
||||
{
|
||||
// add 4-byte hash check to the end
|
||||
vector<unsigned char> vch(vchIn);
|
||||
uint256 hash = Hash(vch.begin(), vch.end());
|
||||
vch.insert(vch.end(), (unsigned char*)&hash, (unsigned char*)&hash + 4);
|
||||
return EncodeBase58(vch);
|
||||
}
|
||||
|
||||
inline bool DecodeBase58Check(const char* psz, vector<unsigned char>& vchRet)
|
||||
{
|
||||
if (!DecodeBase58(psz, vchRet))
|
||||
return false;
|
||||
if (vchRet.size() < 4)
|
||||
{
|
||||
vchRet.clear();
|
||||
return false;
|
||||
}
|
||||
uint256 hash = Hash(vchRet.begin(), vchRet.end()-4);
|
||||
if (memcmp(&hash, &vchRet.end()[-4], 4) != 0)
|
||||
{
|
||||
vchRet.clear();
|
||||
return false;
|
||||
}
|
||||
vchRet.resize(vchRet.size()-4);
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool DecodeBase58Check(const string& str, vector<unsigned char>& vchRet)
|
||||
{
|
||||
return DecodeBase58Check(str.c_str(), vchRet);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static const unsigned char ADDRESSVERSION = 0;
|
||||
|
||||
inline string Hash160ToAddress(uint160 hash160)
|
||||
{
|
||||
// add 1-byte version number to the front
|
||||
vector<unsigned char> vch(1, ADDRESSVERSION);
|
||||
vch.insert(vch.end(), UBEGIN(hash160), UEND(hash160));
|
||||
return EncodeBase58Check(vch);
|
||||
}
|
||||
|
||||
inline bool AddressToHash160(const char* psz, uint160& hash160Ret)
|
||||
{
|
||||
vector<unsigned char> vch;
|
||||
if (!DecodeBase58Check(psz, vch))
|
||||
return false;
|
||||
if (vch.empty())
|
||||
return false;
|
||||
unsigned char nVersion = vch[0];
|
||||
if (vch.size() != sizeof(hash160Ret) + 1)
|
||||
return false;
|
||||
memcpy(&hash160Ret, &vch[1], sizeof(hash160Ret));
|
||||
return (nVersion <= ADDRESSVERSION);
|
||||
}
|
||||
|
||||
inline bool AddressToHash160(const string& str, uint160& hash160Ret)
|
||||
{
|
||||
return AddressToHash160(str.c_str(), hash160Ret);
|
||||
}
|
||||
|
||||
inline bool IsValidBitcoinAddress(const char* psz)
|
||||
{
|
||||
uint160 hash160;
|
||||
return AddressToHash160(psz, hash160);
|
||||
}
|
||||
|
||||
inline bool IsValidBitcoinAddress(const string& str)
|
||||
{
|
||||
return IsValidBitcoinAddress(str.c_str());
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
inline string PubKeyToAddress(const vector<unsigned char>& vchPubKey)
|
||||
{
|
||||
return Hash160ToAddress(Hash160(vchPubKey));
|
||||
}
|
||||
234
bitcoin-qt.pro
Normal file
@@ -0,0 +1,234 @@
|
||||
TEMPLATE = app
|
||||
TARGET =
|
||||
VERSION = 0.5.0
|
||||
INCLUDEPATH += src src/json src/qt
|
||||
DEFINES += QT_GUI
|
||||
CONFIG += no_include_pwd
|
||||
|
||||
# for boost 1.37, add -mt to the boost libraries
|
||||
# use: qmake BOOST_LIB_SUFFIX=-mt
|
||||
# or when linking against a specific BerkelyDB version: BDB_LIB_SUFFIX=-4.8
|
||||
|
||||
# Dependency library locations can be customized with BOOST_INCLUDE_PATH,
|
||||
# BOOST_LIB_PATH, BDB_INCLUDE_PATH, BDB_LIB_PATH
|
||||
# OPENSSL_INCLUDE_PATH and OPENSSL_LIB_PATH respectively
|
||||
|
||||
OBJECTS_DIR = build
|
||||
MOC_DIR = build
|
||||
UI_DIR = build
|
||||
|
||||
# use: qmake "USE_UPNP=0" (disable by default) or "USE_UPNP=1" (enable by default)
|
||||
# miniupnpc (http://miniupnp.free.fr/files/) must be installed
|
||||
count(USE_UPNP, 1) {
|
||||
message(Building with UPNP support)
|
||||
DEFINES += USE_UPNP=$$USE_UPNP
|
||||
LIBS += -lminiupnpc
|
||||
}
|
||||
|
||||
# use: qmake "USE_DBUS=1"
|
||||
contains(USE_DBUS, 1) {
|
||||
message(Building with DBUS (Freedesktop notifications) support)
|
||||
DEFINES += USE_DBUS
|
||||
QT += dbus
|
||||
}
|
||||
|
||||
# use: qmake "USE_SSL=1"
|
||||
contains(USE_DBUS, 1) {
|
||||
message(Building with SSL support for RPC)
|
||||
DEFINES += USE_SSL
|
||||
}
|
||||
|
||||
# for extra security against potential buffer overflows
|
||||
QMAKE_CXXFLAGS += -fstack-protector
|
||||
QMAKE_LFLAGS += -fstack-protector
|
||||
|
||||
# disable quite some warnings because bitcoin core "sins" a lot
|
||||
QMAKE_CXXFLAGS_WARN_ON = -fdiagnostics-show-option -Wall -Wno-invalid-offsetof -Wno-unused-variable -Wno-unused-parameter -Wno-sign-compare -Wno-char-subscripts -Wno-unused-value -Wno-sequence-point -Wno-parentheses -Wno-unknown-pragmas -Wno-switch
|
||||
|
||||
# Input
|
||||
DEPENDPATH += src/qt src src json/include
|
||||
HEADERS += src/qt/bitcoingui.h \
|
||||
src/qt/transactiontablemodel.h \
|
||||
src/qt/addresstablemodel.h \
|
||||
src/qt/optionsdialog.h \
|
||||
src/qt/sendcoinsdialog.h \
|
||||
src/qt/addressbookpage.h \
|
||||
src/qt/aboutdialog.h \
|
||||
src/qt/editaddressdialog.h \
|
||||
src/qt/bitcoinaddressvalidator.h \
|
||||
src/base58.h \
|
||||
src/bignum.h \
|
||||
src/util.h \
|
||||
src/uint256.h \
|
||||
src/serialize.h \
|
||||
src/strlcpy.h \
|
||||
src/main.h \
|
||||
src/net.h \
|
||||
src/key.h \
|
||||
src/db.h \
|
||||
src/script.h \
|
||||
src/noui.h \
|
||||
src/init.h \
|
||||
src/headers.h \
|
||||
src/irc.h \
|
||||
src/json/json_spirit_writer_template.h \
|
||||
src/json/json_spirit_writer.h \
|
||||
src/json/json_spirit_value.h \
|
||||
src/json/json_spirit_utils.h \
|
||||
src/json/json_spirit_stream_reader.h \
|
||||
src/json/json_spirit_reader_template.h \
|
||||
src/json/json_spirit_reader.h \
|
||||
src/json/json_spirit_error_position.h \
|
||||
src/json/json_spirit.h \
|
||||
src/qt/clientmodel.h \
|
||||
src/qt/guiutil.h \
|
||||
src/qt/transactionrecord.h \
|
||||
src/qt/guiconstants.h \
|
||||
src/qt/optionsmodel.h \
|
||||
src/qt/monitoreddatamapper.h \
|
||||
src/qtui.h \
|
||||
src/qt/transactiondesc.h \
|
||||
src/qt/transactiondescdialog.h \
|
||||
src/qt/bitcoinamountfield.h \
|
||||
src/wallet.h \
|
||||
src/keystore.h \
|
||||
src/qt/transactionfilterproxy.h \
|
||||
src/qt/transactionview.h \
|
||||
src/qt/walletmodel.h \
|
||||
src/bitcoinrpc.h \
|
||||
src/qt/overviewpage.h \
|
||||
src/qt/csvmodelwriter.h \
|
||||
src/crypter.h \
|
||||
src/qt/sendcoinsentry.h \
|
||||
src/qt/qvalidatedlineedit.h \
|
||||
src/qt/bitcoinunits.h \
|
||||
src/qt/qvaluecombobox.h \
|
||||
src/qt/askpassphrasedialog.h \
|
||||
src/protocol.h \
|
||||
src/qt/notificator.h
|
||||
|
||||
SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \
|
||||
src/qt/transactiontablemodel.cpp \
|
||||
src/qt/addresstablemodel.cpp \
|
||||
src/qt/optionsdialog.cpp \
|
||||
src/qt/sendcoinsdialog.cpp \
|
||||
src/qt/addressbookpage.cpp \
|
||||
src/qt/aboutdialog.cpp \
|
||||
src/qt/editaddressdialog.cpp \
|
||||
src/qt/bitcoinaddressvalidator.cpp \
|
||||
src/util.cpp \
|
||||
src/script.cpp \
|
||||
src/main.cpp \
|
||||
src/init.cpp \
|
||||
src/net.cpp \
|
||||
src/irc.cpp \
|
||||
src/db.cpp \
|
||||
src/json/json_spirit_writer.cpp \
|
||||
src/json/json_spirit_value.cpp \
|
||||
src/json/json_spirit_reader.cpp \
|
||||
src/qt/clientmodel.cpp \
|
||||
src/qt/guiutil.cpp \
|
||||
src/qt/transactionrecord.cpp \
|
||||
src/qt/optionsmodel.cpp \
|
||||
src/qt/monitoreddatamapper.cpp \
|
||||
src/qt/transactiondesc.cpp \
|
||||
src/qt/transactiondescdialog.cpp \
|
||||
src/qt/bitcoinstrings.cpp \
|
||||
src/qt/bitcoinamountfield.cpp \
|
||||
src/wallet.cpp \
|
||||
src/keystore.cpp \
|
||||
src/qt/transactionfilterproxy.cpp \
|
||||
src/qt/transactionview.cpp \
|
||||
src/qt/walletmodel.cpp \
|
||||
src/bitcoinrpc.cpp \
|
||||
src/qt/overviewpage.cpp \
|
||||
src/qt/csvmodelwriter.cpp \
|
||||
src/crypter.cpp \
|
||||
src/qt/sendcoinsentry.cpp \
|
||||
src/qt/qvalidatedlineedit.cpp \
|
||||
src/qt/bitcoinunits.cpp \
|
||||
src/qt/qvaluecombobox.cpp \
|
||||
src/qt/askpassphrasedialog.cpp \
|
||||
src/protocol.cpp \
|
||||
src/qt/notificator.cpp
|
||||
|
||||
RESOURCES += \
|
||||
src/qt/bitcoin.qrc
|
||||
|
||||
FORMS += \
|
||||
src/qt/forms/sendcoinsdialog.ui \
|
||||
src/qt/forms/addressbookpage.ui \
|
||||
src/qt/forms/aboutdialog.ui \
|
||||
src/qt/forms/editaddressdialog.ui \
|
||||
src/qt/forms/transactiondescdialog.ui \
|
||||
src/qt/forms/overviewpage.ui \
|
||||
src/qt/forms/sendcoinsentry.ui \
|
||||
src/qt/forms/askpassphrasedialog.ui
|
||||
|
||||
CODECFORTR = UTF-8
|
||||
|
||||
# for lrelease/lupdate
|
||||
TRANSLATIONS = src/qt/locale/bitcoin_de.ts \
|
||||
src/qt/locale/bitcoin_es.ts \
|
||||
src/qt/locale/bitcoin_nl.ts \
|
||||
src/qt/locale/bitcoin_ru.ts
|
||||
|
||||
isEmpty(QMAKE_LRELEASE) {
|
||||
win32:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\lrelease.exe
|
||||
else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease
|
||||
}
|
||||
isEmpty(TS_DIR):TS_DIR = src/qt/locale
|
||||
# automatically build translations, so they can be included in resource file
|
||||
TSQM.name = lrelease ${QMAKE_FILE_IN}
|
||||
TSQM.input = TRANSLATIONS
|
||||
TSQM.output = $$TS_DIR/${QMAKE_FILE_BASE}.qm
|
||||
TSQM.commands = $$QMAKE_LRELEASE ${QMAKE_FILE_IN}
|
||||
TSQM.CONFIG = no_link
|
||||
QMAKE_EXTRA_COMPILERS += TSQM
|
||||
PRE_TARGETDEPS += compiler_TSQM_make_all
|
||||
|
||||
# "Other files" to show in Qt Creator
|
||||
OTHER_FILES += \
|
||||
doc/*.rst doc/*.txt doc/README README.md
|
||||
|
||||
# platform specific defaults, if not overridden on command line
|
||||
isEmpty(BOOST_LIB_SUFFIX) {
|
||||
macx:BOOST_LIB_SUFFIX = -mt
|
||||
windows:BOOST_LIB_SUFFIX = -mgw44-mt-1_43
|
||||
}
|
||||
|
||||
isEmpty(BDB_LIB_PATH) {
|
||||
macx:BDB_LIB_PATH = /opt/local/lib/db48
|
||||
}
|
||||
|
||||
isEmpty(BDB_LIB_SUFFIX) {
|
||||
macx:BDB_LIB_SUFFIX = -4.8
|
||||
}
|
||||
|
||||
isEmpty(BDB_INCLUDE_PATH) {
|
||||
macx:BDB_INCLUDE_PATH = /opt/local/include/db48
|
||||
}
|
||||
|
||||
isEmpty(BOOST_LIB_PATH) {
|
||||
macx:BOOST_LIB_PATH = /opt/local/lib
|
||||
}
|
||||
|
||||
isEmpty(BOOST_INCLUDE_PATH) {
|
||||
macx:BOOST_INCLUDE_PATH = /opt/local/include
|
||||
}
|
||||
|
||||
windows:LIBS += -lws2_32 -lgdi32
|
||||
windows:DEFINES += WIN32
|
||||
windows:RC_FILE = src/qt/res/bitcoin-qt.rc
|
||||
|
||||
macx:DEFINES += MAC_OSX MSG_NOSIGNAL=0 BOOST_FILESYSTEM_VERSION=3
|
||||
macx:ICON = src/qt/res/icons/bitcoin.icns
|
||||
macx:TARGET = "Bitcoin-Qt"
|
||||
|
||||
# Set libraries and includes at end, to use platform-defined defaults if not overridden
|
||||
INCLUDEPATH += $$BOOST_INCLUDE_PATH $$BDB_INCLUDE_PATH $$OPENSSL_INCLUDE_PATH
|
||||
LIBS += $$join(BOOST_LIB_PATH,,-L,) $$join(BDB_LIB_PATH,,-L,) $$join(OPENSSL_LIB_PATH,,-L,)
|
||||
LIBS += -lssl -lcrypto -ldb_cxx$$BDB_LIB_SUFFIX
|
||||
LIBS += -lboost_system$$BOOST_LIB_SUFFIX -lboost_filesystem$$BOOST_LIB_SUFFIX -lboost_program_options$$BOOST_LIB_SUFFIX -lboost_thread$$BOOST_LIB_SUFFIX
|
||||
|
||||
system($$QMAKE_LRELEASE -silent $$_PRO_FILE_)
|
||||
2
bugs.txt
@@ -1,2 +0,0 @@
|
||||
Known bugs:
|
||||
- Window flickers when blocks are added (problem with repainting?)
|
||||
114
build-msw.txt
@@ -1,114 +0,0 @@
|
||||
Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
Distributed under the MIT/X11 software license, see the accompanying
|
||||
file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
This product includes software developed by the OpenSSL Project for use in
|
||||
the OpenSSL Toolkit (http://www.openssl.org/). This product includes
|
||||
cryptographic software written by Eric Young (eay@cryptsoft.com).
|
||||
|
||||
|
||||
WINDOWS BUILD NOTES
|
||||
===================
|
||||
|
||||
Compilers Supported
|
||||
-------------------
|
||||
MinGW GCC (recommended)
|
||||
|
||||
MSVC 6.0 SP6: You'll need Boost version 1.34 because they dropped support
|
||||
for MSVC 6.0 after that. However, they didn't add Asio until 1.35.
|
||||
You should still be able to build with MSVC 6.0 by adding Asio to 1.34 by
|
||||
unpacking boost_asio_*.zip into the boost directory:
|
||||
http://sourceforge.net/projects/asio/files/asio
|
||||
|
||||
MSVC 8.0 (2005) SP1 has been tested. Note: MSVC 7.0 and up have a habit of
|
||||
linking to runtime DLLs that are not installed on XP by default.
|
||||
|
||||
|
||||
Dependencies
|
||||
------------
|
||||
Libraries you need to download separately and build:
|
||||
|
||||
default path download
|
||||
wxWidgets-2.9 \wxwidgets http://www.wxwidgets.org/downloads/
|
||||
OpenSSL \openssl http://www.openssl.org/source/
|
||||
Berkeley DB \db http://www.oracle.com/technology/software/products/berkeley-db/index.html
|
||||
Boost \boost http://www.boost.org/users/download/
|
||||
|
||||
Their licenses:
|
||||
wxWidgets LGPL 2.1 with very liberal exceptions
|
||||
OpenSSL Old BSD license with the problematic advertising requirement
|
||||
Berkeley DB New BSD license with additional requirement that linked software must be free open source
|
||||
Boost MIT-like license
|
||||
|
||||
Versions used in this release:
|
||||
MinGW GCC 3.4.5
|
||||
wxWidgets 2.9.0
|
||||
OpenSSL 0.9.8k
|
||||
Berkeley DB 4.7.25.NC
|
||||
Boost 1.42.1
|
||||
|
||||
|
||||
Notes
|
||||
-----
|
||||
The UI layout is edited with wxFormBuilder. The project file is
|
||||
uiproject.fbp. It generates uibase.cpp and uibase.h, which define base
|
||||
classes that do the rote work of constructing all the UI elements.
|
||||
|
||||
The release is built with GCC and then "strip bitcoin.exe" to strip the debug
|
||||
symbols, which reduces the executable size by about 90%.
|
||||
|
||||
|
||||
wxWidgets
|
||||
---------
|
||||
cd \wxwidgets\build\msw
|
||||
make -f makefile.gcc
|
||||
or
|
||||
nmake -f makefile.vc
|
||||
|
||||
|
||||
OpenSSL
|
||||
-------
|
||||
Bitcoin does not use any encryption. If you want to do a no-everything
|
||||
build of OpenSSL to exclude encryption routines, a few patches are required.
|
||||
(instructions for OpenSSL v0.9.8k)
|
||||
|
||||
Edit engines\e_gmp.c and engines\e_capi.c and add this #ifndef around
|
||||
the openssl/rsa.h include:
|
||||
#ifndef OPENSSL_NO_RSA
|
||||
#include <openssl/rsa.h>
|
||||
#endif
|
||||
|
||||
Edit ms\mingw32.bat and replace the Configure line's parameters with this
|
||||
no-everything list. You have to put this in the batch file because batch
|
||||
files can't take more than nine command line parameters.
|
||||
perl Configure mingw threads no-rc2 no-rc4 no-rc5 no-idea no-des no-bf no-cast no-aes no-camellia no-seed no-rsa no-dh
|
||||
|
||||
Also REM out the following line in ms\mingw32.bat after the mingw32-make
|
||||
line. The build fails after it's already finished building libeay32, which
|
||||
is all we care about, but the failure aborts the script before it runs
|
||||
dllwrap to generate libeay32.dll.
|
||||
REM if errorlevel 1 goto end
|
||||
|
||||
Build
|
||||
cd \openssl
|
||||
ms\mingw32.bat
|
||||
|
||||
If you want to use it with MSVC, generate the .lib file
|
||||
lib /machine:i386 /def:ms\libeay32.def /out:out\libeay32.lib
|
||||
|
||||
|
||||
Berkeley DB
|
||||
-----------
|
||||
Using MinGW and MSYS:
|
||||
cd \db\build_unix
|
||||
sh ../dist/configure --enable-mingw --enable-cxx
|
||||
make
|
||||
|
||||
|
||||
Boost
|
||||
-----
|
||||
download bjam.exe from
|
||||
http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=72941
|
||||
cd \boost
|
||||
bjam toolset=gcc --build-type=complete stage
|
||||
or
|
||||
bjam toolset=msvc --build-type=complete stage
|
||||
217
build-osx.txt
@@ -1,217 +0,0 @@
|
||||
Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
Distributed under the MIT/X11 software license, see the accompanying
|
||||
file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
This product includes software developed by the OpenSSL Project for use in
|
||||
the OpenSSL Toolkit (http://www.openssl.org/). This product includes
|
||||
cryptographic software written by Eric Young (eay@cryptsoft.com).
|
||||
|
||||
|
||||
Mac OS X build instructions
|
||||
Laszlo Hanyecz (solar@heliacal.net)
|
||||
|
||||
|
||||
Tested on 10.5 and 10.6 intel. PPC is not supported because it's big-endian.
|
||||
|
||||
All of the commands should be executed in Terminal.app.. it's in
|
||||
/Applications/Utilities
|
||||
|
||||
You need to install XCode with all the options checked so that the compiler
|
||||
and everything is available in /usr not just /Developer
|
||||
I think it comes on the DVD but you can get the current version from
|
||||
http://developer.apple.com
|
||||
|
||||
|
||||
1. Pick a directory to work inside.. something like ~/bitcoin works. The
|
||||
structure I use looks like this:
|
||||
(~ is your home directory)
|
||||
|
||||
~/bitcoin
|
||||
~/bitcoin/trunk # source code
|
||||
~/bitcoin/deps # dependencies.. like libraries and headers needed to compile
|
||||
~/bitcoin/Bitcoin.app # the application bundle where you can run the app
|
||||
|
||||
Just execute: mkdir ~/bitcoin
|
||||
This will create the top dir for you..
|
||||
|
||||
WARNING: do not use the ~ notation with the configure scripts.. use the full
|
||||
name of the directory, for example /Users/james/bitcoin/deps for a user named
|
||||
'james'. In my examples I am using 'macosuser' so make sure you change that.
|
||||
|
||||
2. Check out the trunk version of the bitcoin code from subversion:
|
||||
|
||||
cd ~/bitcoin
|
||||
svn checkout https://bitcoin.svn.sourceforge.net/svnroot/bitcoin/trunk
|
||||
|
||||
This will make ~/bitcoin/trunk for you with all the files from subversion.
|
||||
|
||||
3. Get and build the dependencies
|
||||
|
||||
|
||||
Boost
|
||||
-----
|
||||
|
||||
Download from http://www.boost.org/users/download/
|
||||
I'm assuming it ended up in ~/Downloads..
|
||||
|
||||
mkdir ~/bitcoin/deps
|
||||
cd ~/bitcoin/deps
|
||||
tar xvjf ~/Downloads/boost_1_42_0.tar.bz2
|
||||
cd boost_1_42_0
|
||||
./bootstrap.sh
|
||||
./bjam architecture=combined address-model=32_64 macosx-version=10.6 macosx-version-min=10.5 link=static runtime-link=static --toolset=darwin --prefix=/Users/macosuser/bitcoin/deps install
|
||||
|
||||
This part takes a while.. use your judgement and fix it if something doesn't
|
||||
build for some reason.
|
||||
|
||||
Change the prefix to whatever your directory is (my username in this example
|
||||
is macosuser). I'm also running on 10.6 so i have macosx-version=10.6 change
|
||||
to 10.5 if you're using leopard.
|
||||
|
||||
This is what my output looked like at the end:
|
||||
...failed updating 2 targets...
|
||||
...skipped 144 targets...
|
||||
...updated 8074 targets...
|
||||
|
||||
|
||||
OpenSSL
|
||||
-------
|
||||
|
||||
Download from http://www.openssl.org/source/
|
||||
|
||||
We would like to build this as a 32 bit/64 bit library so we actually build it
|
||||
2 times and join it together here.. If you downloaded with safari it already
|
||||
uncompressed it so it will just be a tar not a tar.gz
|
||||
|
||||
cd ~/bitcoin/deps
|
||||
tar xvf ~/Downloads/openssl-1.0.0.tar
|
||||
mv openssl-1.0.0 openssl-1.0.0-i386
|
||||
tar xvf ~/Downloads/openssl-1.0.0.tar
|
||||
mv openssl-1.0.0 openssl-1.0.0-x86_64
|
||||
# build i386 (32 bit intel) binary
|
||||
cd openssl-1.0.0-i386
|
||||
./Configure --prefix=/Users/macosuser/bitcoin/deps --openssldir=/Users/macosuser/deps/openssl darwin-i386-cc && make
|
||||
make install # only do this on one of the architectures, to install the headers
|
||||
cd ..
|
||||
# build x86_64 (64 bit intel) binary
|
||||
cd openssl-1.0.0-x86_64
|
||||
./Configure --prefix=/Users/macosuser/bitcoin/deps --openssldir=/Users/macosuser/deps/openssl darwin64-x86_64-cc && make
|
||||
cd ..
|
||||
|
||||
# combine the libs
|
||||
cd ~/bitcoin/deps
|
||||
lipo -arch i386 openssl-1.0.0-i386/libcrypto.a -arch x86_64 openssl-1.0.0-x86_64/libcrypto.a -o lib/libcrypto.a -create
|
||||
lipo -arch i386 openssl-1.0.0-i386/libssl.a -arch x86_64 openssl-1.0.0-x86_64/libssl.a -o lib/libssl.a -create
|
||||
|
||||
Verify your binaries
|
||||
|
||||
file lib/libcrypto.a
|
||||
|
||||
output should look like this:
|
||||
|
||||
ib/libcrypto.a: Mach-O universal binary with 2 architectures
|
||||
lib/libcrypto.a (for architecture i386): current ar archive random library
|
||||
lib/libcrypto.a (for architecture x86_64): current ar archive random library
|
||||
|
||||
|
||||
Berkeley DB
|
||||
-----------
|
||||
|
||||
Download from http://freshmeat.net/projects/berkeleydb/
|
||||
|
||||
cd ~/bitcoin/deps
|
||||
tar xvf ~/Downloads/db-4.8.26.tar
|
||||
cd db-4.8.26/build_unix
|
||||
../dist/configure --prefix=/Users/macosuser/bitcoin/deps --enable-cxx && make && make install
|
||||
|
||||
|
||||
wxWidgets
|
||||
---------
|
||||
|
||||
This is the big one..
|
||||
|
||||
Check it out from svn
|
||||
|
||||
cd ~/bitcoin/deps
|
||||
svn checkout http://svn.wxwidgets.org/svn/wx/wxWidgets/trunk wxWidgets-trunk
|
||||
|
||||
This will make a wxWidgets-trunk directory in deps.
|
||||
|
||||
Use this script snippet, change your prefix to whatever your dir is:
|
||||
|
||||
PREFIX=~/bitcoin/deps
|
||||
SRCDIR="$PREFIX/wxWidgets-trunk"
|
||||
BUILDDIR="$SRCDIR/macbuild"
|
||||
|
||||
cd "$PREFIX" &&
|
||||
#svn checkout http://svn.wxwidgets.org/svn/wx/wxWidgets/trunk wxWidgets-trunk &&
|
||||
cd "$SRCDIR" &&
|
||||
|
||||
[ -f include/wx/hashmap.h.orig ] || cp include/wx/hashmap.h include/wx/hashmap.h.orig &&
|
||||
sed 's/if wxUSE_STL/if 0 \&\& wxUSE_STL/g' < include/wx/hashmap.h.orig > include/wx/hashmap.h &&
|
||||
|
||||
[ -f include/wx/hashset.h.orig ] || cp include/wx/hashset.h include/wx/hashset.h.orig &&
|
||||
sed 's/if wxUSE_STL/if 0 \&\& wxUSE_STL/g' < include/wx/hashset.h.orig > include/wx/hashset.h &&
|
||||
|
||||
|
||||
|
||||
rm -vrf "$BUILDDIR" &&
|
||||
mkdir "$BUILDDIR" &&
|
||||
cd "$BUILDDIR" &&
|
||||
|
||||
../configure --prefix="$PREFIX" \
|
||||
--with-osx_cocoa \
|
||||
--disable-shared \
|
||||
--disable-debug_flag \
|
||||
--with-macosx-version-min=10.5 \
|
||||
--enable-stl \
|
||||
--enable-utf8 \
|
||||
--enable-universal_binary \
|
||||
--with-libjpeg=builtin \
|
||||
--with-libpng=builtin \
|
||||
--with-regex=builtin \
|
||||
--with-libtiff=builtin \
|
||||
--with-zlib=builtin \
|
||||
--with-expat=builtin \
|
||||
--with-macosx-sdk=/Developer/SDKs/MacOSX10.5.sdk &&
|
||||
|
||||
|
||||
find . -name Makefile |
|
||||
while read i; do
|
||||
echo $i;
|
||||
sed 's/-arch i386/-arch i386 -arch x86_64/g' < "$i" > "$i".new &&
|
||||
mv "$i" "$i".old &&
|
||||
mv "$i".new "$i";
|
||||
done
|
||||
|
||||
|
||||
|
||||
make &&
|
||||
make install
|
||||
|
||||
|
||||
|
||||
Now you should be able to build bitcoin
|
||||
|
||||
cd ~/bitcoin/trunk
|
||||
make -f makefile.osx bitcoin
|
||||
|
||||
Before you can run it, you need to create an application bundle for Mac OS.
|
||||
Create the directories in terminal using mkdir and copy the files into place.
|
||||
They are available at http://heliacal.net/~solar/bitcoin/mac-build/
|
||||
You need the Info.plist and the .ins file. The Contents/MacOS/bitcoin file is
|
||||
the output of the build.
|
||||
Your directory structure should look like this:
|
||||
|
||||
Bitcoin.app
|
||||
Bitcoin.app/Contents
|
||||
Bitcoin.app/Contents/Info.plist
|
||||
Bitcoin.app/Contents/MacOS
|
||||
Bitcoin.app/Contents/MacOS/bitcoin
|
||||
Bitcoin.app/Contents/Resources
|
||||
Bitcoin.app/Contents/Resources/BitcoinAppIcon.icns
|
||||
|
||||
To run it you can just click the Bitcoin.app in Finder, or just do open
|
||||
~/bitcoin/Bitcoin.app
|
||||
If you want to run it with arguments you can just run it without backgrounding
|
||||
by specifying the full name in terminal:
|
||||
~/bitcoin/Bitcoin.app/Contents/MacOS/bitcoin -addnode=192.75.207.66
|
||||
@@ -1,83 +0,0 @@
|
||||
Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
Distributed under the MIT/X11 software license, see the accompanying
|
||||
file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
This product includes software developed by the OpenSSL Project for use in
|
||||
the OpenSSL Toolkit (http://www.openssl.org/). This product includes
|
||||
cryptographic software written by Eric Young (eay@cryptsoft.com).
|
||||
|
||||
|
||||
UNIX BUILD NOTES
|
||||
================
|
||||
|
||||
Dependencies
|
||||
------------
|
||||
sudo apt-get install build-essential
|
||||
sudo apt-get install libgtk2.0-dev
|
||||
sudo apt-get install libssl-dev
|
||||
sudo apt-get install libdb4.7-dev
|
||||
sudo apt-get install libdb4.7++-dev
|
||||
sudo apt-get install libboost-all-dev
|
||||
|
||||
We're now using wxWidgets 2.9, which uses UTF-8.
|
||||
|
||||
There isn't currently a debian package of wxWidgets we can use. The 2.8
|
||||
packages for Karmic are UTF-16 unicode and won't work for us, and we've had
|
||||
trouble building 2.8 on 64-bit.
|
||||
|
||||
You need to download wxWidgets from http://www.wxwidgets.org/downloads/
|
||||
and build it yourself. See the build instructions and configure parameters
|
||||
below.
|
||||
|
||||
Licenses of statically linked libraries:
|
||||
wxWidgets LGPL 2.1 with very liberal exceptions
|
||||
Berkeley DB New BSD license with additional requirement that linked software must be free open source
|
||||
Boost MIT-like license
|
||||
|
||||
Versions used in this release:
|
||||
GCC 4.4.3
|
||||
OpenSSL 0.9.8k
|
||||
wxWidgets 2.9.0
|
||||
Berkeley DB 4.7.25.NC
|
||||
Boost 1.40.0
|
||||
|
||||
|
||||
Notes
|
||||
-----
|
||||
The UI layout is edited with wxFormBuilder. The project file is
|
||||
uiproject.fbp. It generates uibase.cpp and uibase.h, which define base
|
||||
classes that do the rote work of constructing all the UI elements.
|
||||
|
||||
The release is built with GCC and then "strip bitcoin" to strip the debug
|
||||
symbols, which reduces the executable size by about 90%.
|
||||
|
||||
|
||||
wxWidgets
|
||||
---------
|
||||
cd /usr/local
|
||||
tar -xzvf wxWidgets-2.9.0.tar.gz
|
||||
cd /usr/local/wxWidgets-2.9.0
|
||||
mkdir buildgtk
|
||||
cd buildgtk
|
||||
../configure --with-gtk --enable-debug --disable-shared --enable-monolithic
|
||||
make
|
||||
sudo su
|
||||
make install
|
||||
ldconfig
|
||||
su <username>
|
||||
cd ..
|
||||
mkdir buildbase
|
||||
cd buildbase
|
||||
../configure --disable-gui --enable-debug --disable-shared --enable-monolithic
|
||||
make
|
||||
sudo su
|
||||
make install
|
||||
ldconfig
|
||||
|
||||
|
||||
Boost
|
||||
-----
|
||||
If you want to build Boost yourself,
|
||||
cd /usr/local/boost_1_40_0
|
||||
su
|
||||
./bootstrap.sh
|
||||
./bjam install
|
||||
@@ -1,7 +0,0 @@
|
||||
Changes after 0.1.5:
|
||||
--------------------
|
||||
+ Options dialog layout changed - added the UI options panel
|
||||
+ Minimize to tray feature
|
||||
+ Startup on system boot feature
|
||||
+ Ask before closing
|
||||
+ NSIS installer
|
||||
32
contrib/Bitcoin.app/Contents/Info.plist
Normal file
@@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>Bitcoin</string>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>bitcoin</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>org.bitcoin.bitcoin</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>Bitcoin</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>0.4.1</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>400</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>10.5</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>BitcoinAppIcon.icns</string>
|
||||
<key>LSMultipleInstancesProhibited</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
0
contrib/Bitcoin.app/Contents/MacOS/.higit
Normal file
BIN
contrib/Bitcoin.app/Contents/Resources/BitcoinAppIcon.icns
Normal file
324
contrib/bitrpc/bitrpc.py
Normal file
@@ -0,0 +1,324 @@
|
||||
from jsonrpc import ServiceProxy
|
||||
import sys
|
||||
import string
|
||||
|
||||
# ===== BEGIN USER SETTINGS =====
|
||||
# if you do not set these you will be prompted for a password for every command
|
||||
rpcuser = ""
|
||||
rpcpass = ""
|
||||
# ====== END USER SETTINGS ======
|
||||
|
||||
|
||||
if rpcpass == "":
|
||||
access = ServiceProxy("http://127.0.0.1:8332")
|
||||
else:
|
||||
access = ServiceProxy("http://"+rpcuser+":"+rpcpass+"@127.0.0.1:8332")
|
||||
cmd = sys.argv[1].lower()
|
||||
|
||||
if cmd == "backupwallet":
|
||||
try:
|
||||
path = raw_input("Enter destination path/filename: ")
|
||||
print access.backupwallet(path)
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "getaccount":
|
||||
try:
|
||||
addr = raw_input("Enter a Bitcoin address: ")
|
||||
print access.getaccount(addr)
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "getaccountaddress":
|
||||
try:
|
||||
acct = raw_input("Enter an account name: ")
|
||||
print access.getaccountaddress(acct)
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "getaddressesbyaccount":
|
||||
try:
|
||||
acct = raw_input("Enter an account name: ")
|
||||
print access.getaddressesbyaccount(acct)
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "getbalance":
|
||||
try:
|
||||
acct = raw_input("Enter an account (optional): ")
|
||||
mc = raw_input("Minimum confirmations (optional): ")
|
||||
try:
|
||||
print access.getbalance(acct, mc)
|
||||
except:
|
||||
print access.getbalance()
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "getblockbycount":
|
||||
try:
|
||||
height = raw_input("Height: ")
|
||||
print access.getblockbycount(height)
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "getblockcount":
|
||||
try:
|
||||
print access.getblockcount()
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "getblocknumber":
|
||||
try:
|
||||
print access.getblocknumber()
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "getconnectioncount":
|
||||
try:
|
||||
print access.getconnectioncount()
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "getdifficulty":
|
||||
try:
|
||||
print access.getdifficulty()
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "getgenerate":
|
||||
try:
|
||||
print access.getgenerate()
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "gethashespersec":
|
||||
try:
|
||||
print access.gethashespersec()
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "getinfo":
|
||||
try:
|
||||
print access.getinfo()
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "getnewaddress":
|
||||
try:
|
||||
acct = raw_input("Enter an account name: ")
|
||||
try:
|
||||
print access.getnewaddress(acct)
|
||||
except:
|
||||
print access.getnewaddress()
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "getreceivedbyaccount":
|
||||
try:
|
||||
acct = raw_input("Enter an account (optional): ")
|
||||
mc = raw_input("Minimum confirmations (optional): ")
|
||||
try:
|
||||
print access.getreceivedbyaccount(acct, mc)
|
||||
except:
|
||||
print access.getreceivedbyaccount()
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "getreceivedbyaddress":
|
||||
try:
|
||||
addr = raw_input("Enter a Bitcoin address (optional): ")
|
||||
mc = raw_input("Minimum confirmations (optional): ")
|
||||
try:
|
||||
print access.getreceivedbyaddress(addr, mc)
|
||||
except:
|
||||
print access.getreceivedbyaddress()
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "gettransaction":
|
||||
try:
|
||||
txid = raw_input("Enter a transaction ID: ")
|
||||
print access.gettransaction(txid)
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "getwork":
|
||||
try:
|
||||
data = raw_input("Data (optional): ")
|
||||
try:
|
||||
print access.gettransaction(data)
|
||||
except:
|
||||
print access.gettransaction()
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "help":
|
||||
try:
|
||||
cmd = raw_input("Command (optional): ")
|
||||
try:
|
||||
print access.help(cmd)
|
||||
except:
|
||||
print access.help()
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "listaccounts":
|
||||
try:
|
||||
mc = raw_input("Minimum confirmations (optional): ")
|
||||
try:
|
||||
print access.listaccounts(mc)
|
||||
except:
|
||||
print access.listaccounts()
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "listreceivedbyaccount":
|
||||
try:
|
||||
mc = raw_input("Minimum confirmations (optional): ")
|
||||
incemp = raw_input("Include empty? (true/false, optional): ")
|
||||
try:
|
||||
print access.listreceivedbyaccount(mc, incemp)
|
||||
except:
|
||||
print access.listreceivedbyaccount()
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "listreceivedbyaddress":
|
||||
try:
|
||||
mc = raw_input("Minimum confirmations (optional): ")
|
||||
incemp = raw_input("Include empty? (true/false, optional): ")
|
||||
try:
|
||||
print access.listreceivedbyaddress(mc, incemp)
|
||||
except:
|
||||
print access.listreceivedbyaddress()
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "listtransactions":
|
||||
try:
|
||||
acct = raw_input("Account (optional): ")
|
||||
count = raw_input("Number of transactions (optional): ")
|
||||
frm = raw_input("Skip (optional):")
|
||||
try:
|
||||
print access.listtransactions(acct, count, frm)
|
||||
except:
|
||||
print access.listtransactions()
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "move":
|
||||
try:
|
||||
frm = raw_input("From: ")
|
||||
to = raw_input("To: ")
|
||||
amt = raw_input("Amount:")
|
||||
mc = raw_input("Minimum confirmations (optional): ")
|
||||
comment = raw_input("Comment (optional): ")
|
||||
try:
|
||||
print access.move(frm, to, amt, mc, comment)
|
||||
except:
|
||||
print access.move(frm, to, amt)
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "sendfrom":
|
||||
try:
|
||||
frm = raw_input("From: ")
|
||||
to = raw_input("To: ")
|
||||
amt = raw_input("Amount:")
|
||||
mc = raw_input("Minimum confirmations (optional): ")
|
||||
comment = raw_input("Comment (optional): ")
|
||||
commentto = raw_input("Comment-to (optional): ")
|
||||
try:
|
||||
print access.sendfrom(frm, to, amt, mc, comment, commentto)
|
||||
except:
|
||||
print access.sendfrom(frm, to, amt)
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "sendmany":
|
||||
try:
|
||||
frm = raw_input("From: ")
|
||||
to = raw_input("To (in format address1:amount1,address2:amount2,...): ")
|
||||
mc = raw_input("Minimum confirmations (optional): ")
|
||||
comment = raw_input("Comment (optional): ")
|
||||
try:
|
||||
print access.sendmany(frm,to,mc,comment)
|
||||
except:
|
||||
print access.sendmany(frm,to)
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "sendtoaddress":
|
||||
try:
|
||||
to = raw_input("To (in format address1:amount1,address2:amount2,...): ")
|
||||
amt = raw_input("Amount:")
|
||||
comment = raw_input("Comment (optional): ")
|
||||
commentto = raw_input("Comment-to (optional): ")
|
||||
try:
|
||||
print access.sendtoaddress(to,amt,comment,commentto)
|
||||
except:
|
||||
print access.sendtoaddress(to,amt)
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "setaccount":
|
||||
try:
|
||||
addr = raw_input("Address: ")
|
||||
acct = raw_input("Account:")
|
||||
print access.setaccount(addr,acct)
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "setgenerate":
|
||||
try:
|
||||
gen= raw_input("Generate? (true/false): ")
|
||||
cpus = raw_input("Max processors/cores (-1 for unlimited, optional):")
|
||||
try:
|
||||
print access.setgenerate(gen, cpus)
|
||||
except:
|
||||
print access.setgenerate(gen)
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "settxfee":
|
||||
try:
|
||||
amt = raw_input("Amount:")
|
||||
print access.settxfee(amt)
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "stop":
|
||||
try:
|
||||
print access.stop()
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "validateaddress":
|
||||
try:
|
||||
addr = raw_input("Address: ")
|
||||
print access.validateaddress(addr)
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "walletpassphrase":
|
||||
try:
|
||||
pwd = raw_input("Enter wallet passphrase: ")
|
||||
access.walletpassphrase(pwd, 60)
|
||||
print "\n---Wallet unlocked---\n"
|
||||
except:
|
||||
print "\n---An error occurred---\n"
|
||||
|
||||
elif cmd == "walletpassphrasechange":
|
||||
try:
|
||||
pwd = raw_input("Enter old wallet passphrase: ")
|
||||
pwd2 = raw_input("Enter new wallet passphrase: ")
|
||||
access.walletpassphrasechange(pwd, pwd2)
|
||||
print
|
||||
print "\n---Passphrase changed---\n"
|
||||
except:
|
||||
print
|
||||
print "\n---An error occurred---\n"
|
||||
print
|
||||
|
||||
else:
|
||||
print "Command not found or not supported"
|
||||
47
contrib/create_osx_dmg.sh
Executable file
@@ -0,0 +1,47 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Creates a Bitcoin.dmg OSX file from the contrib/BitcoinTemplate.dmg file
|
||||
#
|
||||
# Recipe from: http://digital-sushi.org/entry/how-to-create-a-disk-image-installer-for-apple-mac-os-x/
|
||||
#
|
||||
# To make a prettier BitcoinTemplate.dmg:
|
||||
# + open (mount) BitcoinTemplate.dmg
|
||||
# + change the file properties, icon positions, background image, etc
|
||||
# + eject, then commit the changed BitcoinTemplate.dmg
|
||||
#
|
||||
|
||||
CWD=$(pwd)
|
||||
|
||||
if [ $# -lt 1 ]; then
|
||||
if [ $(basename $CWD) == "contrib" ]
|
||||
then
|
||||
TOP=$(dirname $CWD)
|
||||
else
|
||||
echo "Usage: $0 /path/to/bitcoin/tree"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
TOP=$1
|
||||
fi
|
||||
|
||||
# Create Bitcoin-Qt.app
|
||||
cd "$TOP"
|
||||
if [ ! -e Makefile ]; then qmake bitcoin-qt.pro; fi
|
||||
make
|
||||
macdeployqt Bitcoin-Qt.app
|
||||
# Workaround a bug in macdeployqt: https://bugreports.qt.nokia.com/browse/QTBUG-21913
|
||||
# (when fixed, this won't be necessary)
|
||||
cp /opt/local/lib/db48/libdb_cxx-4.8.dylib Bitcoin-Qt.app/Contents/Frameworks/
|
||||
install_name_tool -id @executable_path/../Frameworks/libdb_cxx-4.8.dylib \
|
||||
Bitcoin-Qt.app/Contents/Frameworks/libdb_cxx-4.8.dylib
|
||||
install_name_tool -change libqt.3.dylib \
|
||||
@executable_path/../Frameworks/libqt.3.dylib \
|
||||
Bitcoin-Qt.app/Contents/MacOS/Bitcoin-Qt
|
||||
|
||||
# Create a .dmg
|
||||
macdeployqt Bitcoin-Qt.app -dmg
|
||||
|
||||
# Compile bitcoind
|
||||
cd "$TOP/src"
|
||||
STATIC=1 make -f makefile.osx
|
||||
|
||||
38
contrib/gitian-descriptors/boost-win32.yml
Normal file
@@ -0,0 +1,38 @@
|
||||
---
|
||||
name: "boost"
|
||||
suites:
|
||||
- "lucid"
|
||||
architectures:
|
||||
- "i386"
|
||||
packages:
|
||||
- "mingw32"
|
||||
- "faketime"
|
||||
- "zip"
|
||||
reference_datetime: "2011-01-30 00:00:00"
|
||||
remotes: []
|
||||
files:
|
||||
- "boost_1_47_0.tar.bz2"
|
||||
script: |
|
||||
TMPDIR="$HOME/tmpdir"
|
||||
mkdir -p $TMPDIR/bin/$GBUILD_BITS $TMPDIR/include
|
||||
tar xjf boost_1_47_0.tar.bz2
|
||||
cd boost_1_47_0
|
||||
echo "using gcc : 4.4 : i586-mingw32msvc-g++
|
||||
:
|
||||
<rc>i586-mingw32msvc-windres
|
||||
<archiver>i586-mingw32msvc-ar
|
||||
<cxxflags>-frandom-seed=boost1
|
||||
;" > user-config.jam
|
||||
./bootstrap.sh --without-icu
|
||||
./bjam toolset=gcc target-os=windows threadapi=win32 threading=multi variant=release link=static --user-config=user-config.jam --without-mpi --without-python -sNO_BZIP2=1 -sNO_ZLIB=1 --layout=tagged --build-type=complete $MAKEOPTS stage
|
||||
for lib in chrono date_time exception filesystem graph iostreams math_c99f math_c99l math_c99 math_tr1f math_tr1l math_tr1 prg_exec_monitor program_options random regex serialization signals system test_exec_monitor thread_win32 unit_test_framework wave wserialization; do
|
||||
mkdir $lib
|
||||
(cd $lib ; ar xf ../stage/lib/libboost_${lib}-mt-s.a)
|
||||
mv $lib $TMPDIR/bin/$GBUILD_BITS
|
||||
done
|
||||
cp -a boost $TMPDIR/include
|
||||
cd $TMPDIR
|
||||
export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
|
||||
export FAKETIME=$REFERENCE_DATETIME
|
||||
zip -r boost-win32-1.47.0-gitian.zip *
|
||||
cp boost-win32-1.47.0-gitian.zip $OUTDIR
|
||||
92
contrib/gitian-descriptors/gitian-win32.yml
Normal file
@@ -0,0 +1,92 @@
|
||||
---
|
||||
name: "bitcoin"
|
||||
suites:
|
||||
- "lucid"
|
||||
architectures:
|
||||
- "i386"
|
||||
packages:
|
||||
- "mingw32"
|
||||
- "git-core"
|
||||
- "unzip"
|
||||
- "nsis"
|
||||
- "faketime"
|
||||
- "wine"
|
||||
reference_datetime: "2011-01-30 00:00:00"
|
||||
remotes:
|
||||
- "url": "https://github.com/bitcoin/bitcoin.git"
|
||||
"dir": "bitcoin"
|
||||
files:
|
||||
- "wxwidgets-win32-2.9.2-gitian.zip"
|
||||
- "boost-win32-1.47.0-gitian.zip"
|
||||
- "openssl-1.0.0d.tar.gz"
|
||||
- "db-4.8.30.NC.tar.gz"
|
||||
- "miniupnpc-1.6.tar.gz"
|
||||
script: |
|
||||
#
|
||||
mkdir wxWidgets-2.9.2
|
||||
cd wxWidgets-2.9.2
|
||||
mkdir lib
|
||||
unzip ../wxwidgets-win32-2.9.2-gitian.zip
|
||||
cd bin/$GBUILD_BITS
|
||||
for lib in wx_mswu; do
|
||||
i586-mingw32msvc-ar rc ../../lib/lib${lib}-2.9-i586-mingw32msvc.a $lib/*.o
|
||||
i586-mingw32msvc-ranlib ../../lib/lib${lib}-2.9-i586-mingw32msvc.a
|
||||
done
|
||||
cp -a wx ../../lib
|
||||
cd ../..
|
||||
mv include/wx-2.9/wx include
|
||||
cd ..
|
||||
#
|
||||
mkdir boost_1_47_0
|
||||
cd boost_1_47_0
|
||||
mkdir -p stage/lib
|
||||
unzip ../boost-win32-1.47.0-gitian.zip
|
||||
cd bin/$GBUILD_BITS
|
||||
for lib in *; do
|
||||
i586-mingw32msvc-ar rc ../../stage/lib/libboost_${lib}-mt-s.a $lib/*.o
|
||||
i586-mingw32msvc-ranlib ../../stage/lib/libboost_${lib}-mt-s.a
|
||||
done
|
||||
cd ../..
|
||||
mv include/boost .
|
||||
cd ..
|
||||
#
|
||||
tar xzf openssl-1.0.0d.tar.gz
|
||||
cd openssl-1.0.0d
|
||||
./Configure --cross-compile-prefix=i586-mingw32msvc- mingw
|
||||
make
|
||||
cd ..
|
||||
#
|
||||
tar xzf db-4.8.30.NC.tar.gz
|
||||
cd db-4.8.30.NC/build_unix
|
||||
../dist/configure --enable-mingw --enable-cxx --host=i586-mingw32msvc CFLAGS="-I/usr/i586-mingw32msvc/include"
|
||||
make $MAKEOPTS
|
||||
cd ../..
|
||||
#
|
||||
tar xzf miniupnpc-1.6.tar.gz
|
||||
cd miniupnpc-1.6
|
||||
sed 's/dllwrap -k --driver-name gcc/$(DLLWRAP) -k --driver-name $(CC)/' -i Makefile.mingw
|
||||
sed 's|wingenminiupnpcstrings $< $@|./wingenminiupnpcstrings $< $@|' -i Makefile.mingw
|
||||
make -f Makefile.mingw DLLWRAP=i586-mingw32msvc-dllwrap CC=i586-mingw32msvc-gcc AR=i586-mingw32msvc-ar
|
||||
cd ..
|
||||
mv miniupnpc-1.6 miniupnpc
|
||||
#
|
||||
cd bitcoin
|
||||
mkdir -p $OUTDIR/src
|
||||
cp -a . $OUTDIR/src
|
||||
rm -rf $OUTDIR/src/.git
|
||||
cp -a $OUTDIR/src/locale $OUTDIR
|
||||
cp $OUTDIR/src/doc/README_windows.txt $OUTDIR/readme.txt
|
||||
cp $OUTDIR/src/COPYING $OUTDIR/license.txt
|
||||
cd src
|
||||
sed 's/$(DEBUGFLAGS)/-frandom-seed=bitcoin/' -i makefile.linux-mingw
|
||||
export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
|
||||
export FAKETIME=$REFERENCE_DATETIME
|
||||
export TZ=UTC
|
||||
make -f makefile.linux-mingw $MAKEOPTS DEPSDIR=$HOME/build bitcoin.exe USE_UPNP=1
|
||||
make -f makefile.linux-mingw $MAKEOPTS DEPSDIR=$HOME/build bitcoind.exe USE_UPNP=0
|
||||
i586-mingw32msvc-strip bitcoin.exe
|
||||
i586-mingw32msvc-strip bitcoind.exe
|
||||
makensis ../share/setup.nsi
|
||||
cp bitcoin.exe ../share/bitcoin-*-win32-setup.exe $OUTDIR/
|
||||
mkdir $OUTDIR/daemon
|
||||
cp bitcoind.exe $OUTDIR/daemon
|
||||
59
contrib/gitian-descriptors/gitian.yml
Normal file
@@ -0,0 +1,59 @@
|
||||
---
|
||||
name: "bitcoin"
|
||||
suites:
|
||||
- "lucid"
|
||||
architectures:
|
||||
- "i386"
|
||||
- "amd64"
|
||||
packages:
|
||||
- "libdb4.8++-dev"
|
||||
- "libxxf86vm-dev"
|
||||
- "libgtk2.0-dev"
|
||||
- "libboost-all-dev"
|
||||
- "libssl-dev"
|
||||
- "git-core"
|
||||
- "unzip"
|
||||
reference_datetime: "2011-01-30 00:00:00"
|
||||
remotes:
|
||||
- "url": "https://github.com/bitcoin/bitcoin.git"
|
||||
"dir": "bitcoin"
|
||||
files:
|
||||
- "wxWidgets-2.9.2-x64-gitian.zip"
|
||||
- "wxWidgets-2.9.2-x32-gitian.zip"
|
||||
- "miniupnpc-1.6.tar.gz"
|
||||
script: |
|
||||
INSTDIR="$HOME/install"
|
||||
export LIBRARY_PATH="$INSTDIR/lib"
|
||||
#
|
||||
tar xzf miniupnpc-1.6.tar.gz
|
||||
cd miniupnpc-1.6
|
||||
INSTALLPREFIX=$INSTDIR make $MAKEOPTS install
|
||||
cd ..
|
||||
#
|
||||
mkdir -p $INSTDIR/bin $INSTDIR/lib/wx $INSTDIR/include
|
||||
mkdir wxWidgets-2.9.2
|
||||
cd wxWidgets-2.9.2
|
||||
unzip ../wxWidgets-2.9.2-x32-gitian.zip
|
||||
unzip -o ../wxWidgets-2.9.2-x64-gitian.zip
|
||||
cp -a bin/$GBUILD_BITS/wx/config/gtk2-unicode-static-2.9 $INSTDIR/bin/wx-config
|
||||
for lib in wx_gtk2u wxregexu wxtiff; do
|
||||
ar rc $INSTDIR/lib/lib${lib}-2.9.a bin/$GBUILD_BITS/$lib/*.o
|
||||
ranlib $INSTDIR/lib/lib${lib}-2.9.a
|
||||
done
|
||||
cp -a include/wx-2.9/* $INSTDIR/include
|
||||
cp -a bin/$GBUILD_BITS/wx/include $INSTDIR/lib/wx
|
||||
cd ..
|
||||
#
|
||||
cd bitcoin
|
||||
mkdir -p $OUTDIR/src
|
||||
cp -a . $OUTDIR/src
|
||||
rm -rf $OUTDIR/src/.git
|
||||
mv $OUTDIR/src/locale $OUTDIR
|
||||
cp $OUTDIR/src/doc/README $OUTDIR
|
||||
cp $OUTDIR/src/COPYING $OUTDIR
|
||||
cd src
|
||||
sed 's/$(DEBUGFLAGS)//' -i makefile.unix
|
||||
PATH=$INSTDIR/bin:$PATH make -f makefile.unix STATIC=1 CXX="g++ -I$INSTDIR/include -L$INSTDIR/lib" $MAKEOPTS bitcoin USE_UPNP=1
|
||||
PATH=$INSTDIR/bin:$PATH make -f makefile.unix STATIC=1 CXX="g++ -I$INSTDIR/include -L$INSTDIR/lib" $MAKEOPTS bitcoind USE_UPNP=0
|
||||
mkdir -p $OUTDIR/bin/$GBUILD_BITS
|
||||
install -s bitcoin bitcoind $OUTDIR/bin/$GBUILD_BITS
|
||||
40
contrib/gitian-descriptors/wxwidgets-win32.yml
Normal file
@@ -0,0 +1,40 @@
|
||||
---
|
||||
name: "wxwidgets"
|
||||
suites:
|
||||
- "lucid"
|
||||
architectures:
|
||||
- "i386"
|
||||
packages:
|
||||
- "mingw32"
|
||||
- "faketime"
|
||||
- "zip"
|
||||
reference_datetime: "2011-01-30 00:00:00"
|
||||
remotes: []
|
||||
files:
|
||||
- "wxWidgets-2.9.2.tar.bz2"
|
||||
script: |
|
||||
INSTDIR="$HOME/install"
|
||||
TMPDIR="$HOME/tmpdir"
|
||||
export LIBRARY_PATH="$INSTDIR/lib"
|
||||
#
|
||||
tar xjf wxWidgets-2.9.2.tar.bz2
|
||||
cd wxWidgets-2.9.2
|
||||
CXXFLAGS=-frandom-seed=wx1 ./configure --host=i586-mingw32msvc --build=i686-linux --prefix=$INSTDIR --disable-shared --enable-monolithic --without-libpng --disable-svg
|
||||
perl -i -p -e "s/__TIME__/\"$REFERENCE_TIME\"/;s/__DATE__/\"$REFERENCE_DATE\"/" include/wx/chartype.h
|
||||
make $MAKEOPTS install
|
||||
mkdir $TMPDIR
|
||||
cd $TMPDIR
|
||||
cp -af $INSTDIR/include .
|
||||
mkdir -p $TMPDIR/bin/$GBUILD_BITS
|
||||
cd $TMPDIR/bin/$GBUILD_BITS
|
||||
cp -af $INSTDIR/lib/wx .
|
||||
for lib in wx_mswu; do
|
||||
mkdir $lib
|
||||
(cd $lib ; ar xf $INSTDIR/lib/lib${lib}-2.9-i586-mingw32msvc.a)
|
||||
done
|
||||
chmod -R +w $TMPDIR
|
||||
cd $TMPDIR
|
||||
export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
|
||||
export FAKETIME=$REFERENCE_DATETIME
|
||||
zip -r wxwidgets-win32-2.9.2-gitian.zip *
|
||||
cp wxwidgets-win32-2.9.2-gitian.zip $OUTDIR
|
||||
42
contrib/gitian-descriptors/wxwidgets.yml
Normal file
@@ -0,0 +1,42 @@
|
||||
---
|
||||
name: "wxwidgets"
|
||||
suites:
|
||||
- "lucid"
|
||||
architectures:
|
||||
- "i386"
|
||||
- "amd64"
|
||||
packages:
|
||||
- "libxxf86vm-dev"
|
||||
- "libgtk2.0-dev"
|
||||
- "faketime"
|
||||
- "zip"
|
||||
reference_datetime: "2011-01-30 00:00:00"
|
||||
remotes: []
|
||||
files:
|
||||
- "wxWidgets-2.9.2.tar.bz2"
|
||||
script: |
|
||||
INSTDIR="$HOME/install"
|
||||
TMPDIR="$HOME/tmpdir"
|
||||
export LIBRARY_PATH="$INSTDIR/lib"
|
||||
#
|
||||
tar xjf wxWidgets-2.9.2.tar.bz2
|
||||
cd wxWidgets-2.9.2
|
||||
./configure --prefix=$INSTDIR --enable-monolithic --disable-shared
|
||||
perl -i -p -e "s/__TIME__/\"$REFERENCE_TIME\"/;s/__DATE__/\"$REFERENCE_DATE\"/" include/wx/chartype.h
|
||||
make $MAKEOPTS install
|
||||
mkdir $TMPDIR
|
||||
cd $TMPDIR
|
||||
cp -af $INSTDIR/include .
|
||||
mkdir -p $TMPDIR/bin/$GBUILD_BITS
|
||||
cd $TMPDIR/bin/$GBUILD_BITS
|
||||
cp -af $INSTDIR/lib/wx .
|
||||
for lib in wxtiff wxregexu wx_gtk2u; do
|
||||
mkdir $lib
|
||||
(cd $lib ; ar xf $INSTDIR/lib/lib${lib}-2.9.a)
|
||||
done
|
||||
chmod -R +w $TMPDIR
|
||||
cd $TMPDIR
|
||||
export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
|
||||
export FAKETIME=$REFERENCE_DATETIME
|
||||
zip -r wxWidgets-2.9.2-x$GBUILD_BITS-gitian.zip *
|
||||
cp wxWidgets-2.9.2-x$GBUILD_BITS-gitian.zip $OUTDIR
|
||||
BIN
contrib/gitian-downloader/bluematt-key.pgp
Normal file
BIN
contrib/gitian-downloader/devrandom-key.pgp
Normal file
BIN
contrib/gitian-downloader/gavinandresen-key.pgp
Normal file
30
contrib/gitian-downloader/linux-download-config
Normal file
@@ -0,0 +1,30 @@
|
||||
---
|
||||
name: bitcoin
|
||||
urls:
|
||||
- http://bitcoin.org/bitcoin-latest-linux-gitian.zip
|
||||
rss:
|
||||
- url: http://sourceforge.net/api/file/index/project-id/244765/mtime/desc/limit/100/rss
|
||||
xpath: //item/link/text()
|
||||
pattern: bitcoin-\d+.\d+.\d+-linux-gitian.zip
|
||||
signers:
|
||||
0A82509767C7D4A5D14DA2301AE1D35043E08E54:
|
||||
weight: 40
|
||||
name: BlueMatt
|
||||
key: bluematt
|
||||
BF6273FAEF7CC0BA1F562E50989F6B3048A116B5:
|
||||
weight: 40
|
||||
name: Devrandom
|
||||
key: devrandom
|
||||
D762373D24904A3E42F33B08B9A408E71DAAC974:
|
||||
weight: 40
|
||||
name: Sipa
|
||||
key: sipa
|
||||
77E72E69DA7EE0A148C06B21B34821D4944DE5F7:
|
||||
weight: 40
|
||||
name: tcatm
|
||||
key: tcatm
|
||||
01CDF4627A3B88AAE4A571C87588242FBE38D3A8:
|
||||
weight: 40
|
||||
name: "Gavin Andresen"
|
||||
key: gavinandresen
|
||||
minimum_weight: 120
|
||||
BIN
contrib/gitian-downloader/sipa-key.pgp
Normal file
BIN
contrib/gitian-downloader/tcatm-key.pgp
Normal file
30
contrib/gitian-downloader/win32-download-config
Normal file
@@ -0,0 +1,30 @@
|
||||
---
|
||||
name: bitcoin
|
||||
urls:
|
||||
- http://bitcoin.org/bitcoin-latest-win32-gitian.zip
|
||||
rss:
|
||||
- url: http://sourceforge.net/api/file/index/project-id/244765/mtime/desc/limit/100/rss
|
||||
xpath: //item/link/text()
|
||||
pattern: bitcoin-\d+.\d+.\d+-win32-gitian.zip
|
||||
signers:
|
||||
0A82509767C7D4A5D14DA2301AE1D35043E08E54:
|
||||
weight: 40
|
||||
name: BlueMatt
|
||||
key: bluematt
|
||||
BF6273FAEF7CC0BA1F562E50989F6B3048A116B5:
|
||||
weight: 40
|
||||
name: Devrandom
|
||||
key: devrandom
|
||||
D762373D24904A3E42F33B08B9A408E71DAAC974:
|
||||
weight: 40
|
||||
name: Sipa
|
||||
key: sipa
|
||||
77E72E69DA7EE0A148C06B21B34821D4944DE5F7:
|
||||
weight: 40
|
||||
name: tcatm
|
||||
key: tcatm
|
||||
01CDF4627A3B88AAE4A571C87588242FBE38D3A8:
|
||||
weight: 40
|
||||
name: "Gavin Andresen"
|
||||
key: gavinandresen
|
||||
minimum_weight: 120
|
||||
43
contrib/miniupnpc/Portfile
Normal file
@@ -0,0 +1,43 @@
|
||||
# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:filetype=tcl:et:sw=4:ts=4:sts=4
|
||||
# $Id$
|
||||
|
||||
PortSystem 1.0
|
||||
|
||||
name miniupnpc
|
||||
epoch 2
|
||||
version 1.6
|
||||
revision 2
|
||||
categories net
|
||||
platforms darwin
|
||||
license BSD
|
||||
maintainers singingwolfboy openmaintainer
|
||||
description Lightweight client for UPnP protocol
|
||||
long_description \
|
||||
${description}
|
||||
|
||||
homepage http://miniupnp.free.fr/
|
||||
master_sites http://miniupnp.free.fr/files/download.php?file=${distname}${extract.suffix}&dummy=
|
||||
checksums md5 88055f2d4a061cfd4cfe25a9eae22f67 \
|
||||
sha1 ef8f2edb17f2e7c5b8dc67ee80a65c199d823e0a \
|
||||
rmd160 d86b75b331a3fb5525c71708548f311977c0598f
|
||||
|
||||
use_configure no
|
||||
|
||||
variant universal {}
|
||||
if {[variant_isset universal]} {
|
||||
set archflags ${configure.universal_cflags}
|
||||
} else {
|
||||
set archflags ${configure.cc_archflags}
|
||||
}
|
||||
|
||||
build.args-append CC="${configure.cc} ${archflags}"
|
||||
|
||||
post-patch {
|
||||
reinplace "s|-Wl,-install_name,|-Wl,-install_name,${prefix}/lib/|" ${worksrcpath}/Makefile
|
||||
}
|
||||
|
||||
destroot.destdir PREFIX=${prefix} INSTALLPREFIX=${destroot}${prefix}
|
||||
|
||||
livecheck.type regex
|
||||
livecheck.url http://miniupnp.free.fr/files/
|
||||
livecheck.regex ${name}-(\\d+(\\.\\d{1,4})+)${extract.suffix}
|
||||
6
contrib/pyminer/README
Normal file
@@ -0,0 +1,6 @@
|
||||
|
||||
This is a 'getwork' CPU mining client for bitcoin.
|
||||
|
||||
It is pure-python, and therefore very, very slow. The purpose is to
|
||||
provide a reference implementation of a miner, for study.
|
||||
|
||||
32
contrib/pyminer/example-config.cfg
Normal file
@@ -0,0 +1,32 @@
|
||||
|
||||
#
|
||||
# RPC login details
|
||||
#
|
||||
host=127.0.0.1
|
||||
port=8332
|
||||
|
||||
rpcuser=myusername
|
||||
rpcpass=mypass
|
||||
|
||||
|
||||
#
|
||||
# mining details
|
||||
#
|
||||
|
||||
threads=4
|
||||
|
||||
# periodic rate for requesting new work, if solution not found
|
||||
scantime=60
|
||||
|
||||
|
||||
#
|
||||
# misc.
|
||||
#
|
||||
|
||||
# not really used right now
|
||||
logdir=/tmp/pyminer
|
||||
|
||||
# set to 1, to enable hashmeter output
|
||||
hashmeter=0
|
||||
|
||||
|
||||
252
contrib/pyminer/pyminer.py
Executable file
@@ -0,0 +1,252 @@
|
||||
#!/usr/bin/python
|
||||
#
|
||||
# Copyright (c) 2011 The Bitcoin developers
|
||||
# Distributed under the MIT/X11 software license, see the accompanying
|
||||
# file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
#
|
||||
|
||||
import time
|
||||
import json
|
||||
import pprint
|
||||
import hashlib
|
||||
import struct
|
||||
import re
|
||||
import base64
|
||||
import httplib
|
||||
import sys
|
||||
from multiprocessing import Process
|
||||
|
||||
ERR_SLEEP = 15
|
||||
MAX_NONCE = 1000000L
|
||||
|
||||
settings = {}
|
||||
pp = pprint.PrettyPrinter(indent=4)
|
||||
|
||||
class BitcoinRPC:
|
||||
OBJID = 1
|
||||
|
||||
def __init__(self, host, port, username, password):
|
||||
authpair = "%s:%s" % (username, password)
|
||||
self.authhdr = "Basic %s" % (base64.b64encode(authpair))
|
||||
self.conn = httplib.HTTPConnection(host, port, False, 30)
|
||||
def rpc(self, method, params=None):
|
||||
self.OBJID += 1
|
||||
obj = { 'version' : '1.1',
|
||||
'method' : method,
|
||||
'id' : self.OBJID }
|
||||
if params is None:
|
||||
obj['params'] = []
|
||||
else:
|
||||
obj['params'] = params
|
||||
self.conn.request('POST', '/', json.dumps(obj),
|
||||
{ 'Authorization' : self.authhdr,
|
||||
'Content-type' : 'application/json' })
|
||||
|
||||
resp = self.conn.getresponse()
|
||||
if resp is None:
|
||||
print "JSON-RPC: no response"
|
||||
return None
|
||||
|
||||
body = resp.read()
|
||||
resp_obj = json.loads(body)
|
||||
if resp_obj is None:
|
||||
print "JSON-RPC: cannot JSON-decode body"
|
||||
return None
|
||||
if 'error' in resp_obj and resp_obj['error'] != None:
|
||||
return resp_obj['error']
|
||||
if 'result' not in resp_obj:
|
||||
print "JSON-RPC: no result in object"
|
||||
return None
|
||||
|
||||
return resp_obj['result']
|
||||
def getblockcount(self):
|
||||
return self.rpc('getblockcount')
|
||||
def getwork(self, data=None):
|
||||
return self.rpc('getwork', data)
|
||||
|
||||
def uint32(x):
|
||||
return x & 0xffffffffL
|
||||
|
||||
def bytereverse(x):
|
||||
return uint32(( ((x) << 24) | (((x) << 8) & 0x00ff0000) |
|
||||
(((x) >> 8) & 0x0000ff00) | ((x) >> 24) ))
|
||||
|
||||
def bufreverse(in_buf):
|
||||
out_words = []
|
||||
for i in range(0, len(in_buf), 4):
|
||||
word = struct.unpack('@I', in_buf[i:i+4])[0]
|
||||
out_words.append(struct.pack('@I', bytereverse(word)))
|
||||
return ''.join(out_words)
|
||||
|
||||
def wordreverse(in_buf):
|
||||
out_words = []
|
||||
for i in range(0, len(in_buf), 4):
|
||||
out_words.append(in_buf[i:i+4])
|
||||
out_words.reverse()
|
||||
return ''.join(out_words)
|
||||
|
||||
class Miner:
|
||||
def __init__(self, id):
|
||||
self.id = id
|
||||
self.max_nonce = MAX_NONCE
|
||||
|
||||
def work(self, datastr, targetstr):
|
||||
# decode work data hex string to binary
|
||||
static_data = datastr.decode('hex')
|
||||
static_data = bufreverse(static_data)
|
||||
|
||||
# the first 76b of 80b do not change
|
||||
blk_hdr = static_data[:76]
|
||||
|
||||
# decode 256-bit target value
|
||||
targetbin = targetstr.decode('hex')
|
||||
targetbin = targetbin[::-1] # byte-swap and dword-swap
|
||||
targetbin_str = targetbin.encode('hex')
|
||||
target = long(targetbin_str, 16)
|
||||
|
||||
# pre-hash first 76b of block header
|
||||
static_hash = hashlib.sha256()
|
||||
static_hash.update(blk_hdr)
|
||||
|
||||
for nonce in xrange(self.max_nonce):
|
||||
|
||||
# encode 32-bit nonce value
|
||||
nonce_bin = struct.pack("<I", nonce)
|
||||
|
||||
# hash final 4b, the nonce value
|
||||
hash1_o = static_hash.copy()
|
||||
hash1_o.update(nonce_bin)
|
||||
hash1 = hash1_o.digest()
|
||||
|
||||
# sha256 hash of sha256 hash
|
||||
hash_o = hashlib.sha256()
|
||||
hash_o.update(hash1)
|
||||
hash = hash_o.digest()
|
||||
|
||||
# quick test for winning solution: high 32 bits zero?
|
||||
if hash[-4:] != '\0\0\0\0':
|
||||
continue
|
||||
|
||||
# convert binary hash to 256-bit Python long
|
||||
hash = bufreverse(hash)
|
||||
hash = wordreverse(hash)
|
||||
|
||||
hash_str = hash.encode('hex')
|
||||
l = long(hash_str, 16)
|
||||
|
||||
# proof-of-work test: hash < target
|
||||
if l < target:
|
||||
print time.asctime(), "PROOF-OF-WORK found: %064x" % (l,)
|
||||
return (nonce + 1, nonce_bin)
|
||||
else:
|
||||
print time.asctime(), "PROOF-OF-WORK false positive %064x" % (l,)
|
||||
# return (nonce + 1, nonce_bin)
|
||||
|
||||
return (nonce + 1, None)
|
||||
|
||||
def submit_work(self, rpc, original_data, nonce_bin):
|
||||
nonce_bin = bufreverse(nonce_bin)
|
||||
nonce = nonce_bin.encode('hex')
|
||||
solution = original_data[:152] + nonce + original_data[160:256]
|
||||
param_arr = [ solution ]
|
||||
result = rpc.getwork(param_arr)
|
||||
print time.asctime(), "--> Upstream RPC result:", result
|
||||
|
||||
def iterate(self, rpc):
|
||||
work = rpc.getwork()
|
||||
if work is None:
|
||||
time.sleep(ERR_SLEEP)
|
||||
return
|
||||
if 'data' not in work or 'target' not in work:
|
||||
time.sleep(ERR_SLEEP)
|
||||
return
|
||||
|
||||
time_start = time.time()
|
||||
|
||||
(hashes_done, nonce_bin) = self.work(work['data'],
|
||||
work['target'])
|
||||
|
||||
time_end = time.time()
|
||||
time_diff = time_end - time_start
|
||||
|
||||
self.max_nonce = long(
|
||||
(hashes_done * settings['scantime']) / time_diff)
|
||||
if self.max_nonce > 0xfffffffaL:
|
||||
self.max_nonce = 0xfffffffaL
|
||||
|
||||
if settings['hashmeter']:
|
||||
print "HashMeter(%d): %d hashes, %.2f Khash/sec" % (
|
||||
self.id, hashes_done,
|
||||
(hashes_done / 1000.0) / time_diff)
|
||||
|
||||
if nonce_bin is not None:
|
||||
self.submit_work(rpc, work['data'], nonce_bin)
|
||||
|
||||
def loop(self):
|
||||
rpc = BitcoinRPC(settings['host'], settings['port'],
|
||||
settings['rpcuser'], settings['rpcpass'])
|
||||
if rpc is None:
|
||||
return
|
||||
|
||||
while True:
|
||||
self.iterate(rpc)
|
||||
|
||||
def miner_thread(id):
|
||||
miner = Miner(id)
|
||||
miner.loop()
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) != 2:
|
||||
print "Usage: pyminer.py CONFIG-FILE"
|
||||
sys.exit(1)
|
||||
|
||||
f = open(sys.argv[1])
|
||||
for line in f:
|
||||
# skip comment lines
|
||||
m = re.search('^\s*#', line)
|
||||
if m:
|
||||
continue
|
||||
|
||||
# parse key=value lines
|
||||
m = re.search('^(\w+)\s*=\s*(\S.*)$', line)
|
||||
if m is None:
|
||||
continue
|
||||
settings[m.group(1)] = m.group(2)
|
||||
f.close()
|
||||
|
||||
if 'host' not in settings:
|
||||
settings['host'] = '127.0.0.1'
|
||||
if 'port' not in settings:
|
||||
settings['port'] = 8332
|
||||
if 'threads' not in settings:
|
||||
settings['threads'] = 1
|
||||
if 'hashmeter' not in settings:
|
||||
settings['hashmeter'] = 0
|
||||
if 'scantime' not in settings:
|
||||
settings['scantime'] = 30L
|
||||
if 'rpcuser' not in settings or 'rpcpass' not in settings:
|
||||
print "Missing username and/or password in cfg file"
|
||||
sys.exit(1)
|
||||
|
||||
settings['port'] = int(settings['port'])
|
||||
settings['threads'] = int(settings['threads'])
|
||||
settings['hashmeter'] = int(settings['hashmeter'])
|
||||
settings['scantime'] = long(settings['scantime'])
|
||||
|
||||
thr_list = []
|
||||
for thr_id in range(settings['threads']):
|
||||
p = Process(target=miner_thread, args=(thr_id,))
|
||||
p.start()
|
||||
thr_list.append(p)
|
||||
time.sleep(1) # stagger threads
|
||||
|
||||
print settings['threads'], "mining threads started"
|
||||
|
||||
print time.asctime(), "Miner Starts - %s:%s" % (settings['host'], settings['port'])
|
||||
try:
|
||||
for thr_proc in thr_list:
|
||||
thr_proc.join()
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
print time.asctime(), "Miner Stops - %s:%s" % (settings['host'], settings['port'])
|
||||
|
||||
5
contrib/wallettools/walletchangepass.py
Normal file
@@ -0,0 +1,5 @@
|
||||
from jsonrpc import ServiceProxy
|
||||
access = ServiceProxy("http://127.0.0.1:8332")
|
||||
pwd = raw_input("Enter old wallet passphrase: ")
|
||||
pwd2 = raw_input("Enter new wallet passphrase: ")
|
||||
access.walletpassphrasechange(pwd, pwd2)
|
||||
4
contrib/wallettools/walletunlock.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from jsonrpc import ServiceProxy
|
||||
access = ServiceProxy("http://127.0.0.1:8332")
|
||||
pwd = raw_input("Enter wallet passphrase: ")
|
||||
access.walletpassphrase(pwd, 60)
|
||||
117
doc/README
Normal file
@@ -0,0 +1,117 @@
|
||||
Bitcoin 0.4.1 BETA
|
||||
|
||||
Copyright (c) 2009-2011 Bitcoin Developers
|
||||
Distributed under the MIT/X11 software license, see the accompanying
|
||||
file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
This product includes software developed by the OpenSSL Project for use in
|
||||
the OpenSSL Toolkit (http://www.openssl.org/). This product includes
|
||||
cryptographic software written by Eric Young (eay@cryptsoft.com).
|
||||
|
||||
|
||||
Intro
|
||||
-----
|
||||
Bitcoin is a free open source peer-to-peer electronic cash system that is
|
||||
completely decentralized, without the need for a central server or trusted
|
||||
parties. Users hold the crypto keys to their own money and transact directly
|
||||
with each other, with the help of a P2P network to check for double-spending.
|
||||
|
||||
|
||||
Setup
|
||||
-----
|
||||
Unpack the files into a directory and run:
|
||||
bin/32/bitcoin (GUI, 32-bit)
|
||||
bin/32/bitcoind (headless, 32-bit)
|
||||
bin/64/bitcoin (GUI, 64-bit)
|
||||
bin/64/bitcoind (headless, 64-bit)
|
||||
|
||||
|
||||
Wallet Encryption
|
||||
-----------------
|
||||
Bitcoin supports native wallet encryption so that people who steal your
|
||||
wallet file don't automatically get access to all of your Bitcoins.
|
||||
In order to enable this feature, chose "Encrypt Wallet" from the
|
||||
Options menu. You will be prompted to enter a passphrase, which
|
||||
will be used as the key to encrypt your wallet and will be needed
|
||||
every time you wish to send Bitcoins. If you lose this passphrase,
|
||||
you will lose access to spend all of the bitcoins in your wallet,
|
||||
no one, not even the Bitcoin developers can recover your Bitcoins.
|
||||
This means you are responsible for your own security, store your
|
||||
passphrase in a secure location and do not forget it.
|
||||
|
||||
Remember that the encryption built into bitcoin only encrypts the
|
||||
actual keys which are required to send your bitcoins, not the full
|
||||
wallet. This means that someone who steals your wallet file will
|
||||
be able to see all the addresses which belong to you, as well as the
|
||||
relevant transactions, you are only protected from someone spending
|
||||
your coins.
|
||||
|
||||
It is recommended that you backup your wallet file before you
|
||||
encrypt your wallet. To do this, close the Bitcoin client and
|
||||
copy the wallet.dat file from ~/.bitcoin/ on Linux, /Users/(user
|
||||
name)/Application Support/Bitcoin/ on Mac OSX, and %APPDATA%/Bitcoin/
|
||||
on Windows (that is /Users/(user name)/AppData/Roaming/Bitcoin on
|
||||
Windows Vista and 7 and /Documents and Settings/(user name)/Application
|
||||
Data/Bitcoin on Windows XP). Once you have copied that file to a
|
||||
safe location, reopen the Bitcoin client and Encrypt your wallet.
|
||||
If everything goes fine, delete the backup and enjoy your encrypted
|
||||
wallet. Note that once you encrypt your wallet, you will never be
|
||||
able to go back to a version of the Bitcoin client older than 0.4.
|
||||
|
||||
Keep in mind that you are always responsible for your own security.
|
||||
All it takes is a slightly more advanced wallet-stealing trojan which
|
||||
installs a keylogger to steal your wallet passphrase as you enter it
|
||||
in addition to your wallet file and you have lost all your Bitcoins.
|
||||
Wallet encryption cannot keep you safe if you do not practice
|
||||
good security, such as running up-to-date antivirus software, only
|
||||
entering your wallet passphrase in the Bitcoin client and using the
|
||||
same passphrase only as your wallet passphrase.
|
||||
|
||||
|
||||
Technical details of wallet encryption
|
||||
--------------------------------------
|
||||
Wallet encryption uses AES-256-CBC to encrypt only the private keys
|
||||
that are held in a wallet. The keys are encrypted with a master key
|
||||
which is entirely random. This master key is then encrypted with
|
||||
AES-256-CBC with a key derived from the passphrase using SHA512 and
|
||||
OpenSSL's EVP_BytesToKey and a dynamic number of rounds determined by
|
||||
the speed of the machine which does the initial encryption (and is
|
||||
updated based on the speed of a computer which does a subsequent
|
||||
passphrase change). Although the underlying code supports multiple
|
||||
encrypted copies of the same master key (and thus multiple passphrases)
|
||||
the client does not yet have a method to add additional passphrases.
|
||||
|
||||
At runtime, the client loads the wallet as it normally would, however
|
||||
the keystore stores the keys in encrypted form. When the passphrase
|
||||
is required (to top up keypool or send coins) it will either be queried
|
||||
by a GUI prompt, or must first be entered with the walletpassphrase
|
||||
RPC command. This will change the wallet to "unlocked" state where the
|
||||
unencrypted master key is stored in memory (in the case of GUI, only for
|
||||
long enough to complete the requested operation, in RPC, for as long as
|
||||
is specified by the second parameter to walletpassphrase). The wallet is
|
||||
then locked (or can be manually locked using the walletlock RPC command)
|
||||
and the unencrypted master key is removed from memory.
|
||||
|
||||
Implementation details of wallet encryption
|
||||
-------------------------------------------
|
||||
When the wallet is locked, calls to sendtoaddress, sendfrom, sendmany,
|
||||
and keypoolrefill will return Error -13: "Error: Please enter the wallet
|
||||
passphrase with walletpassphrase first."
|
||||
|
||||
When the wallet is unlocked, calls to walletpassphrase will fail.
|
||||
|
||||
When a wallet is encrypted, the passphrase is required to top up the
|
||||
keypool, thus, if the passphrase is rarely entered, it is possible that
|
||||
keypool might run out. In this case, the default key will be used as the
|
||||
target for payouts for mining, and calls to getnewaddress and getaccount
|
||||
address will return an error. In order to prevent such cases, the keypool
|
||||
is automatically refilled when walletpassphrase is called with a correct
|
||||
passphrase and when topupkeypool is called (while the wallet is unlocked).
|
||||
Note that the keypool continues to be topped up on various occasions when
|
||||
a new key from pool is used and the wallet is unlocked (or unencrypted).
|
||||
|
||||
|
||||
|
||||
See the documentation at the bitcoin wiki:
|
||||
https://en.bitcoin.it/wiki/Main_Page
|
||||
|
||||
... for help and more information.
|
||||
34
doc/README_windows.txt
Normal file
@@ -0,0 +1,34 @@
|
||||
Bitcoin 0.4.1 BETA
|
||||
|
||||
Copyright (c) 2009-2011 Bitcoin Developers
|
||||
Distributed under the MIT/X11 software license, see the accompanying
|
||||
file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
This product includes software developed by the OpenSSL Project for use in
|
||||
the OpenSSL Toolkit (http://www.openssl.org/). This product includes
|
||||
cryptographic software written by Eric Young (eay@cryptsoft.com).
|
||||
|
||||
|
||||
Intro
|
||||
-----
|
||||
Bitcoin is a free open source peer-to-peer electronic cash system that is
|
||||
completely decentralized, without the need for a central server or trusted
|
||||
parties. Users hold the crypto keys to their own money and transact directly
|
||||
with each other, with the help of a P2P network to check for double-spending.
|
||||
|
||||
|
||||
Setup
|
||||
-----
|
||||
Unpack the files into a directory and run bitcoin.exe.
|
||||
|
||||
If you have Microsoft Security Essentials, you need to add bitcoin.exe to its
|
||||
"Excluded processes" list. Microsoft Security Essentials->Settings tab,
|
||||
select Excluded processes, press Add, select bitcoin.exe, OK, Save changes.
|
||||
|
||||
The software automatically finds other nodes to connect to. You can
|
||||
enable Universal Plug and Play using a menu entry or set your firewall
|
||||
to forward port 8333 (TCP) to your computer so you can receive
|
||||
incoming connections. Bitcoin work without incoming connections,
|
||||
but allowing incoming connections helps the Bitcoin network.
|
||||
|
||||
See the bitcoin wiki at: https://en.bitcoin.it/wiki/Main_Page
|
||||
for more help and information.
|
||||
73
doc/assets-attribution.txt
Normal file
@@ -0,0 +1,73 @@
|
||||
Icon: src/qt/res/icons/clock*.png, src/qt/res/icons/tx*.png,
|
||||
src/qt/res/src/*.svg
|
||||
Designer: Wladimir van der Laan
|
||||
License: Creative Commons Attribution
|
||||
|
||||
Icon: src/qt/res/icons/send.png
|
||||
Icon Pack: Vista Style Arrow
|
||||
Designer: Icons Land
|
||||
License: Freeware Non-commercial
|
||||
Site: http://findicons.com/icon/231371/right3green
|
||||
|
||||
Icon: src/qt/res/icons/address-book.png
|
||||
Icon Pack: Farm-Fresh Web
|
||||
Designer: FatCow Web Hosting
|
||||
License: Creative Commons Attribution (by)
|
||||
Site: http://findicons.com/icon/163938/book_open
|
||||
|
||||
Icon: src/qt/res/icons/connect*.png, src/qt/res/icons/synced.png, src/qt/res/icons/lock_*.png
|
||||
Icon Pack: Human-O2
|
||||
Designer: schollidesign
|
||||
License: GNU/GPL
|
||||
Site: http://findicons.com/icon/93743/blocks_gnome_netstatus_0
|
||||
|
||||
Icon: src/qt/res/icons/transaction*.png
|
||||
Designer: md2k7
|
||||
Site: https://forum.bitcoin.org/index.php?topic=15276.0
|
||||
License: You are free to do with these icons as you wish, including selling,
|
||||
copying, modifying etc.
|
||||
|
||||
Icon: src/qt/res/icons/configure.png, src/qt/res/icons/quit.png,
|
||||
src/qt/res/icons/editcopy.png, src/qt/res/icons/editpaste.png,
|
||||
src/qt/res/icons/add.png, src/qt/res/icons/edit.png,
|
||||
src/qt/res/icons/remove.png (edited)
|
||||
Designer: http://www.everaldo.com
|
||||
Icon Pack: Crystal SVG
|
||||
License: LGPL
|
||||
|
||||
Icon: src/qt/res/icons/receive.png, src/qt/res/icons/history.png,
|
||||
src/qt/res/icons/export.png
|
||||
Designer: Oxygen team
|
||||
Icon Pack: Oxygen
|
||||
License: Creative Common Attribution-ShareAlike 3.0 License or LGPL
|
||||
Site: http://www.oxygen-icons.org/
|
||||
|
||||
Icon: src/qt/res/icons/bitcoin.png, src/qt/res/icons/toolbar.png
|
||||
Designer: Bitboy (optimized for 16x16 by Wladimir van der Laan)
|
||||
License: Public Domain
|
||||
Site: http://forum.bitcoin.org/?topic=1756.0
|
||||
|
||||
Icon: src/qt/res/icons/overview.png
|
||||
Icon Pack: Primo
|
||||
Designer: Jack Cai
|
||||
License: Creative Commons Attribution No Derivatives (by-nd)
|
||||
Site: http://findicons.com/icon/175944/home?id=176221#
|
||||
|
||||
Icon: scripts/img/reload.xcf (modified),src/qt/res/movies/update_spinner.mng
|
||||
Icon Pack: Kids
|
||||
Designer: Everaldo (Everaldo Coelho)
|
||||
License: GNU/GPL
|
||||
Site: http://findicons.com/icon/17102/reload?id=17102
|
||||
|
||||
Image: src/qt/res/images/splash2.jpg (Wallet image)
|
||||
Designer: Crobbo (forum)
|
||||
Site: https://bitcointalk.org/index.php?topic=32273.0
|
||||
License: Public domain
|
||||
|
||||
Icon: src/qt/res/icons/key.png
|
||||
Designer: VisualPharm (Ivan Boyko)
|
||||
Icon Pack: Must Have
|
||||
Site: http://findicons.com/icon/51009/key?id=51009
|
||||
License: Creative Commons Attribution (by)
|
||||
|
||||
|
||||
90
doc/build-msw.txt
Normal file
@@ -0,0 +1,90 @@
|
||||
Copyright (c) 2009-2011 Bitcoin Developers
|
||||
Distributed under the MIT/X11 software license, see the accompanying
|
||||
file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
This product includes software developed by the OpenSSL Project for use in
|
||||
the OpenSSL Toolkit (http://www.openssl.org/). This product includes
|
||||
cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP
|
||||
software written by Thomas Bernard.
|
||||
|
||||
|
||||
See readme-qt.rst for instructions on building Bitcoin QT, the
|
||||
graphical user interface.
|
||||
|
||||
WINDOWS BUILD NOTES
|
||||
===================
|
||||
|
||||
Compilers Supported
|
||||
-------------------
|
||||
MinGW GCC http://tdm-gcc.tdragon.net/
|
||||
TDM-GCC with gcc 4.5.1 was used to build this release.
|
||||
MSYS 1.0.11 was also used (sh needed to compile some dependencies)
|
||||
|
||||
|
||||
Candidate releases were built with MSVC 10.0 (2010), but
|
||||
compiling with Visual C++ caused rendering artifacts when
|
||||
bitcoin was run.
|
||||
|
||||
|
||||
Dependencies
|
||||
------------
|
||||
Libraries you need to download separately and build:
|
||||
|
||||
default path download
|
||||
OpenSSL \openssl-1.0.0d-mgw http://www.openssl.org/source/
|
||||
Berkeley DB \db-4.8.30.NC-mgw http://www.oracle.com/technology/software/products/berkeley-db/index.html
|
||||
Boost \boost-1.47.0-mgw http://www.boost.org/users/download/
|
||||
miniupnpc \miniupnpc-1.6-mgw http://miniupnp.tuxfamily.org/files/
|
||||
|
||||
Their licenses:
|
||||
OpenSSL Old BSD license with the problematic advertising requirement
|
||||
Berkeley DB New BSD license with additional requirement that linked software must be free open source
|
||||
Boost MIT-like license
|
||||
miniupnpc New (3-clause) BSD license
|
||||
|
||||
Versions used in this release:
|
||||
OpenSSL 1.0.0d
|
||||
Berkeley DB 4.8.30.NC
|
||||
Boost 1.47.0
|
||||
miniupnpc 1.6
|
||||
|
||||
|
||||
OpenSSL
|
||||
-------
|
||||
MSYS shell:
|
||||
un-tar sources with MSYS 'tar xfz' to avoid issue with symlinks (OpenSSL ticket 2377)
|
||||
change 'MAKE' env. variable from 'C:\MinGW32\bin\mingw32-make.exe' to '/c/MinGW32/bin/mingw32-make.exe'
|
||||
|
||||
cd /c/openssl-1.0.0d-mgw
|
||||
./config
|
||||
make
|
||||
|
||||
Berkeley DB
|
||||
-----------
|
||||
MSYS shell:
|
||||
cd /c/db-4.8.30.NC-mgw/build_unix
|
||||
sh ../dist/configure --enable-mingw --enable-cxx
|
||||
make
|
||||
|
||||
Boost
|
||||
-----
|
||||
DOS prompt:
|
||||
downloaded boost jam 3.1.18
|
||||
cd \boost-1.47.0-mgw
|
||||
bjam toolset=gcc --build-type=complete stage
|
||||
|
||||
MiniUPnPc
|
||||
---------
|
||||
UPnP support is optional, make with USE_UPNP= to disable it.
|
||||
|
||||
MSYS shell:
|
||||
cd /c/miniupnpc-1.6-mgw
|
||||
make -f Makefile.mingw
|
||||
mkdir miniupnpc
|
||||
cp *.h miniupnpc/
|
||||
|
||||
Bitcoin
|
||||
-------
|
||||
DOS prompt:
|
||||
cd \bitcoin\src
|
||||
mingw32-make bitcoind.exe -f makefile.mingw
|
||||
strip bitcoind.exe
|
||||
53
doc/build-osx.txt
Normal file
@@ -0,0 +1,53 @@
|
||||
Copyright (c) 2011 Bitcoin Developers
|
||||
Distributed under the MIT/X11 software license, see the accompanying file
|
||||
license.txt or http://www.opensource.org/licenses/mit-license.php. This
|
||||
product includes software developed by the OpenSSL Project for use in the
|
||||
OpenSSL Toolkit (http://www.openssl.org/). This product includes cryptographic
|
||||
software written by Eric Young (eay@cryptsoft.com) and UPnP software written by
|
||||
Thomas Bernard.
|
||||
|
||||
|
||||
Mac OS X bitcoind build instructions
|
||||
Laszlo Hanyecz <solar@heliacal.net>
|
||||
Douglas Huff <dhuff@jrbobdobbs.org>
|
||||
|
||||
|
||||
See readme-qt.rst for instructions on building Bitcoin QT, the
|
||||
graphical user interface.
|
||||
|
||||
Tested on 10.5 and 10.6 intel. PPC is not supported because it's big-endian.
|
||||
|
||||
All of the commands should be executed in Terminal.app.. it's in
|
||||
/Applications/Utilities
|
||||
|
||||
You need to install XCode with all the options checked so that the compiler and
|
||||
everything is available in /usr not just /Developer I think it comes on the DVD
|
||||
but you can get the current version from http://developer.apple.com
|
||||
|
||||
|
||||
1. Clone the github tree to get the source code:
|
||||
|
||||
git clone git@github.com:bitcoin/bitcoin.git bitcoin
|
||||
|
||||
2. Download and install MacPorts from http://www.macports.org/
|
||||
|
||||
3. Install dependencies from MacPorts
|
||||
|
||||
sudo port install boost db48 openssl
|
||||
|
||||
Install the right version of miniupnpc:
|
||||
pushd bitcoin/contrib/minipupnpc; sudo port install; popd
|
||||
(this will be unnecessary soon, you will just port install miniupnpc
|
||||
along with the rest of the dependencies).
|
||||
|
||||
4. Now you should be able to build bitcoind:
|
||||
|
||||
cd bitcoin/src
|
||||
make -f makefile.osx
|
||||
|
||||
Run:
|
||||
./bitcoind --help # for a list of command-line options.
|
||||
Run
|
||||
./bitcoind -daemon # to start the bitcoin daemon.
|
||||
Run
|
||||
./bitcoind help # When the daemon is running, to get a list of RPC commands
|
||||
150
doc/build-unix.txt
Normal file
@@ -0,0 +1,150 @@
|
||||
Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
Copyright (c) 2011 Bitcoin Developers
|
||||
Distributed under the MIT/X11 software license, see the accompanying
|
||||
file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
This product includes software developed by the OpenSSL Project for use in
|
||||
the OpenSSL Toolkit (http://www.openssl.org/). This product includes
|
||||
cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP
|
||||
software written by Thomas Bernard.
|
||||
|
||||
|
||||
UNIX BUILD NOTES
|
||||
================
|
||||
|
||||
To Build
|
||||
--------
|
||||
|
||||
cd src/
|
||||
make -f makefile.unix # Headless bitcoin
|
||||
|
||||
See readme-qt.rst for instructions on building Bitcoin QT,
|
||||
the graphical bitcoin.
|
||||
|
||||
Dependencies
|
||||
------------
|
||||
|
||||
Library Purpose Description
|
||||
------- ------- -----------
|
||||
libssl SSL Support Secure communications
|
||||
libdb4.8 Berkeley DB Blockchain & wallet storage
|
||||
libboost Boost C++ Library
|
||||
miniupnpc UPnP Support Optional firewall-jumping support
|
||||
|
||||
miniupnpc may be used for UPnP port mapping. It can be downloaded from
|
||||
http://miniupnp.tuxfamily.org/files/. UPnP support is compiled in and
|
||||
turned off by default. Set USE_UPNP to a different value to control this:
|
||||
USE_UPNP= No UPnP support - miniupnp not required
|
||||
USE_UPNP=0 (the default) UPnP support turned off by default at runtime
|
||||
USE_UPNP=1 UPnP support turned on by default at runtime
|
||||
|
||||
Licenses of statically linked libraries:
|
||||
Berkeley DB New BSD license with additional requirement that linked
|
||||
software must be free open source
|
||||
Boost MIT-like license
|
||||
miniupnpc New (3-clause) BSD license
|
||||
|
||||
Versions used in this release:
|
||||
GCC 4.3.3
|
||||
OpenSSL 0.9.8g
|
||||
Berkeley DB 4.8.30.NC
|
||||
Boost 1.37
|
||||
miniupnpc 1.6
|
||||
|
||||
|
||||
Dependency Build Instructions: Ubuntu & Debian
|
||||
----------------------------------------------
|
||||
sudo apt-get install build-essential
|
||||
sudo apt-get install libssl-dev
|
||||
sudo apt-get install libdb4.8-dev
|
||||
sudo apt-get install libdb4.8++-dev
|
||||
Boost 1.40+: sudo apt-get install libboost-all-dev
|
||||
or Boost 1.37: sudo apt-get install libboost1.37-dev
|
||||
|
||||
If using Boost 1.37, append -mt to the boost libraries in the makefile.
|
||||
|
||||
|
||||
Dependency Build Instructions: Gentoo
|
||||
-------------------------------------
|
||||
|
||||
Note: If you just want to install bitcoind on Gentoo, you can add the Bitcoin
|
||||
overlay and use your package manager:
|
||||
layman -a bitcoin && emerge bitcoind
|
||||
|
||||
emerge -av1 --noreplace boost glib openssl sys-libs/db:4.8
|
||||
|
||||
Take the following steps to build (no UPnP support):
|
||||
cd ${BITCOIN_DIR}/src
|
||||
make -f makefile.unix USE_UPNP= BDB_INCLUDE_PATH='/usr/include/db4.8'
|
||||
strip bitcoind
|
||||
|
||||
|
||||
Notes
|
||||
-----
|
||||
The release is built with GCC and then "strip bitcoind" to strip the debug
|
||||
symbols, which reduces the executable size by about 90%.
|
||||
|
||||
|
||||
miniupnpc
|
||||
---------
|
||||
tar -xzvf miniupnpc-1.6.tar.gz
|
||||
cd miniupnpc-1.6
|
||||
make
|
||||
sudo su
|
||||
make install
|
||||
|
||||
|
||||
Berkeley DB
|
||||
-----------
|
||||
You need Berkeley DB 4.8. If you have to build Berkeley DB yourself:
|
||||
../dist/configure --enable-cxx
|
||||
make
|
||||
|
||||
|
||||
Boost
|
||||
-----
|
||||
If you need to build Boost yourself:
|
||||
sudo su
|
||||
./bootstrap.sh
|
||||
./bjam install
|
||||
|
||||
|
||||
Security
|
||||
--------
|
||||
To help make your bitcoin installation more secure by making certain attacks impossible to
|
||||
exploit even if a vulnerability is found, you can take the following measures:
|
||||
|
||||
* Position Independent Executable
|
||||
Build position independent code to take advantage of Address Space Layout Randomization
|
||||
offered by some kernels. An attacker who is able to cause execution of code at an arbitrary
|
||||
memory location is thwarted if he doesn't know where anything useful is located.
|
||||
The stack and heap are randomly located by default but this allows the code section to be
|
||||
randomly located as well.
|
||||
|
||||
On an Amd64 processor where a library was not compiled with -fPIC, this will cause an error
|
||||
such as: "relocation R_X86_64_32 against `......' can not be used when making a shared object;"
|
||||
|
||||
To build with PIE, use:
|
||||
make -f makefile.unix ... -e PIE=1
|
||||
|
||||
To test that you have built PIE executable, install scanelf, part of paxutils, and use:
|
||||
scanelf -e ./bitcoin
|
||||
|
||||
The output should contain:
|
||||
TYPE
|
||||
ET_DYN
|
||||
|
||||
* Non-executable Stack
|
||||
If the stack is executable then trivial stack based buffer overflow exploits are possible if
|
||||
vulnerable buffers are found. By default, bitcoin should be built with a non-executable stack
|
||||
but if one of the libraries it uses asks for an executable stack or someone makes a mistake
|
||||
and uses a compiler extension which requires an executable stack, it will silently build an
|
||||
executable without the non-executable stack protection.
|
||||
|
||||
To verify that the stack is non-executable after compiling use:
|
||||
scanelf -e ./bitcoin
|
||||
|
||||
the output should contain:
|
||||
STK/REL/PTL
|
||||
RW- R-- RW-
|
||||
|
||||
The STK RW- means that the stack is readable and writeable but not executable.
|
||||
99
doc/coding.txt
Normal file
@@ -0,0 +1,99 @@
|
||||
Please be consistent with the existing coding style.
|
||||
|
||||
Block style:
|
||||
|
||||
bool Function(char* psz, int n)
|
||||
{
|
||||
// Comment summarising what this section of code does
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
// When something fails, return early
|
||||
if (!Something())
|
||||
return false;
|
||||
...
|
||||
}
|
||||
|
||||
// Success return is usually at the end
|
||||
return true;
|
||||
}
|
||||
|
||||
- ANSI/Allman block style
|
||||
- 4 space indenting, no tabs
|
||||
- No extra spaces inside parenthesis; please don't do ( this )
|
||||
- No space after function names, one space after if, for and while
|
||||
|
||||
Variable names begin with the type in lowercase, like nSomeVariable.
|
||||
Please don't put the first word of the variable name in lowercase like
|
||||
someVariable.
|
||||
|
||||
Common types:
|
||||
n integer number: short, unsigned short, int, unsigned int,
|
||||
int64, uint64, sometimes char if used as a number
|
||||
d double, float
|
||||
f flag
|
||||
hash uint256
|
||||
p pointer or array, one p for each level of indirection
|
||||
psz pointer to null terminated string
|
||||
str string object
|
||||
v vector or similar list objects
|
||||
map map or multimap
|
||||
set set or multiset
|
||||
bn CBigNum
|
||||
|
||||
-------------------------
|
||||
Locking/mutex usage notes
|
||||
|
||||
The code is multi-threaded, and uses mutexes and the
|
||||
CRITICAL_BLOCK/TRY_CRITICAL_BLOCK macros to protect data structures.
|
||||
|
||||
Deadlocks due to inconsistent lock ordering (thread 1 locks cs_main
|
||||
and then cs_wallet, while thread 2 locks them in the opposite order:
|
||||
result, deadlock as each waits for the other to release its lock) are
|
||||
a problem. Compile with -DDEBUG_LOCKORDER to get lock order
|
||||
inconsistencies reported in the debug.log file.
|
||||
|
||||
Re-architecting the core code so there are better-defined interfaces
|
||||
between the various components is a goal, with any necessary locking
|
||||
done by the components (e.g. see the self-contained CKeyStore class
|
||||
and its cs_KeyStore lock for example).
|
||||
|
||||
-------
|
||||
Threads
|
||||
|
||||
StartNode : Starts other threads.
|
||||
|
||||
ThreadGetMyExternalIP : Determines outside-the-firewall IP address,
|
||||
sends addr message to connected peers when it determines it.
|
||||
|
||||
ThreadIRCSeed : Joins IRC bootstrapping channel, watching for new
|
||||
peers and advertising this node's IP address.
|
||||
|
||||
ThreadSocketHandler : Sends/Receives data from peers on port 8333.
|
||||
|
||||
ThreadMessageHandler : Higher-level message handling (sending and
|
||||
receiving).
|
||||
|
||||
ThreadOpenConnections : Initiates new connections to peers.
|
||||
|
||||
ThreadTopUpKeyPool : replenishes the keystore's keypool.
|
||||
|
||||
ThreadCleanWalletPassphrase : re-locks an encrypted wallet after user
|
||||
has unlocked it for a period of time.
|
||||
|
||||
SendingDialogStartTransfer : used by pay-via-ip-address code (obsolete)
|
||||
|
||||
ThreadDelayedRepaint : repaint the gui
|
||||
|
||||
ThreadFlushWalletDB : Close the wallet.dat file if it hasn't been used
|
||||
in 500ms.
|
||||
|
||||
ThreadRPCServer : Remote procedure call handler, listens on port 8332
|
||||
for connections and services them.
|
||||
|
||||
ThreadBitcoinMiner : Generates bitcoins
|
||||
|
||||
ThreadMapPort : Universal plug-and-play startup/shutdown
|
||||
|
||||
Shutdown : Does an orderly shutdown of everything
|
||||
|
||||
ExitTimeout : Windows-only, sleeps 5 seconds then exits application
|
||||
162
doc/readme-qt.rst
Normal file
@@ -0,0 +1,162 @@
|
||||
Bitcoin-qt: Qt4 based GUI replacement for Bitcoin
|
||||
=================================================
|
||||
|
||||
Features
|
||||
========
|
||||
|
||||
- All functionality of the Wx GUI, including wallet encryption
|
||||
|
||||
- Compatibility with Linux (both GNOME and KDE), MacOSX and Windows
|
||||
|
||||
- Notification on incoming / outgoing transactions (compatible with FreeDesktop and other desktop notification schemes)
|
||||
|
||||
- General interface improvements: Splash screen, tabbed interface
|
||||
|
||||
- Overview page with current balance, unconfirmed balance, and such
|
||||
|
||||
- Better transaction list with status icons, real-time filtering and a context menu
|
||||
|
||||
- Asks for confirmation before sending coins, for your own safety
|
||||
|
||||
- CSV export of transactions and address book (for Excel bookkeeping)
|
||||
|
||||
- Shows alternative icon when connected to testnet, so you never accidentally send real coins during testing
|
||||
|
||||
- Shows a progress bar on initial block download, so that you don't have to wonder how many blocks it needs to download to be up to date
|
||||
|
||||
- Sendmany support, send to multiple recipients at the same time
|
||||
|
||||
- Multiple unit support, can show subdivided bitcoins (uBTC, mBTC) for users that like large numbers
|
||||
|
||||
- Support for English, German, Russian and Dutch languages
|
||||
|
||||
- Address books and transaction table can be sorted by any column
|
||||
|
||||
- Accepts "bitcoin:" URLs from browsers and other sources through drag and drop
|
||||
|
||||
Build instructions
|
||||
===================
|
||||
|
||||
Debian
|
||||
-------
|
||||
|
||||
First, make sure that the required packages for Qt4 development of your
|
||||
distribution are installed, for Debian and Ubuntu these are:
|
||||
|
||||
::
|
||||
|
||||
apt-get install qt4-qmake libqt4-dev build-essential libboost-dev libboost-system-dev \
|
||||
libboost-filesystem-dev libboost-program-options-dev libboost-thread-dev \
|
||||
libssl-dev libdb4.8++-dev
|
||||
|
||||
then execute the following:
|
||||
|
||||
::
|
||||
|
||||
qmake
|
||||
make
|
||||
|
||||
Alternatively, install Qt Creator and open the `bitcoin-qt.pro` file.
|
||||
|
||||
An executable named `bitcoin-qt` will be built.
|
||||
|
||||
|
||||
Windows
|
||||
--------
|
||||
|
||||
Windows build instructions:
|
||||
|
||||
- Download the `QT Windows SDK`_ and install it. You don't need the Symbian stuff, just the desktop Qt.
|
||||
|
||||
- Download and extract the `dependencies archive`_ [#]_, or compile openssl, boost and dbcxx yourself.
|
||||
|
||||
- Copy the contents of the folder "deps" to "X:\\QtSDK\\mingw", replace X:\\ with the location where you installed the Qt SDK. Make sure that the contents of "deps\\include" end up in the current "include" directory.
|
||||
|
||||
- Open the .pro file in QT creator and build as normal (ctrl-B)
|
||||
|
||||
.. _`QT Windows SDK`: http://qt.nokia.com/downloads/sdk-windows-cpp
|
||||
.. _`dependencies archive`: https://download.visucore.com/bitcoin/qtgui_deps_1.zip
|
||||
.. [#] PGP signature: https://download.visucore.com/bitcoin/qtgui_deps_1.zip.sig (signed with RSA key ID `610945D0`_)
|
||||
.. _`610945D0`: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x610945D0
|
||||
|
||||
|
||||
Mac OS X
|
||||
--------
|
||||
|
||||
- Download and install the `Qt Mac OS X SDK`_. It is recommended to also install Apple's Xcode with UNIX tools.
|
||||
|
||||
- Download and install `MacPorts`_.
|
||||
|
||||
- Execute the following commands in a terminal to get the dependencies:
|
||||
|
||||
::
|
||||
|
||||
sudo port selfupdate
|
||||
sudo port install boost db48
|
||||
|
||||
- Open the .pro file in Qt Creator and build as normal (cmd-B)
|
||||
|
||||
.. _`Qt Mac OS X SDK`: http://qt.nokia.com/downloads/sdk-mac-os-cpp
|
||||
.. _`MacPorts`: http://www.macports.org/install.php
|
||||
|
||||
|
||||
Build configuration options
|
||||
============================
|
||||
|
||||
UPNnP port forwarding
|
||||
---------------------
|
||||
|
||||
To use UPnP for port forwarding behind a NAT router (recommended, as more connections overall allow for a faster and more stable bitcoin experience), pass the following argument to qmake:
|
||||
|
||||
::
|
||||
|
||||
qmake "USE_UPNP=1"
|
||||
|
||||
(in **Qt Creator**, you can find the setting for additional qmake arguments under "Projects" -> "Build Settings" -> "Build Steps", then click "Details" next to **qmake**)
|
||||
|
||||
This requires miniupnpc for UPnP port mapping. It can be downloaded from
|
||||
http://miniupnp.tuxfamily.org/files/. UPnP support is not compiled in by default.
|
||||
|
||||
Set USE_UPNP to a different value to control this:
|
||||
|
||||
+------------+--------------------------------------------------------------+
|
||||
| USE_UPNP= | (the default) no UPnP support, miniupnpc not required; |
|
||||
+------------+--------------------------------------------------------------+
|
||||
| USE_UPNP=0 | UPnP support turned off by default at runtime; |
|
||||
+------------+--------------------------------------------------------------+
|
||||
| USE_UPNP=1 | UPnP support turned on by default at runtime. |
|
||||
+------------+--------------------------------------------------------------+
|
||||
|
||||
Mac OS X users: miniupnpc is currently outdated on MacPorts. An updated Portfile is provided in contrib/miniupnpc within this project.
|
||||
You can execute the following commands in a terminal to install it:
|
||||
|
||||
::
|
||||
|
||||
cd <location of bitcoin-qt>/contrib/miniupnpc
|
||||
sudo port install
|
||||
|
||||
Notification support for recent (k)ubuntu versions
|
||||
---------------------------------------------------
|
||||
|
||||
To see desktop notifications on (k)ubuntu versions starting from 10.04, enable usage of the
|
||||
FreeDesktop notification interface through DBUS using the following qmake option:
|
||||
|
||||
::
|
||||
|
||||
qmake "USE_DBUS=1"
|
||||
|
||||
Berkely DB version warning
|
||||
==========================
|
||||
|
||||
A warning for people using the *static binary* version of Bitcoin on a Linux/UNIX-ish system (tl;dr: **Berkely DB databases are not forward compatible**).
|
||||
|
||||
The static binary version of Bitcoin is linked against libdb4.7 or libdb4.8 (see also `this Debian issue`_).
|
||||
|
||||
Now the nasty thing is that databases from 5.X are not compatible with 4.X.
|
||||
|
||||
If the globally installed development package of Berkely DB installed on your system is 5.X, any source you
|
||||
build yourself will be linked against that. The first time you run with a 5.X version the database will be upgraded,
|
||||
and 4.X cannot open the new format. This means that you cannot go back to the old statically linked version without
|
||||
significant hassle!
|
||||
|
||||
.. _`this Debian issue`: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=621425
|
||||
108
doc/release-process.txt
Normal file
@@ -0,0 +1,108 @@
|
||||
* update (commit) version in sources
|
||||
src/serialize.h
|
||||
share/setup.nsi
|
||||
|
||||
* update (commit) version in OSX app bundle
|
||||
contrib/Bitcoin.app/Contents/Info.plist
|
||||
|
||||
* CFBundleShortVersionString should have value like 0.3.23
|
||||
* CFBundleVersion should have value like 323
|
||||
|
||||
* tag version in git
|
||||
|
||||
$ git tag -a v0.3.23
|
||||
|
||||
* write release notes. git shortlog helps a lot:
|
||||
|
||||
$ git shortlog --no-merges v0.3.22..
|
||||
|
||||
* create source-only archive
|
||||
|
||||
$ git archive --format=tar --prefix=bitcoin-0.3.23/ HEAD | \
|
||||
gzip -9c > ~/tmp/bitcoin-0.3.23-src.tar.gz
|
||||
|
||||
* perform gitian builds
|
||||
|
||||
* From a directory containing the bitcoin source, gitian-builder and gitian.sigs
|
||||
$ export VERSION=0.3.23
|
||||
$ cd ./gitian-builder
|
||||
$ ./bin/gbuild --commit bitcoin=v$VERSION ../bitcoin/contrib/gitian-descriptors/gitian.yml
|
||||
$ ./bin/gsign --signer (your gitian key, ie bluematt, sipa, etc) --release $VERSION --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian.yml
|
||||
$ cd build/out
|
||||
$ zip bitcoin-$VERSION-linux-gitian.zip *
|
||||
$ mv bitcoin-$VERSION-linux-gitian.zip ../../
|
||||
$ ./bin/gbuild --commit bitcoin=v$VERSION ../bitcoin/contrib/gitian-descriptors/gitian-win32.yml
|
||||
$ ./bin/gsign --signer (your gitian key, ie bluematt, sipa, etc) --release $VERSION-win32 --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-win32.yml
|
||||
$ cd build/out
|
||||
$ zip bitcoin-$VERSION-win32-gitian.zip *
|
||||
$ mv bitcoin-$VERSION-win32-gitian.zip ../../
|
||||
|
||||
Build output expected:
|
||||
1. linux 32-bit and 64-bit binaries + source (bitcoin-$VERSION-linux-gitian.zip)
|
||||
2. windows 32-bit binary, installer + source (bitcoin-$VERSION-win32-gitian.zip)
|
||||
3. Gitian signatures (in gitian.sigs/$VERSION[-win32]/(your gitian key)/
|
||||
|
||||
* repackage gitian builds for release as stand-alone zip/tar/installer exe
|
||||
|
||||
* Windows .zip and setup.exe:
|
||||
$ mkdir bitcoin-$VERSION-win32
|
||||
$ cd bitcoin-$VERSION-win32
|
||||
$ unzip bitcoin-$VERSION-win32-gitian.zip
|
||||
$ mv bitcoin-$VERSION-win32-setup.exe ..
|
||||
$ cd ..; zip bitcoin-$VERSION-win32.zip bitcoin-$VERSION-win32
|
||||
|
||||
* Linux .tar.gz:
|
||||
$ mkdir bitcoin-$VERSION-linux
|
||||
$ cd bitcoin-$VERSION-linux
|
||||
$ unzip bitcoin-$VERSION-linux-gitian.zip
|
||||
$ cd ..; tar czvf bitcoin-$VERSION-linux.tar.gz bitcoin-$VERSION-linux
|
||||
|
||||
* perform Mac build
|
||||
* From the bitcoin source dir
|
||||
$ cd contrib
|
||||
$ ./create_osx_dmg.sh
|
||||
$ mv Bitcoin.dmg bitcoin-$VERSION-macosx.dmg
|
||||
|
||||
* upload source and builds to SF
|
||||
|
||||
* create SHA1SUMS for builds, and PGP-sign it
|
||||
|
||||
* update bitcoin.org version
|
||||
|
||||
* update forum version
|
||||
|
||||
* update wiki
|
||||
|
||||
* update wiki download links
|
||||
|
||||
* release gitian-signed gitian archives
|
||||
|
||||
* Collect enough gitian signatures to meet minimum_weight (see contrib/gitian-downloader/*-download-config)
|
||||
|
||||
* From a directory containing bitcoin source, gitian.sigs and gitian zips
|
||||
$ export VERSION=0.3.23
|
||||
$ mkdir bitcoin-$VERSION-win32-gitian; cd bitcoin-$VERSION-win32-gitian
|
||||
$ unzip ../bitcoin-$VERSION-win32-gitian.zip
|
||||
$ mkdir gitian
|
||||
$ cp ../bitcoin/contrib/gitian-downloader/*.pgp ./gitian/
|
||||
$ for file in `ls ../gitian.sigs/$VERSION-win32/`; do
|
||||
$ cp ../gitian.sigs/$VERSION-win32/$file/bitcoin-build.assert ./gitian/$file-build.assert
|
||||
$ cp ../gitian.sigs/$VERSION-win32/$file/bitcoin-build.assert.sig ./gitian/$file-build.assert.sig
|
||||
$ done
|
||||
$ zip bitcoin-$VERSION-win32-gitian.zip *
|
||||
$ cp bitcoin-$VERSION-win32-gitian.zip ../
|
||||
$ cd ..
|
||||
$ mkdir bitcoin-$VERSION-linux-gitian; cd bitcoin-$VERSION-linux-gitian
|
||||
$ unzip ../bitcoin-$VERSION-linux-gitian.zip
|
||||
$ mkdir gitian
|
||||
$ cp ../bitcoin/contrib/gitian-downloader/*.pgp ./gitian/
|
||||
$ for file in `ls ../gitian.sigs/$VERSION/`; do
|
||||
$ cp ../gitian.sigs/$VERSION/$file/bitcoin-build.assert ./gitian/$file-build.assert
|
||||
$ cp ../gitian.sigs/$VERSION/$file/bitcoin-build.assert.sig ./gitian/$file-build.assert.sig
|
||||
$ done
|
||||
$ zip bitcoin-$VERSION-linux-gitian.zip *
|
||||
$ cp bitcoin-$VERSION-linux-gitian.zip ../
|
||||
|
||||
* Upload gitian zips to SF
|
||||
|
||||
|
||||
678
init.cpp
@@ -1,678 +0,0 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include "headers.h"
|
||||
|
||||
|
||||
|
||||
|
||||
void ExitTimeout(void* parg)
|
||||
{
|
||||
#ifdef __WXMSW__
|
||||
Sleep(5000);
|
||||
ExitProcess(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Shutdown(void* parg)
|
||||
{
|
||||
static CCriticalSection cs_Shutdown;
|
||||
static bool fTaken;
|
||||
bool fFirstThread;
|
||||
CRITICAL_BLOCK(cs_Shutdown)
|
||||
{
|
||||
fFirstThread = !fTaken;
|
||||
fTaken = true;
|
||||
}
|
||||
static bool fExit;
|
||||
if (fFirstThread)
|
||||
{
|
||||
fShutdown = true;
|
||||
nTransactionsUpdated++;
|
||||
DBFlush(false);
|
||||
StopNode();
|
||||
DBFlush(true);
|
||||
CreateThread(ExitTimeout, NULL);
|
||||
Sleep(50);
|
||||
printf("Bitcoin exiting\n\n");
|
||||
fExit = true;
|
||||
exit(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
while (!fExit)
|
||||
Sleep(500);
|
||||
Sleep(100);
|
||||
ExitThread(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Startup folder
|
||||
//
|
||||
|
||||
#ifdef __WXMSW__
|
||||
string StartupShortcutPath()
|
||||
{
|
||||
return MyGetSpecialFolderPath(CSIDL_STARTUP, true) + "\\Bitcoin.lnk";
|
||||
}
|
||||
|
||||
bool GetStartOnSystemStartup()
|
||||
{
|
||||
return filesystem::exists(StartupShortcutPath().c_str());
|
||||
}
|
||||
|
||||
void SetStartOnSystemStartup(bool fAutoStart)
|
||||
{
|
||||
// If the shortcut exists already, remove it for updating
|
||||
remove(StartupShortcutPath().c_str());
|
||||
|
||||
if (fAutoStart)
|
||||
{
|
||||
CoInitialize(NULL);
|
||||
|
||||
// Get a pointer to the IShellLink interface.
|
||||
IShellLink* psl = NULL;
|
||||
HRESULT hres = CoCreateInstance(CLSID_ShellLink, NULL,
|
||||
CLSCTX_INPROC_SERVER, IID_IShellLink,
|
||||
reinterpret_cast<void**>(&psl));
|
||||
|
||||
if (SUCCEEDED(hres))
|
||||
{
|
||||
// Get the current executable path
|
||||
TCHAR pszExePath[MAX_PATH];
|
||||
GetModuleFileName(NULL, pszExePath, sizeof(pszExePath));
|
||||
|
||||
// Set the path to the shortcut target
|
||||
psl->SetPath(pszExePath);
|
||||
PathRemoveFileSpec(pszExePath);
|
||||
psl->SetWorkingDirectory(pszExePath);
|
||||
psl->SetShowCmd(SW_SHOWMINNOACTIVE);
|
||||
|
||||
// Query IShellLink for the IPersistFile interface for
|
||||
// saving the shortcut in persistent storage.
|
||||
IPersistFile* ppf = NULL;
|
||||
hres = psl->QueryInterface(IID_IPersistFile,
|
||||
reinterpret_cast<void**>(&ppf));
|
||||
if (SUCCEEDED(hres))
|
||||
{
|
||||
WCHAR pwsz[MAX_PATH];
|
||||
// Ensure that the string is ANSI.
|
||||
MultiByteToWideChar(CP_ACP, 0, StartupShortcutPath().c_str(), -1, pwsz, MAX_PATH);
|
||||
// Save the link by calling IPersistFile::Save.
|
||||
hres = ppf->Save(pwsz, TRUE);
|
||||
ppf->Release();
|
||||
}
|
||||
psl->Release();
|
||||
}
|
||||
CoUninitialize();
|
||||
}
|
||||
}
|
||||
|
||||
#elif defined(__WXGTK__)
|
||||
|
||||
//
|
||||
// Follow the Desktop Application Autostart Spec:
|
||||
// http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html
|
||||
//
|
||||
|
||||
boost::filesystem::path GetAutostartDir()
|
||||
{
|
||||
namespace fs = boost::filesystem;
|
||||
|
||||
char* pszConfigHome = getenv("XDG_CONFIG_HOME");
|
||||
if (pszConfigHome) return fs::path(pszConfigHome) / fs::path("autostart");
|
||||
char* pszHome = getenv("HOME");
|
||||
if (pszHome) return fs::path(pszHome) / fs::path(".config/autostart");
|
||||
return fs::path();
|
||||
}
|
||||
|
||||
boost::filesystem::path GetAutostartFilePath()
|
||||
{
|
||||
return GetAutostartDir() / boost::filesystem::path("bitcoin.desktop");
|
||||
}
|
||||
|
||||
bool GetStartOnSystemStartup()
|
||||
{
|
||||
boost::filesystem::ifstream optionFile(GetAutostartFilePath());
|
||||
if (!optionFile.good())
|
||||
return false;
|
||||
// Scan through file for "Hidden=true":
|
||||
string line;
|
||||
while (!optionFile.eof())
|
||||
{
|
||||
getline(optionFile, line);
|
||||
if (line.find("Hidden") != string::npos &&
|
||||
line.find("true") != string::npos)
|
||||
return false;
|
||||
}
|
||||
optionFile.close();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void SetStartOnSystemStartup(bool fAutoStart)
|
||||
{
|
||||
if (!fAutoStart)
|
||||
{
|
||||
unlink(GetAutostartFilePath().native_file_string().c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
boost::filesystem::create_directories(GetAutostartDir());
|
||||
|
||||
boost::filesystem::ofstream optionFile(GetAutostartFilePath(), ios_base::out|ios_base::trunc);
|
||||
if (!optionFile.good())
|
||||
{
|
||||
wxMessageBox(_("Cannot write autostart/bitcoin.desktop file"), "Bitcoin");
|
||||
return;
|
||||
}
|
||||
// Write a bitcoin.desktop file to the autostart directory:
|
||||
char pszExePath[MAX_PATH+1];
|
||||
memset(pszExePath, 0, sizeof(pszExePath));
|
||||
readlink("/proc/self/exe", pszExePath, sizeof(pszExePath)-1);
|
||||
optionFile << "[Desktop Entry]\n";
|
||||
optionFile << "Type=Application\n";
|
||||
optionFile << "Name=Bitcoin\n";
|
||||
optionFile << "Exec=" << pszExePath << "\n";
|
||||
optionFile << "Terminal=false\n";
|
||||
optionFile << "Hidden=false\n";
|
||||
optionFile.close();
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
||||
// TODO: OSX startup stuff; see:
|
||||
// http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPSystemStartup/Articles/CustomLogin.html
|
||||
|
||||
bool GetStartOnSystemStartup() { return false; }
|
||||
void SetStartOnSystemStartup(bool fAutoStart) { }
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// CMyApp
|
||||
//
|
||||
|
||||
// Define a new application
|
||||
class CMyApp : public wxApp
|
||||
{
|
||||
public:
|
||||
wxLocale m_locale;
|
||||
|
||||
CMyApp(){};
|
||||
~CMyApp(){};
|
||||
bool OnInit();
|
||||
bool OnInit2();
|
||||
int OnExit();
|
||||
|
||||
// Hook Initialize so we can start without GUI
|
||||
virtual bool Initialize(int& argc, wxChar** argv);
|
||||
|
||||
// 2nd-level exception handling: we get all the exceptions occurring in any
|
||||
// event handler here
|
||||
virtual bool OnExceptionInMainLoop();
|
||||
|
||||
// 3rd, and final, level exception handling: whenever an unhandled
|
||||
// exception is caught, this function is called
|
||||
virtual void OnUnhandledException();
|
||||
|
||||
// and now for something different: this function is called in case of a
|
||||
// crash (e.g. dereferencing null pointer, division by 0, ...)
|
||||
virtual void OnFatalException();
|
||||
};
|
||||
|
||||
IMPLEMENT_APP(CMyApp)
|
||||
|
||||
bool CMyApp::Initialize(int& argc, wxChar** argv)
|
||||
{
|
||||
if (argc > 1 && argv[1][0] != '-' && (!fWindows || argv[1][0] != '/') &&
|
||||
wxString(argv[1]) != "start")
|
||||
{
|
||||
fCommandLine = true;
|
||||
}
|
||||
else if (!fGUI)
|
||||
{
|
||||
fDaemon = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// wxApp::Initialize will remove environment-specific parameters,
|
||||
// so it's too early to call ParseParameters yet
|
||||
for (int i = 1; i < argc; i++)
|
||||
{
|
||||
wxString str = argv[i];
|
||||
#ifdef __WXMSW__
|
||||
if (str.size() >= 1 && str[0] == '/')
|
||||
str[0] = '-';
|
||||
char pszLower[MAX_PATH];
|
||||
strlcpy(pszLower, str.c_str(), sizeof(pszLower));
|
||||
strlwr(pszLower);
|
||||
str = pszLower;
|
||||
#endif
|
||||
// haven't decided which argument to use for this yet
|
||||
if (str == "-daemon" || str == "-d" || str == "start")
|
||||
fDaemon = true;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef __WXGTK__
|
||||
if (fDaemon || fCommandLine)
|
||||
{
|
||||
// Call the original Initialize while suppressing error messages
|
||||
// and ignoring failure. If unable to initialize GTK, it fails
|
||||
// near the end so hopefully the last few things don't matter.
|
||||
{
|
||||
wxLogNull logNo;
|
||||
wxApp::Initialize(argc, argv);
|
||||
}
|
||||
|
||||
if (fDaemon)
|
||||
{
|
||||
// Daemonize
|
||||
pid_t pid = fork();
|
||||
if (pid < 0)
|
||||
{
|
||||
fprintf(stderr, "Error: fork() returned %d errno %d\n", pid, errno);
|
||||
return false;
|
||||
}
|
||||
if (pid > 0)
|
||||
pthread_exit((void*)0);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
return wxApp::Initialize(argc, argv);
|
||||
}
|
||||
|
||||
bool CMyApp::OnInit()
|
||||
{
|
||||
bool fRet = false;
|
||||
try
|
||||
{
|
||||
fRet = OnInit2();
|
||||
}
|
||||
catch (std::exception& e) {
|
||||
PrintException(&e, "OnInit()");
|
||||
} catch (...) {
|
||||
PrintException(NULL, "OnInit()");
|
||||
}
|
||||
if (!fRet)
|
||||
Shutdown(NULL);
|
||||
return fRet;
|
||||
}
|
||||
|
||||
extern int g_isPainting;
|
||||
|
||||
bool CMyApp::OnInit2()
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
// Turn off microsoft heap dump noise
|
||||
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
|
||||
_CrtSetReportFile(_CRT_WARN, CreateFileA("NUL", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0));
|
||||
#endif
|
||||
#if _MSC_VER >= 1400
|
||||
// Disable confusing "helpful" text message on abort, ctrl-c
|
||||
_set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
|
||||
#endif
|
||||
#if defined(__WXMSW__) && defined(__WXDEBUG__) && wxUSE_GUI
|
||||
// Disable malfunctioning wxWidgets debug assertion
|
||||
g_isPainting = 10000;
|
||||
#endif
|
||||
#if wxUSE_GUI
|
||||
wxImage::AddHandler(new wxPNGHandler);
|
||||
#endif
|
||||
#if defined(__WXMSW__ ) || defined(__WXMAC__)
|
||||
SetAppName("Bitcoin");
|
||||
#else
|
||||
SetAppName("bitcoin");
|
||||
#endif
|
||||
#ifndef __WXMSW__
|
||||
umask(077);
|
||||
#endif
|
||||
#ifdef __WXMSW__
|
||||
#if wxUSE_UNICODE
|
||||
// Hack to set wxConvLibc codepage to UTF-8 on Windows,
|
||||
// may break if wxMBConv_win32 implementation in strconv.cpp changes.
|
||||
class wxMBConv_win32 : public wxMBConv
|
||||
{
|
||||
public:
|
||||
long m_CodePage;
|
||||
size_t m_minMBCharWidth;
|
||||
};
|
||||
if (((wxMBConv_win32*)&wxConvLibc)->m_CodePage == CP_ACP)
|
||||
((wxMBConv_win32*)&wxConvLibc)->m_CodePage = CP_UTF8;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Load locale/<lang>/LC_MESSAGES/bitcoin.mo language file
|
||||
m_locale.Init(wxLANGUAGE_DEFAULT, 0);
|
||||
m_locale.AddCatalogLookupPathPrefix("locale");
|
||||
if (!fWindows)
|
||||
{
|
||||
m_locale.AddCatalogLookupPathPrefix("/usr/share/locale");
|
||||
m_locale.AddCatalogLookupPathPrefix("/usr/local/share/locale");
|
||||
}
|
||||
m_locale.AddCatalog("wxstd"); // wxWidgets standard translations, if any
|
||||
m_locale.AddCatalog("bitcoin");
|
||||
|
||||
//
|
||||
// Parameters
|
||||
//
|
||||
if (fCommandLine)
|
||||
{
|
||||
int ret = CommandLineRPC(argc, argv);
|
||||
exit(ret);
|
||||
}
|
||||
|
||||
ParseParameters(argc, argv);
|
||||
if (mapArgs.count("-?") || mapArgs.count("--help"))
|
||||
{
|
||||
wxString strUsage = string() +
|
||||
_("Usage:") + "\t\t\t\t\t\t\t\t\t\t\n" +
|
||||
" bitcoin [options] \t" + "\n" +
|
||||
" bitcoin [command] \t" + _("Send command to bitcoin running with -server or -daemon\n") +
|
||||
" bitcoin [command] -? \t" + _("Get help for a command\n") +
|
||||
" bitcoin help \t" + _("List commands\n") +
|
||||
_("Options:\n") +
|
||||
" -gen \t " + _("Generate coins\n") +
|
||||
" -gen=0 \t " + _("Don't generate coins\n") +
|
||||
" -min \t " + _("Start minimized\n") +
|
||||
" -datadir=<dir> \t " + _("Specify data directory\n") +
|
||||
" -proxy=<ip:port>\t " + _("Connect through socks4 proxy\n") +
|
||||
" -addnode=<ip> \t " + _("Add a node to connect to\n") +
|
||||
" -connect=<ip> \t " + _("Connect only to the specified node\n") +
|
||||
" -server \t " + _("Accept command line and JSON-RPC commands\n") +
|
||||
" -daemon \t " + _("Run in the background as a daemon and accept commands\n") +
|
||||
" -? \t " + _("This help message\n");
|
||||
|
||||
#if defined(__WXMSW__) && wxUSE_GUI
|
||||
// Tabs make the columns line up in the message box
|
||||
wxMessageBox(strUsage, "Bitcoin", wxOK);
|
||||
#else
|
||||
// Remove tabs
|
||||
strUsage.Replace("\t", "");
|
||||
fprintf(stderr, "%s", ((string)strUsage).c_str());
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mapArgs.count("-datadir"))
|
||||
strlcpy(pszSetDataDir, mapArgs["-datadir"].c_str(), sizeof(pszSetDataDir));
|
||||
|
||||
if (mapArgs.count("-debug"))
|
||||
fDebug = true;
|
||||
|
||||
if (mapArgs.count("-printtodebugger"))
|
||||
fPrintToDebugger = true;
|
||||
|
||||
if (!fDebug && !pszSetDataDir[0])
|
||||
ShrinkDebugFile();
|
||||
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
|
||||
printf("Bitcoin version %d.%d.%d%s beta, OS version %s\n", VERSION/10000, (VERSION/100)%100, VERSION%100, pszSubVer, ((string)wxGetOsDescription()).c_str());
|
||||
printf("System default language is %d %s\n", m_locale.GetSystemLanguage(), ((string)m_locale.GetSysName()).c_str());
|
||||
printf("Language file %s (%s)\n", (string("locale/") + (string)m_locale.GetCanonicalName() + "/LC_MESSAGES/bitcoin.mo").c_str(), ((string)m_locale.GetLocale()).c_str());
|
||||
printf("Default data directory %s\n", GetDefaultDataDir().c_str());
|
||||
|
||||
if (mapArgs.count("-loadblockindextest"))
|
||||
{
|
||||
CTxDB txdb("r");
|
||||
txdb.LoadBlockIndex();
|
||||
PrintBlockTree();
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// Limit to single instance per user
|
||||
// Required to protect the database files if we're going to keep deleting log.*
|
||||
//
|
||||
#ifdef __WXMSW__
|
||||
// todo: wxSingleInstanceChecker wasn't working on Linux, never deleted its lock file
|
||||
// maybe should go by whether successfully bind port 8333 instead
|
||||
wxString strMutexName = wxString("bitcoin_running.") + getenv("HOMEPATH");
|
||||
for (int i = 0; i < strMutexName.size(); i++)
|
||||
if (!isalnum(strMutexName[i]))
|
||||
strMutexName[i] = '.';
|
||||
wxSingleInstanceChecker* psingleinstancechecker = new wxSingleInstanceChecker(strMutexName);
|
||||
if (psingleinstancechecker->IsAnotherRunning())
|
||||
{
|
||||
printf("Existing instance found\n");
|
||||
unsigned int nStart = GetTime();
|
||||
loop
|
||||
{
|
||||
// TODO: find out how to do this in Linux, or replace with wxWidgets commands
|
||||
// Show the previous instance and exit
|
||||
HWND hwndPrev = FindWindowA("wxWindowClassNR", "Bitcoin");
|
||||
if (hwndPrev)
|
||||
{
|
||||
if (IsIconic(hwndPrev))
|
||||
ShowWindow(hwndPrev, SW_RESTORE);
|
||||
SetForegroundWindow(hwndPrev);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (GetTime() > nStart + 60)
|
||||
return false;
|
||||
|
||||
// Resume this instance if the other exits
|
||||
delete psingleinstancechecker;
|
||||
Sleep(1000);
|
||||
psingleinstancechecker = new wxSingleInstanceChecker(strMutexName);
|
||||
if (!psingleinstancechecker->IsAnotherRunning())
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// Bind to the port early so we can tell if another instance is already running.
|
||||
// This is a backup to wxSingleInstanceChecker, which doesn't work on Linux.
|
||||
string strErrors;
|
||||
if (!BindListenPort(strErrors))
|
||||
{
|
||||
wxMessageBox(strErrors, "Bitcoin");
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// Load data files
|
||||
//
|
||||
if (fDaemon)
|
||||
fprintf(stdout, "bitcoin server starting\n");
|
||||
strErrors = "";
|
||||
int64 nStart;
|
||||
|
||||
printf("Loading addresses...\n");
|
||||
nStart = GetTimeMillis();
|
||||
if (!LoadAddresses())
|
||||
strErrors += _("Error loading addr.dat \n");
|
||||
printf(" addresses %15"PRI64d"ms\n", GetTimeMillis() - nStart);
|
||||
|
||||
printf("Loading block index...\n");
|
||||
nStart = GetTimeMillis();
|
||||
if (!LoadBlockIndex())
|
||||
strErrors += _("Error loading blkindex.dat \n");
|
||||
printf(" block index %15"PRI64d"ms\n", GetTimeMillis() - nStart);
|
||||
|
||||
printf("Loading wallet...\n");
|
||||
nStart = GetTimeMillis();
|
||||
bool fFirstRun;
|
||||
if (!LoadWallet(fFirstRun))
|
||||
strErrors += _("Error loading wallet.dat \n");
|
||||
printf(" wallet %15"PRI64d"ms\n", GetTimeMillis() - nStart);
|
||||
|
||||
printf("Done loading\n");
|
||||
|
||||
//// debug print
|
||||
printf("mapBlockIndex.size() = %d\n", mapBlockIndex.size());
|
||||
printf("nBestHeight = %d\n", nBestHeight);
|
||||
printf("mapKeys.size() = %d\n", mapKeys.size());
|
||||
printf("mapPubKeys.size() = %d\n", mapPubKeys.size());
|
||||
printf("mapWallet.size() = %d\n", mapWallet.size());
|
||||
printf("mapAddressBook.size() = %d\n", mapAddressBook.size());
|
||||
|
||||
if (!strErrors.empty())
|
||||
{
|
||||
wxMessageBox(strErrors, "Bitcoin");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Add wallet transactions that aren't already in a block to mapTransactions
|
||||
ReacceptWalletTransactions();
|
||||
|
||||
//
|
||||
// Parameters
|
||||
//
|
||||
if (mapArgs.count("-printblockindex") || mapArgs.count("-printblocktree"))
|
||||
{
|
||||
PrintBlockTree();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mapArgs.count("-printblock"))
|
||||
{
|
||||
string strMatch = mapArgs["-printblock"];
|
||||
int nFound = 0;
|
||||
for (map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.begin(); mi != mapBlockIndex.end(); ++mi)
|
||||
{
|
||||
uint256 hash = (*mi).first;
|
||||
if (strncmp(hash.ToString().c_str(), strMatch.c_str(), strMatch.size()) == 0)
|
||||
{
|
||||
CBlockIndex* pindex = (*mi).second;
|
||||
CBlock block;
|
||||
block.ReadFromDisk(pindex);
|
||||
block.BuildMerkleTree();
|
||||
block.print();
|
||||
printf("\n");
|
||||
nFound++;
|
||||
}
|
||||
}
|
||||
if (nFound == 0)
|
||||
printf("No blocks matching %s were found\n", strMatch.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mapArgs.count("-gen"))
|
||||
{
|
||||
if (mapArgs["-gen"].empty())
|
||||
fGenerateBitcoins = true;
|
||||
else
|
||||
fGenerateBitcoins = (atoi(mapArgs["-gen"].c_str()) != 0);
|
||||
}
|
||||
|
||||
if (mapArgs.count("-proxy"))
|
||||
{
|
||||
fUseProxy = true;
|
||||
addrProxy = CAddress(mapArgs["-proxy"]);
|
||||
if (!addrProxy.IsValid())
|
||||
{
|
||||
wxMessageBox(_("Invalid -proxy address"), "Bitcoin");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (mapArgs.count("-addnode"))
|
||||
{
|
||||
foreach(string strAddr, mapMultiArgs["-addnode"])
|
||||
{
|
||||
CAddress addr(strAddr, NODE_NETWORK);
|
||||
addr.nTime = 0; // so it won't relay unless successfully connected
|
||||
if (addr.IsValid())
|
||||
AddAddress(addr);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Create the main window and start the node
|
||||
//
|
||||
if (!fDaemon)
|
||||
CreateMainWindow();
|
||||
|
||||
if (!CheckDiskSpace())
|
||||
return false;
|
||||
|
||||
RandAddSeedPerfmon();
|
||||
|
||||
if (!CreateThread(StartNode, NULL))
|
||||
wxMessageBox("Error: CreateThread(StartNode) failed", "Bitcoin");
|
||||
|
||||
if (mapArgs.count("-server") || fDaemon)
|
||||
CreateThread(ThreadRPCServer, NULL);
|
||||
|
||||
if (fFirstRun)
|
||||
SetStartOnSystemStartup(true);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int CMyApp::OnExit()
|
||||
{
|
||||
Shutdown(NULL);
|
||||
return wxApp::OnExit();
|
||||
}
|
||||
|
||||
bool CMyApp::OnExceptionInMainLoop()
|
||||
{
|
||||
try
|
||||
{
|
||||
throw;
|
||||
}
|
||||
catch (std::exception& e)
|
||||
{
|
||||
PrintException(&e, "CMyApp::OnExceptionInMainLoop()");
|
||||
wxLogWarning("Exception %s %s", typeid(e).name(), e.what());
|
||||
Sleep(1000);
|
||||
throw;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
PrintException(NULL, "CMyApp::OnExceptionInMainLoop()");
|
||||
wxLogWarning("Unknown exception");
|
||||
Sleep(1000);
|
||||
throw;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void CMyApp::OnUnhandledException()
|
||||
{
|
||||
// this shows how we may let some exception propagate uncaught
|
||||
try
|
||||
{
|
||||
throw;
|
||||
}
|
||||
catch (std::exception& e)
|
||||
{
|
||||
PrintException(&e, "CMyApp::OnUnhandledException()");
|
||||
wxLogWarning("Exception %s %s", typeid(e).name(), e.what());
|
||||
Sleep(1000);
|
||||
throw;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
PrintException(NULL, "CMyApp::OnUnhandledException()");
|
||||
wxLogWarning("Unknown exception");
|
||||
Sleep(1000);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
void CMyApp::OnFatalException()
|
||||
{
|
||||
wxMessageBox(_("Program has crashed and will terminate. "), "Bitcoin", wxOK | wxICON_ERROR);
|
||||
}
|
||||
168
key.h
@@ -1,168 +0,0 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
|
||||
// secp160k1
|
||||
// const unsigned int PRIVATE_KEY_SIZE = 192;
|
||||
// const unsigned int PUBLIC_KEY_SIZE = 41;
|
||||
// const unsigned int SIGNATURE_SIZE = 48;
|
||||
//
|
||||
// secp192k1
|
||||
// const unsigned int PRIVATE_KEY_SIZE = 222;
|
||||
// const unsigned int PUBLIC_KEY_SIZE = 49;
|
||||
// const unsigned int SIGNATURE_SIZE = 57;
|
||||
//
|
||||
// secp224k1
|
||||
// const unsigned int PRIVATE_KEY_SIZE = 250;
|
||||
// const unsigned int PUBLIC_KEY_SIZE = 57;
|
||||
// const unsigned int SIGNATURE_SIZE = 66;
|
||||
//
|
||||
// secp256k1:
|
||||
// const unsigned int PRIVATE_KEY_SIZE = 279;
|
||||
// const unsigned int PUBLIC_KEY_SIZE = 65;
|
||||
// const unsigned int SIGNATURE_SIZE = 72;
|
||||
//
|
||||
// see www.keylength.com
|
||||
// script supports up to 75 for single byte push
|
||||
|
||||
|
||||
|
||||
class key_error : public std::runtime_error
|
||||
{
|
||||
public:
|
||||
explicit key_error(const std::string& str) : std::runtime_error(str) {}
|
||||
};
|
||||
|
||||
|
||||
// secure_allocator is defined in serialize.h
|
||||
typedef vector<unsigned char, secure_allocator<unsigned char> > CPrivKey;
|
||||
|
||||
|
||||
|
||||
class CKey
|
||||
{
|
||||
protected:
|
||||
EC_KEY* pkey;
|
||||
bool fSet;
|
||||
|
||||
public:
|
||||
CKey()
|
||||
{
|
||||
pkey = EC_KEY_new_by_curve_name(NID_secp256k1);
|
||||
if (pkey == NULL)
|
||||
throw key_error("CKey::CKey() : EC_KEY_new_by_curve_name failed");
|
||||
fSet = false;
|
||||
}
|
||||
|
||||
CKey(const CKey& b)
|
||||
{
|
||||
pkey = EC_KEY_dup(b.pkey);
|
||||
if (pkey == NULL)
|
||||
throw key_error("CKey::CKey(const CKey&) : EC_KEY_dup failed");
|
||||
fSet = b.fSet;
|
||||
}
|
||||
|
||||
CKey& operator=(const CKey& b)
|
||||
{
|
||||
if (!EC_KEY_copy(pkey, b.pkey))
|
||||
throw key_error("CKey::operator=(const CKey&) : EC_KEY_copy failed");
|
||||
fSet = b.fSet;
|
||||
return (*this);
|
||||
}
|
||||
|
||||
~CKey()
|
||||
{
|
||||
EC_KEY_free(pkey);
|
||||
}
|
||||
|
||||
bool IsNull() const
|
||||
{
|
||||
return !fSet;
|
||||
}
|
||||
|
||||
void MakeNewKey()
|
||||
{
|
||||
if (!EC_KEY_generate_key(pkey))
|
||||
throw key_error("CKey::MakeNewKey() : EC_KEY_generate_key failed");
|
||||
fSet = true;
|
||||
}
|
||||
|
||||
bool SetPrivKey(const CPrivKey& vchPrivKey)
|
||||
{
|
||||
const unsigned char* pbegin = &vchPrivKey[0];
|
||||
if (!d2i_ECPrivateKey(&pkey, &pbegin, vchPrivKey.size()))
|
||||
return false;
|
||||
fSet = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
CPrivKey GetPrivKey() const
|
||||
{
|
||||
unsigned int nSize = i2d_ECPrivateKey(pkey, NULL);
|
||||
if (!nSize)
|
||||
throw key_error("CKey::GetPrivKey() : i2d_ECPrivateKey failed");
|
||||
CPrivKey vchPrivKey(nSize, 0);
|
||||
unsigned char* pbegin = &vchPrivKey[0];
|
||||
if (i2d_ECPrivateKey(pkey, &pbegin) != nSize)
|
||||
throw key_error("CKey::GetPrivKey() : i2d_ECPrivateKey returned unexpected size");
|
||||
return vchPrivKey;
|
||||
}
|
||||
|
||||
bool SetPubKey(const vector<unsigned char>& vchPubKey)
|
||||
{
|
||||
const unsigned char* pbegin = &vchPubKey[0];
|
||||
if (!o2i_ECPublicKey(&pkey, &pbegin, vchPubKey.size()))
|
||||
return false;
|
||||
fSet = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
vector<unsigned char> GetPubKey() const
|
||||
{
|
||||
unsigned int nSize = i2o_ECPublicKey(pkey, NULL);
|
||||
if (!nSize)
|
||||
throw key_error("CKey::GetPubKey() : i2o_ECPublicKey failed");
|
||||
vector<unsigned char> vchPubKey(nSize, 0);
|
||||
unsigned char* pbegin = &vchPubKey[0];
|
||||
if (i2o_ECPublicKey(pkey, &pbegin) != nSize)
|
||||
throw key_error("CKey::GetPubKey() : i2o_ECPublicKey returned unexpected size");
|
||||
return vchPubKey;
|
||||
}
|
||||
|
||||
bool Sign(uint256 hash, vector<unsigned char>& vchSig)
|
||||
{
|
||||
vchSig.clear();
|
||||
unsigned char pchSig[10000];
|
||||
unsigned int nSize = 0;
|
||||
if (!ECDSA_sign(0, (unsigned char*)&hash, sizeof(hash), pchSig, &nSize, pkey))
|
||||
return false;
|
||||
vchSig.resize(nSize);
|
||||
memcpy(&vchSig[0], pchSig, nSize);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Verify(uint256 hash, const vector<unsigned char>& vchSig)
|
||||
{
|
||||
// -1 = error, 0 = bad sig, 1 = good
|
||||
if (ECDSA_verify(0, (unsigned char*)&hash, sizeof(hash), &vchSig[0], vchSig.size(), pkey) != 1)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool Sign(const CPrivKey& vchPrivKey, uint256 hash, vector<unsigned char>& vchSig)
|
||||
{
|
||||
CKey key;
|
||||
if (!key.SetPrivKey(vchPrivKey))
|
||||
return false;
|
||||
return key.Sign(hash, vchSig);
|
||||
}
|
||||
|
||||
static bool Verify(const vector<unsigned char>& vchPubKey, uint256 hash, const vector<unsigned char>& vchSig)
|
||||
{
|
||||
CKey key;
|
||||
if (!key.SetPubKey(vchPubKey))
|
||||
return false;
|
||||
return key.Verify(hash, vchSig);
|
||||
}
|
||||
};
|
||||
@@ -1,809 +0,0 @@
|
||||
# DataWraith <DataWraith@web.de>, 2010.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"POT-Creation-Date: 2010-05-26 22:02-0000\n"
|
||||
"PO-Revision-Date: 2010-06-03 13:11+0200\n"
|
||||
"Last-Translator: DataWraith\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Poedit-KeywordsList: _;gettext;gettext_noop\n"
|
||||
"X-Poedit-Basepath: .\n"
|
||||
"X-Poedit-SearchPath-0: ../../..\n"
|
||||
"X-Generator: Lokalize 1.0\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
|
||||
#: ../../../init.cpp:342
|
||||
msgid "Usage: bitcoin [options]"
|
||||
msgstr "Verwendung: bitcoin [optionen]"
|
||||
|
||||
#: ../../../init.cpp:343
|
||||
msgid "Options:\n"
|
||||
msgstr "Optionen:\n"
|
||||
|
||||
#: ../../../init.cpp:344
|
||||
msgid "Generate coins\n"
|
||||
msgstr "Münzen erzeugen\n"
|
||||
|
||||
#: ../../../init.cpp:345
|
||||
msgid "Don't generate coins\n"
|
||||
msgstr "Keine Münzen erzeugen\n"
|
||||
|
||||
#: ../../../init.cpp:346
|
||||
msgid "Start minimized\n"
|
||||
msgstr "Minimiert starten\n"
|
||||
|
||||
#: ../../../init.cpp:347
|
||||
msgid "Specify data directory\n"
|
||||
msgstr "Datenverzeichnis festlegen\n"
|
||||
|
||||
#: ../../../init.cpp:348
|
||||
msgid "Connect through socks4 proxy\n"
|
||||
msgstr "Socks4 Proxy verwenden\n"
|
||||
|
||||
#: ../../../init.cpp:349
|
||||
msgid "Add a node to connect to\n"
|
||||
msgstr "Einen Teilnehmer hinzufügen, zu dem verbunden werden soll\n"
|
||||
|
||||
#: ../../../init.cpp:350
|
||||
msgid "Connect only to the specified node\n"
|
||||
msgstr "Nur zu dem angegebenen Teilnehmer verbinden\n"
|
||||
|
||||
#: ../../../init.cpp:351
|
||||
msgid "This help message\n"
|
||||
msgstr "Diese Anleitung\n"
|
||||
|
||||
#: ../../../init.cpp:455
|
||||
msgid "Error loading addr.dat \n"
|
||||
msgstr "Fehler beim Laden von addr.dat \n"
|
||||
|
||||
#: ../../../init.cpp:461
|
||||
msgid "Error loading blkindex.dat \n"
|
||||
msgstr "Fehler beim Laden von blkindex.dat \n"
|
||||
|
||||
#: ../../../init.cpp:468
|
||||
msgid "Error loading wallet.dat \n"
|
||||
msgstr "Fehler beim Laden von wallet.dat \n"
|
||||
|
||||
#: ../../../init.cpp:536
|
||||
msgid "Invalid -proxy address"
|
||||
msgstr "Ungültige -Proxy Adresse"
|
||||
|
||||
#: ../../../init.cpp:629
|
||||
msgid "Program has crashed and will terminate. "
|
||||
msgstr "Das Programm ist abgestürzt und wird beendet. "
|
||||
|
||||
#: ../../../main.cpp:1465
|
||||
msgid "Warning: Disk space is low "
|
||||
msgstr "Warnung: Festplatte fast voll "
|
||||
|
||||
#: ../../../main.cpp:2994
|
||||
#, c-format
|
||||
msgid "Error: This is an oversized transaction that requires a transaction fee of %s "
|
||||
msgstr "Fehler: Die Überweisung ist sehr groß. Es wird eine Gebühr von %s erhoben. "
|
||||
|
||||
#: ../../../main.cpp:2996
|
||||
msgid "Error: Transaction creation failed "
|
||||
msgstr "Fehler: Überweisung konnte nicht erzeugt werden. "
|
||||
|
||||
#: ../../../main.cpp:3001
|
||||
#: ../../../ui.cpp:1761
|
||||
#: ../../../ui.cpp:1763
|
||||
#: ../../../ui.cpp:1904
|
||||
#: ../../../ui.cpp:2053
|
||||
msgid "Sending..."
|
||||
msgstr "Überweise..."
|
||||
|
||||
#: ../../../main.cpp:3005
|
||||
msgid "Error: The transaction was rejected. This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here."
|
||||
msgstr "Fehler: Die Überweisung wurde abgelehnt. Das kann passieren, wenn einige der Münzen in Ihrer Brieftasche bereits ausgegeben wurden, z.B. weil Sie eine Kopie der Brieftasche (wallet.dat) gemacht haben. Bitcoins, die mithilfe der Kopie ausgegeben wurden, sind in dieser Brieftasche noch nicht als ausgegeben markiert worden."
|
||||
|
||||
#: ../../../main.cpp:3017
|
||||
msgid "Invalid amount"
|
||||
msgstr "Ungültiger Betrag"
|
||||
|
||||
#: ../../../main.cpp:3019
|
||||
#: ../../../ui.cpp:1971
|
||||
#: ../../../ui.cpp:2038
|
||||
msgid "Insufficient funds"
|
||||
msgstr "Unzureichende Geldmittel"
|
||||
|
||||
#: ../../../main.cpp:3024
|
||||
msgid "Invalid bitcoin address"
|
||||
msgstr "Ungültige Bitcoin-Adresse"
|
||||
|
||||
#: ../../../ui.cpp:189
|
||||
#, c-format
|
||||
msgid "This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee?"
|
||||
msgstr "Diese Überweisung übersteigt das Betragslimit. Sie können sie trotzdem tätigen, aber es wird eine Gebühr von %s erhoben, die an den Teilnehmer ausgeschüttet wird, der Ihre Überweisung bearbeitet und dadurch hilft das Netzwerk am laufen zu halten. Möchten Sie die Gebühr entrichten?"
|
||||
|
||||
#: ../../../ui.cpp:285
|
||||
msgid "Status"
|
||||
msgstr "Status"
|
||||
|
||||
#: ../../../ui.cpp:286
|
||||
msgid "Date"
|
||||
msgstr "Datum"
|
||||
|
||||
#: ../../../ui.cpp:287
|
||||
msgid "Description"
|
||||
msgstr "Beschreibung"
|
||||
|
||||
#: ../../../ui.cpp:288
|
||||
msgid "Debit"
|
||||
msgstr "Belastungen"
|
||||
|
||||
#: ../../../ui.cpp:289
|
||||
msgid "Credit"
|
||||
msgstr "Gutschriften"
|
||||
|
||||
#: ../../../ui.cpp:489
|
||||
#, c-format
|
||||
msgid "Open for %d blocks"
|
||||
msgstr "Offen für %d Blöcke"
|
||||
|
||||
#: ../../../ui.cpp:491
|
||||
#, c-format
|
||||
msgid "Open until %s"
|
||||
msgstr "Offen bis %s"
|
||||
|
||||
#: ../../../ui.cpp:497
|
||||
#, c-format
|
||||
msgid "%d/offline?"
|
||||
msgstr "%d/Offline?"
|
||||
|
||||
#: ../../../ui.cpp:499
|
||||
#, c-format
|
||||
msgid "%d/unconfirmed"
|
||||
msgstr "%d/nicht bestätigt"
|
||||
|
||||
#: ../../../ui.cpp:501
|
||||
#, c-format
|
||||
msgid "%d confirmations"
|
||||
msgstr "%d Bestätigungen"
|
||||
|
||||
#: ../../../ui.cpp:584
|
||||
msgid "Generated"
|
||||
msgstr "Erzeugt"
|
||||
|
||||
#: ../../../ui.cpp:592
|
||||
#, c-format
|
||||
msgid "Generated (%s matures in %d more blocks)"
|
||||
msgstr "Erzeugt (%s reifen nach %d weiteren Blöcken)"
|
||||
|
||||
#: ../../../ui.cpp:596
|
||||
msgid "Generated - Warning: This block was not received by any other nodes and will probably not be accepted!"
|
||||
msgstr "Erzeugt - Warnung: Dieser Block wurde von keinem anderen Teilnehmer empfangen und wird wahrscheinlich nicht akzeptiert werden!"
|
||||
|
||||
#: ../../../ui.cpp:600
|
||||
msgid "Generated (not accepted)"
|
||||
msgstr "Erzeugt (nicht akzeptiert)"
|
||||
|
||||
#: ../../../ui.cpp:610
|
||||
msgid "From: "
|
||||
msgstr "Von: "
|
||||
|
||||
#: ../../../ui.cpp:634
|
||||
msgid "From: unknown, Received with: "
|
||||
msgstr "Von: Unbekannt, Empfangen durch: "
|
||||
|
||||
#: ../../../ui.cpp:676
|
||||
msgid "Payment to yourself"
|
||||
msgstr "Überweisung an Sie selbst"
|
||||
|
||||
#: ../../../ui.cpp:713
|
||||
msgid "To: "
|
||||
msgstr "An: "
|
||||
|
||||
#: ../../../ui.cpp:1009
|
||||
msgid " Generating"
|
||||
msgstr " Erzeugen"
|
||||
|
||||
#: ../../../ui.cpp:1011
|
||||
msgid "(not connected)"
|
||||
msgstr "(nicht verbunden)"
|
||||
|
||||
#: ../../../ui.cpp:1014
|
||||
#, c-format
|
||||
msgid " %d connections %d blocks %d transactions"
|
||||
msgstr " %d Verbindungen %d Blöcke %d Überweisungen"
|
||||
|
||||
#: ../../../ui.cpp:1123
|
||||
#: ../../../ui.cpp:2351
|
||||
msgid "New Receiving Address"
|
||||
msgstr "&Neue Empfangs-Adresse"
|
||||
|
||||
#: ../../../ui.cpp:1124
|
||||
#: ../../../ui.cpp:2352
|
||||
msgid ""
|
||||
"It's good policy to use a new address for each payment you receive.\n"
|
||||
"\n"
|
||||
"Label"
|
||||
msgstr ""
|
||||
"Am besten verwenden Sie für jede Zahlung die Sie erhalten eine neue Adresse.\n"
|
||||
"\n"
|
||||
"Beschreibung"
|
||||
|
||||
#: ../../../ui.cpp:1193
|
||||
msgid "<b>Status:</b> "
|
||||
msgstr "<b>Status:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1198
|
||||
msgid ", has not been successfully broadcast yet"
|
||||
msgstr ", wurde noch nicht erfolgreich übertragen"
|
||||
|
||||
#: ../../../ui.cpp:1200
|
||||
#, c-format
|
||||
msgid ", broadcast through %d node"
|
||||
msgstr ", durch %d Teilnehmer übertragen"
|
||||
|
||||
#: ../../../ui.cpp:1202
|
||||
#, c-format
|
||||
msgid ", broadcast through %d nodes"
|
||||
msgstr ", durch %d Teilnehmer übertragen"
|
||||
|
||||
#: ../../../ui.cpp:1206
|
||||
msgid "<b>Date:</b> "
|
||||
msgstr "<b>Datum</b> "
|
||||
|
||||
#: ../../../ui.cpp:1214
|
||||
msgid "<b>Source:</b> Generated<br>"
|
||||
msgstr "<b>Quelle:</b>Erzeugt<br>"
|
||||
|
||||
#: ../../../ui.cpp:1220
|
||||
#: ../../../ui.cpp:1238
|
||||
msgid "<b>From:</b> "
|
||||
msgstr "<b>Von:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1238
|
||||
msgid "unknown"
|
||||
msgstr "Unbekannt"
|
||||
|
||||
#: ../../../ui.cpp:1239
|
||||
#: ../../../ui.cpp:1263
|
||||
#: ../../../ui.cpp:1322
|
||||
msgid "<b>To:</b> "
|
||||
msgstr "<b>An:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1242
|
||||
msgid " (yours, label: "
|
||||
msgstr " (Eigene, Beschreibung: "
|
||||
|
||||
#: ../../../ui.cpp:1244
|
||||
msgid " (yours)"
|
||||
msgstr " (Eigene)"
|
||||
|
||||
#: ../../../ui.cpp:1281
|
||||
#: ../../../ui.cpp:1293
|
||||
#: ../../../ui.cpp:1356
|
||||
msgid "<b>Credit:</b> "
|
||||
msgstr "<b>Gutschrift:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1283
|
||||
#, c-format
|
||||
msgid "(%s matures in %d more blocks)"
|
||||
msgstr "(%s reifen nach %d weiteren Blöcken)"
|
||||
|
||||
#: ../../../ui.cpp:1285
|
||||
msgid "(not accepted)"
|
||||
msgstr "(nicht akzeptiert)"
|
||||
|
||||
#: ../../../ui.cpp:1330
|
||||
#: ../../../ui.cpp:1353
|
||||
msgid "<b>Debit:</b> "
|
||||
msgstr "<b>Belastung:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1344
|
||||
msgid "<b>Transaction fee:</b> "
|
||||
msgstr "<b>Überweisungsgebühr:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1360
|
||||
msgid "<b>Net amount:</b> "
|
||||
msgstr "<b>Nettobetrag:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1367
|
||||
msgid "Message:"
|
||||
msgstr "Nachricht:"
|
||||
|
||||
#: ../../../ui.cpp:1370
|
||||
msgid "Generated coins must wait 120 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, it will change to \"not accepted\" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours."
|
||||
msgstr ""
|
||||
"Erzeugte Münzen müssen 120 Blöcke lang reifen. Als Sie diesen Block erzeugt haben, wurde er an alle Teilnehmer übertragen, damit er zur Block-Kette hinzugefügt werden kann. Falls der Block es nicht in die Block-Kette schafft, wird die Beschreibung zu \"nicht akzeptiert\" geändert, und Sie können die Münzen nicht ausgeben. Dies kann manchmal "
|
||||
"passieren, wenn Sie und ein anderer Teilnehmer annähernd zeitgleich einen Block erzeugen."
|
||||
|
||||
#: ../../../ui.cpp:1437
|
||||
msgid "Main"
|
||||
msgstr "Haupt"
|
||||
|
||||
#: ../../../ui.cpp:1442
|
||||
msgid "&Minimize on close"
|
||||
msgstr "Beim schließen &Minimieren"
|
||||
|
||||
#: ../../../ui.cpp:1595
|
||||
#, c-format
|
||||
msgid "version 0.%d.%d beta"
|
||||
msgstr "Version 0.%d.%d Beta"
|
||||
|
||||
#: ../../../ui.cpp:1681
|
||||
msgid "Will appear as \"From: Unknown\""
|
||||
msgstr "Wird als \"Von: Unbekannt\" erscheinen"
|
||||
|
||||
#: ../../../ui.cpp:1682
|
||||
msgid "Can't include a message when sending to a Bitcoin address"
|
||||
msgstr "Beim überweisen an eine Bitcoin-Adresse kann keine Nachricht angegeben werden."
|
||||
|
||||
#: ../../../ui.cpp:1735
|
||||
msgid "Error in amount "
|
||||
msgstr "Fehler in Betrag "
|
||||
|
||||
#: ../../../ui.cpp:1735
|
||||
#: ../../../ui.cpp:1740
|
||||
#: ../../../ui.cpp:1745
|
||||
#: ../../../ui.cpp:1771
|
||||
#: ../../../uibase.cpp:61
|
||||
msgid "Send Coins"
|
||||
msgstr "Überweisen"
|
||||
|
||||
#: ../../../ui.cpp:1740
|
||||
msgid "Amount exceeds your balance "
|
||||
msgstr "Der Betrag übersteigt Ihr Guthaben "
|
||||
|
||||
#: ../../../ui.cpp:1745
|
||||
msgid "Total exceeds your balance when the "
|
||||
msgstr "Der Betrag übersteigt Ihr Guthaben, wenn man die Überweisungsgebühr von "
|
||||
|
||||
#: ../../../ui.cpp:1745
|
||||
msgid " transaction fee is included "
|
||||
msgstr " berücksichtigt "
|
||||
|
||||
#: ../../../ui.cpp:1761
|
||||
msgid "Payment sent "
|
||||
msgstr "Zahlung überwiesen "
|
||||
|
||||
#: ../../../ui.cpp:1771
|
||||
msgid "Invalid address "
|
||||
msgstr "Ungültige Adresse "
|
||||
|
||||
#: ../../../ui.cpp:1825
|
||||
#, c-format
|
||||
msgid "Sending %s to %s"
|
||||
msgstr "Überweise %s an %s"
|
||||
|
||||
#: ../../../ui.cpp:1898
|
||||
#: ../../../ui.cpp:1931
|
||||
msgid "CANCELLED"
|
||||
msgstr "ANNULLIERT"
|
||||
|
||||
#: ../../../ui.cpp:1902
|
||||
msgid "Cancelled"
|
||||
msgstr "Annulliert"
|
||||
|
||||
#: ../../../ui.cpp:1904
|
||||
msgid "Transfer cancelled "
|
||||
msgstr "Überweisung annulliert "
|
||||
|
||||
#: ../../../ui.cpp:1957
|
||||
msgid "Error: "
|
||||
msgstr "Fehler: "
|
||||
|
||||
#: ../../../ui.cpp:1976
|
||||
msgid "Connecting..."
|
||||
msgstr "Verbinde..."
|
||||
|
||||
#: ../../../ui.cpp:1981
|
||||
msgid "Unable to connect"
|
||||
msgstr "Kann nicht verbinden"
|
||||
|
||||
#: ../../../ui.cpp:1986
|
||||
msgid "Requesting public key..."
|
||||
msgstr "Fordere öffentlichen Schlüssel an..."
|
||||
|
||||
#: ../../../ui.cpp:1998
|
||||
msgid "Received public key..."
|
||||
msgstr "Öffentlichen Schlüssel empfangen..."
|
||||
|
||||
#: ../../../ui.cpp:2010
|
||||
msgid "Transfer was not accepted"
|
||||
msgstr "Überweisung wurde nicht akzeptiert"
|
||||
|
||||
#: ../../../ui.cpp:2019
|
||||
msgid "Invalid response received"
|
||||
msgstr "Ungültige Antwort erhalten"
|
||||
|
||||
#: ../../../ui.cpp:2034
|
||||
msgid "Creating transaction..."
|
||||
msgstr "Erstelle Überweisung..."
|
||||
|
||||
#: ../../../ui.cpp:2046
|
||||
#, c-format
|
||||
msgid "This is an oversized transaction that requires a transaction fee of %s"
|
||||
msgstr "Die Überweisung ist sehr groß. Es wird eine Gebühr von %s erhoben."
|
||||
|
||||
#: ../../../ui.cpp:2048
|
||||
msgid "Transaction creation failed"
|
||||
msgstr "Überweisung konnte nicht erzeugt werden."
|
||||
|
||||
#: ../../../ui.cpp:2055
|
||||
msgid "Transaction aborted"
|
||||
msgstr "Überweisung abgebrochen"
|
||||
|
||||
#: ../../../ui.cpp:2063
|
||||
msgid "Lost connection, transaction cancelled"
|
||||
msgstr "Verbindung verloren, Überweisungsvorgang abgebrochen"
|
||||
|
||||
#: ../../../ui.cpp:2079
|
||||
msgid "Sending payment..."
|
||||
msgstr "Überweise Zahlung..."
|
||||
|
||||
#: ../../../ui.cpp:2085
|
||||
msgid "The transaction was rejected. This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here."
|
||||
msgstr "Die Überweisung wurde abgelehnt. Das kann passieren, wenn einige der Münzen in Ihrer Brieftasche bereits ausgegeben wurden, z.B. weil Sie eine Kopie der Brieftasche (wallet.dat) gemacht haben. Bitcoins, die mithilfe der Kopie ausgegeben wurden, sind in dieser Brieftasche noch nicht als ausgegeben markiert worden."
|
||||
|
||||
#: ../../../ui.cpp:2092
|
||||
msgid "Waiting for confirmation..."
|
||||
msgstr "Warte auf Bestätigung..."
|
||||
|
||||
#: ../../../ui.cpp:2110
|
||||
msgid ""
|
||||
"The payment was sent, but the recipient was unable to verify it.\n"
|
||||
"The transaction is recorded and will credit to the recipient,\n"
|
||||
"but the comment information will be blank."
|
||||
msgstr ""
|
||||
"Die Zahlung wurde überwiesen, aber der Empfänger konnte sie nicht bestätigen.\n"
|
||||
"Die Überweisung wurde gespeichert und wird dem Empfänger gutgeschrieben,\n"
|
||||
"aber die begleitende Nachricht wird nicht ankommen."
|
||||
|
||||
#: ../../../ui.cpp:2119
|
||||
msgid "Payment was sent, but an invalid response was received"
|
||||
msgstr "Die Zahlung wurde überwiesen, aber die Antwort war fehlerhaft"
|
||||
|
||||
#: ../../../ui.cpp:2125
|
||||
msgid "Payment completed"
|
||||
msgstr "Zahlung ausgeführt"
|
||||
|
||||
#: ../../../ui.cpp:2156
|
||||
#: ../../../ui.cpp:2302
|
||||
#: ../../../ui.cpp:2339
|
||||
msgid "Name"
|
||||
msgstr "Name"
|
||||
|
||||
#: ../../../ui.cpp:2157
|
||||
#: ../../../ui.cpp:2302
|
||||
#: ../../../ui.cpp:2339
|
||||
msgid "Address"
|
||||
msgstr "Adresse"
|
||||
|
||||
#: ../../../ui.cpp:2159
|
||||
#: ../../../ui.cpp:2314
|
||||
msgid "Label"
|
||||
msgstr "Beschreibung"
|
||||
|
||||
#: ../../../ui.cpp:2160
|
||||
#: ../../../uibase.cpp:908
|
||||
msgid "Bitcoin Address"
|
||||
msgstr "Bitcoin-Adresse"
|
||||
|
||||
#: ../../../ui.cpp:2284
|
||||
msgid "This is one of your own addresses for receiving payments and cannot be entered in the address book. "
|
||||
msgstr "Dies ist eine Ihrer eigenen Adressen für den Zahlungseingang und kann deshalb nicht in das Adressbuch übernommen werden. "
|
||||
|
||||
#: ../../../ui.cpp:2302
|
||||
#: ../../../ui.cpp:2308
|
||||
msgid "Edit Address"
|
||||
msgstr "Adresse bearbeiten"
|
||||
|
||||
#: ../../../ui.cpp:2314
|
||||
msgid "Edit Address Label"
|
||||
msgstr "Beschreibung der Adresse bearbeiten"
|
||||
|
||||
#: ../../../ui.cpp:2339
|
||||
#: ../../../ui.cpp:2345
|
||||
msgid "Add Address"
|
||||
msgstr "Adresse hinzufügen"
|
||||
|
||||
#: ../../../ui.cpp:2421
|
||||
msgid "Bitcoin"
|
||||
msgstr "Bitcoin"
|
||||
|
||||
#: ../../../ui.cpp:2423
|
||||
msgid "Bitcoin - Generating"
|
||||
msgstr "Bitcoin - Erzeuge"
|
||||
|
||||
#: ../../../ui.cpp:2425
|
||||
msgid "Bitcoin - (not connected)"
|
||||
msgstr "Bitcoin - (nicht verbunden)"
|
||||
|
||||
#: ../../../ui.cpp:2500
|
||||
msgid "&Open Bitcoin"
|
||||
msgstr "Bitcoin Ö&ffnen"
|
||||
|
||||
#: ../../../ui.cpp:2501
|
||||
msgid "O&ptions..."
|
||||
msgstr "O&ptionen..."
|
||||
|
||||
#: ../../../ui.cpp:2502
|
||||
#: ../../../uibase.cpp:34
|
||||
msgid "&Generate Coins"
|
||||
msgstr "Münzen Er&zeugen"
|
||||
|
||||
#: ../../../ui.cpp:2505
|
||||
#: ../../../uibase.cpp:27
|
||||
msgid "E&xit"
|
||||
msgstr "B&eenden"
|
||||
|
||||
#: ../../../uibase.cpp:30
|
||||
msgid "&File"
|
||||
msgstr "&Datei"
|
||||
|
||||
#: ../../../uibase.cpp:38
|
||||
msgid "&Your Receiving Addresses..."
|
||||
msgstr "&Ihre Empfangs-Adressen..."
|
||||
|
||||
#: ../../../uibase.cpp:42
|
||||
msgid "&Options..."
|
||||
msgstr "&Optionen..."
|
||||
|
||||
#: ../../../uibase.cpp:45
|
||||
msgid "&Settings"
|
||||
msgstr "&Einstellungen"
|
||||
|
||||
#: ../../../uibase.cpp:49
|
||||
msgid "&About..."
|
||||
msgstr "Ü&ber..."
|
||||
|
||||
#: ../../../uibase.cpp:52
|
||||
msgid "&Help"
|
||||
msgstr "&Hilfe"
|
||||
|
||||
#: ../../../uibase.cpp:62
|
||||
msgid "Address Book"
|
||||
msgstr "Adressbuch"
|
||||
|
||||
#: ../../../uibase.cpp:77
|
||||
msgid "Your Bitcoin Address:"
|
||||
msgstr "Ihre Bitcoin-Adresse:"
|
||||
|
||||
#: ../../../uibase.cpp:84
|
||||
msgid " &New... "
|
||||
msgstr " &Neu... "
|
||||
|
||||
#: ../../../uibase.cpp:87
|
||||
#: ../../../uibase.cpp:851
|
||||
#: ../../../uibase.cpp:954
|
||||
msgid " &Copy to Clipboard "
|
||||
msgstr " In die Zwischenablage &kopieren "
|
||||
|
||||
#: ../../../uibase.cpp:102
|
||||
msgid "Balance:"
|
||||
msgstr "Kontostand:"
|
||||
|
||||
#: ../../../uibase.cpp:121
|
||||
msgid " All"
|
||||
msgstr " Alle"
|
||||
|
||||
#: ../../../uibase.cpp:121
|
||||
msgid " Sent"
|
||||
msgstr " Überwiesen"
|
||||
|
||||
#: ../../../uibase.cpp:121
|
||||
msgid " Received"
|
||||
msgstr " Erhalten"
|
||||
|
||||
#: ../../../uibase.cpp:121
|
||||
msgid " In Progress"
|
||||
msgstr " In Bearbeitung"
|
||||
|
||||
#: ../../../uibase.cpp:142
|
||||
msgid "All Transactions"
|
||||
msgstr "Alle Überweisungen"
|
||||
|
||||
#: ../../../uibase.cpp:153
|
||||
msgid "Sent/Received"
|
||||
msgstr "Überwiesen/Erhalten"
|
||||
|
||||
#: ../../../uibase.cpp:164
|
||||
msgid "Sent"
|
||||
msgstr "Überwiesen"
|
||||
|
||||
#: ../../../uibase.cpp:175
|
||||
msgid "Received"
|
||||
msgstr "Erhalten"
|
||||
|
||||
#: ../../../uibase.cpp:318
|
||||
#: ../../../uibase.cpp:479
|
||||
#: ../../../uibase.cpp:580
|
||||
#: ../../../uibase.cpp:793
|
||||
#: ../../../uibase.cpp:854
|
||||
#: ../../../uibase.cpp:963
|
||||
#: ../../../uibase.cpp:1052
|
||||
msgid "OK"
|
||||
msgstr "OK"
|
||||
|
||||
#: ../../../uibase.cpp:361
|
||||
msgid "Optional transaction fee you give to the nodes that process your transactions."
|
||||
msgstr "Optionale Überweisungsgebühr, die Sie an den Teilnehmer entrichten, der Ihre Überweisungen bearbeitet."
|
||||
|
||||
#: ../../../uibase.cpp:370
|
||||
msgid "Transaction fee:"
|
||||
msgstr "Überweisungsgebühr:"
|
||||
|
||||
#: ../../../uibase.cpp:386
|
||||
msgid "&Limit coin generation to"
|
||||
msgstr "Erzeugung von Münzen auf"
|
||||
|
||||
#: ../../../uibase.cpp:393
|
||||
msgid "processors"
|
||||
msgstr "Prozessoren &beschränken"
|
||||
|
||||
#: ../../../uibase.cpp:399
|
||||
msgid "&Start Bitcoin on system startup"
|
||||
msgstr "Bitcoin beim &Systemstart ausführen"
|
||||
|
||||
#: ../../../uibase.cpp:403
|
||||
msgid "&Minimize to the tray instead of the taskbar"
|
||||
msgstr "In den Infobereich statt in die Taskleiste &minimieren"
|
||||
|
||||
#: ../../../uibase.cpp:407
|
||||
msgid "M&inimize to the tray on close"
|
||||
msgstr "Beim schließen in den Infobereich m&inimieren"
|
||||
|
||||
#: ../../../uibase.cpp:414
|
||||
msgid "&Connect through socks4 proxy: "
|
||||
msgstr "&Verbinden per Socks4-Proxy: "
|
||||
|
||||
#: ../../../uibase.cpp:426
|
||||
msgid "Proxy &IP:"
|
||||
msgstr "Proxy &IP:"
|
||||
|
||||
#: ../../../uibase.cpp:434
|
||||
msgid " &Port:"
|
||||
msgstr " &Port:"
|
||||
|
||||
#: ../../../uibase.cpp:456
|
||||
msgid "// [don't translate] Test panel 2 for future expansion"
|
||||
msgstr ""
|
||||
|
||||
#: ../../../uibase.cpp:460
|
||||
msgid "// [don't translate] Let's not start multiple pages until the first page is filled up"
|
||||
msgstr ""
|
||||
|
||||
#: ../../../uibase.cpp:482
|
||||
#: ../../../uibase.cpp:735
|
||||
#: ../../../uibase.cpp:798
|
||||
#: ../../../uibase.cpp:857
|
||||
#: ../../../uibase.cpp:966
|
||||
#: ../../../uibase.cpp:1055
|
||||
msgid "Cancel"
|
||||
msgstr "Abbrechen"
|
||||
|
||||
#: ../../../uibase.cpp:485
|
||||
msgid "&Apply"
|
||||
msgstr "&Anwenden"
|
||||
|
||||
#: ../../../uibase.cpp:546
|
||||
msgid "Bitcoin "
|
||||
msgstr "Bitcoin "
|
||||
|
||||
#: ../../../uibase.cpp:552
|
||||
msgid "version"
|
||||
msgstr "Version"
|
||||
|
||||
#: ../../../uibase.cpp:563
|
||||
msgid ""
|
||||
"Copyright (c) 2009-2010 Satoshi Nakamoto.\n"
|
||||
"\n"
|
||||
"This is experimental software.\n"
|
||||
"\n"
|
||||
"Distributed under the MIT/X11 software license, see the accompanying file \n"
|
||||
"license.txt or http://www.opensource.org/licenses/mit-license.php.\n"
|
||||
"\n"
|
||||
"This product includes software developed by the OpenSSL Project for use in the \n"
|
||||
"OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by \n"
|
||||
"Eric Young (eay@cryptsoft.com)."
|
||||
msgstr ""
|
||||
"Copyright (c) 2009-2010 Satoshi Nakamoto.\n"
|
||||
"\n"
|
||||
"Dies ist experimentelle Software.\n"
|
||||
"\n"
|
||||
"Lizensiert unter der MIT/X11 Software-Lizenz. Beachten Sie die beiliegende\n"
|
||||
"Datei license.txt oder http://www.opensource.org/licenses/mit-license.php.\n"
|
||||
"\n"
|
||||
"Dieses Produkt enthält Software, die vom OpenSSL-Projekt zur Nutzung im\n"
|
||||
"OpenSSL Toolkit (http://www.openssl.org/) geschrieben wurde sowie\n"
|
||||
"kryptographische Software von Eric Young (eay@cryptsoft.com)."
|
||||
|
||||
#: ../../../uibase.cpp:619
|
||||
msgid "Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJED9L) or IP address (e.g. 123.45.6.7)"
|
||||
msgstr "Geben Sie eine Bitcoin-Adresse (z.B. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJED9L) oder IP-Adresse (z.B. 123.45.6.7) ein"
|
||||
|
||||
#: ../../../uibase.cpp:633
|
||||
msgid "Pay &To:"
|
||||
msgstr "Überweisen &An:"
|
||||
|
||||
#: ../../../uibase.cpp:648
|
||||
msgid "&Paste"
|
||||
msgstr "&Einfügen"
|
||||
|
||||
#: ../../../uibase.cpp:651
|
||||
msgid " Address &Book..."
|
||||
msgstr " Address&buch..."
|
||||
|
||||
#: ../../../uibase.cpp:658
|
||||
msgid "&Amount:"
|
||||
msgstr "&Betrag:"
|
||||
|
||||
#: ../../../uibase.cpp:668
|
||||
msgid "T&ransfer:"
|
||||
msgstr "Ü&berweisung:"
|
||||
|
||||
#: ../../../uibase.cpp:674
|
||||
msgid " Standard"
|
||||
msgstr " Standard"
|
||||
|
||||
#: ../../../uibase.cpp:696
|
||||
msgid "&From:"
|
||||
msgstr "&Von:"
|
||||
|
||||
#: ../../../uibase.cpp:713
|
||||
msgid "&Message:"
|
||||
msgstr "&Nachricht:"
|
||||
|
||||
#: ../../../uibase.cpp:730
|
||||
msgid "&Send"
|
||||
msgstr "Ü&berweisen"
|
||||
|
||||
#: ../../../uibase.cpp:782
|
||||
msgid ""
|
||||
"\n"
|
||||
"\n"
|
||||
"Connecting..."
|
||||
msgstr ""
|
||||
"\n"
|
||||
"\n"
|
||||
"Verbinde..."
|
||||
|
||||
#: ../../../uibase.cpp:832
|
||||
msgid "These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. The highlighted address is displayed in the main window."
|
||||
msgstr "Dies sind Ihre Bitcoin-Adressen zum Empfang von Zahlungen. Sie sollten vielleicht jedem Überweisenden eine andere Adresse geben um nachvollziehen zu können von wem eine Zahlung stammt. Die markierte Adresse wird im Hauptfenster angezeigt."
|
||||
|
||||
#: ../../../uibase.cpp:845
|
||||
#: ../../../uibase.cpp:957
|
||||
msgid "&Edit..."
|
||||
msgstr "&Bearbeiten..."
|
||||
|
||||
#: ../../../uibase.cpp:848
|
||||
#: ../../../uibase.cpp:960
|
||||
msgid " &New Address... "
|
||||
msgstr " &Neue Adresse... "
|
||||
|
||||
#: ../../../uibase.cpp:920
|
||||
msgid "Sending"
|
||||
msgstr "Überweise"
|
||||
|
||||
#: ../../../uibase.cpp:928
|
||||
msgid "These are your Bitcoin addresses for receiving payments. You can give a different one to each sender to keep track of who is paying you. The highlighted address will be displayed in the main window."
|
||||
msgstr "Dies sind Ihre Bitcoin-Adressen zum Empfang von Zahlungen. Sie können jedem Überweisenden eine andere Adresse geben um nachvollziehen zu können von wem eine Zahlung stammt. Die markierte Adresse wird im Hauptfenster angezeigt."
|
||||
|
||||
#: ../../../uibase.cpp:941
|
||||
msgid "Receiving"
|
||||
msgstr "Empfange"
|
||||
|
||||
#: ../../../uibase.cpp:951
|
||||
msgid "&Delete"
|
||||
msgstr "&Löschen"
|
||||
|
||||
#: ../../../uibase.h:150
|
||||
msgid "Transaction Details"
|
||||
msgstr "Überweisungsdetails"
|
||||
|
||||
#: ../../../uibase.h:203
|
||||
msgid "Options"
|
||||
msgstr "Optionen"
|
||||
|
||||
#: ../../../uibase.h:231
|
||||
msgid "About Bitcoin"
|
||||
msgstr "Über Bitcoin"
|
||||
|
||||
#: ../../../uibase.h:341
|
||||
msgid "Your Bitcoin Addresses"
|
||||
msgstr "Ihre Bitcoin-Adressen"
|
||||
@@ -1,807 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-05-26 22:02-0000\n"
|
||||
"PO-Revision-Date: 2010-05-27 13:01+0100\n"
|
||||
"Last-Translator: Franco Cimatti <hostfat@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Poedit-KeywordsList: _;gettext;gettext_noop\n"
|
||||
"X-Poedit-Basepath: .\n"
|
||||
"X-Poedit-SearchPath-0: ../../..\n"
|
||||
|
||||
#: ../../../init.cpp:342
|
||||
msgid "Usage: bitcoin [options]"
|
||||
msgstr "Uso: bitcoin [options]"
|
||||
|
||||
#: ../../../init.cpp:343
|
||||
msgid "Options:\n"
|
||||
msgstr "Opzioni:\n"
|
||||
|
||||
#: ../../../init.cpp:344
|
||||
msgid "Generate coins\n"
|
||||
msgstr "Genera monete\n"
|
||||
|
||||
#: ../../../init.cpp:345
|
||||
msgid "Don't generate coins\n"
|
||||
msgstr "Non generare monete\n"
|
||||
|
||||
#: ../../../init.cpp:346
|
||||
msgid "Start minimized\n"
|
||||
msgstr "Avvia minimizzato\n"
|
||||
|
||||
#: ../../../init.cpp:347
|
||||
msgid "Specify data directory\n"
|
||||
msgstr "Indica la cartella per i dati\n"
|
||||
|
||||
#: ../../../init.cpp:348
|
||||
msgid "Connect through socks4 proxy\n"
|
||||
msgstr "Connetti attraverso proxy socks4\n"
|
||||
|
||||
#: ../../../init.cpp:349
|
||||
msgid "Add a node to connect to\n"
|
||||
msgstr "Aggiungi un nodo a cui connetterti\n"
|
||||
|
||||
#: ../../../init.cpp:350
|
||||
msgid "Connect only to the specified node\n"
|
||||
msgstr "Impossibile connettersi al nodo specificato\n"
|
||||
|
||||
#: ../../../init.cpp:351
|
||||
msgid "This help message\n"
|
||||
msgstr "Questo messaggio di aiuto\n"
|
||||
|
||||
#: ../../../init.cpp:455
|
||||
msgid "Error loading addr.dat \n"
|
||||
msgstr "Errore nel caricare addr.dat \n"
|
||||
|
||||
#: ../../../init.cpp:461
|
||||
msgid "Error loading blkindex.dat \n"
|
||||
msgstr "Errore nel caricare blkindex.dat \n"
|
||||
|
||||
#: ../../../init.cpp:468
|
||||
msgid "Error loading wallet.dat \n"
|
||||
msgstr "Errore nel caricare wallet.dat \n"
|
||||
|
||||
#: ../../../init.cpp:536
|
||||
msgid "Invalid -proxy address"
|
||||
msgstr "Indirizzo proxy non valido"
|
||||
|
||||
#: ../../../init.cpp:629
|
||||
msgid "Program has crashed and will terminate. "
|
||||
msgstr "Il programma è crashato e sarà terminato. "
|
||||
|
||||
#: ../../../main.cpp:1465
|
||||
msgid "Warning: Disk space is low "
|
||||
msgstr "Attenzione: c'è poco spazio sul disco "
|
||||
|
||||
#: ../../../main.cpp:2994
|
||||
#, c-format
|
||||
msgid "Error: This is an oversized transaction that requires a transaction fee of %s "
|
||||
msgstr "Errore: Questa è un operazione fuoriscala che richiede un sovrapprezzo di %s "
|
||||
|
||||
#: ../../../main.cpp:2996
|
||||
msgid "Error: Transaction creation failed "
|
||||
msgstr "Errore: La creazione del trasferimento è fallito "
|
||||
|
||||
#: ../../../main.cpp:3001
|
||||
#: ../../../ui.cpp:1761
|
||||
#: ../../../ui.cpp:1763
|
||||
#: ../../../ui.cpp:1904
|
||||
#: ../../../ui.cpp:2053
|
||||
msgid "Sending..."
|
||||
msgstr "Inviando..."
|
||||
|
||||
#: ../../../main.cpp:3005
|
||||
msgid "Error: The transaction was rejected. This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here."
|
||||
msgstr "Errore: Il trasferimento è stato respinto. Questo può accadere se alcune delle monete nel tuo portafoglio erano già state spese, o anche se hai usato una copia di wallet.dat e le monete erano già state spese nella copia originale ma non segnate in quest'ultima."
|
||||
|
||||
#: ../../../main.cpp:3017
|
||||
msgid "Invalid amount"
|
||||
msgstr "Quantità non valida"
|
||||
|
||||
#: ../../../main.cpp:3019
|
||||
#: ../../../ui.cpp:1971
|
||||
#: ../../../ui.cpp:2038
|
||||
msgid "Insufficient funds"
|
||||
msgstr "Fondi insufficenti"
|
||||
|
||||
#: ../../../main.cpp:3024
|
||||
msgid "Invalid bitcoin address"
|
||||
msgstr "Indirizzo bitcoin non valido"
|
||||
|
||||
#: ../../../ui.cpp:189
|
||||
#, c-format
|
||||
msgid "This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee?"
|
||||
msgstr "Questo trasferimento è oltre le dimensioni massime. Puoi comunque inviarlo per un costo aggiuntivo di %s, che andrà ai nodi che effettueranno il processo della tua operazione e che supportano il network. Vuoi pagare il costo aggiuntivo?"
|
||||
|
||||
#: ../../../ui.cpp:285
|
||||
msgid "Status"
|
||||
msgstr "Stato"
|
||||
|
||||
#: ../../../ui.cpp:286
|
||||
msgid "Date"
|
||||
msgstr "Data"
|
||||
|
||||
#: ../../../ui.cpp:287
|
||||
msgid "Description"
|
||||
msgstr "Descrizione"
|
||||
|
||||
#: ../../../ui.cpp:288
|
||||
msgid "Debit"
|
||||
msgstr "Debito"
|
||||
|
||||
#: ../../../ui.cpp:289
|
||||
msgid "Credit"
|
||||
msgstr "Credito"
|
||||
|
||||
#: ../../../ui.cpp:489
|
||||
#, c-format
|
||||
msgid "Open for %d blocks"
|
||||
msgstr "Aperto per %d blocchi"
|
||||
|
||||
#: ../../../ui.cpp:491
|
||||
#, c-format
|
||||
msgid "Open until %s"
|
||||
msgstr "Aperto fino a %s"
|
||||
|
||||
#: ../../../ui.cpp:497
|
||||
#, c-format
|
||||
msgid "%d/offline?"
|
||||
msgstr "%d/fuorilinea?"
|
||||
|
||||
#: ../../../ui.cpp:499
|
||||
#, c-format
|
||||
msgid "%d/unconfirmed"
|
||||
msgstr "%d/non confermato"
|
||||
|
||||
#: ../../../ui.cpp:501
|
||||
#, c-format
|
||||
msgid "%d confirmations"
|
||||
msgstr "%d conferme"
|
||||
|
||||
#: ../../../ui.cpp:584
|
||||
msgid "Generated"
|
||||
msgstr "Generato"
|
||||
|
||||
#: ../../../ui.cpp:592
|
||||
#, c-format
|
||||
msgid "Generated (%s matures in %d more blocks)"
|
||||
msgstr "Generate (%s matureranno in %d altri blocchi)"
|
||||
|
||||
#: ../../../ui.cpp:596
|
||||
msgid "Generated - Warning: This block was not received by any other nodes and will probably not be accepted!"
|
||||
msgstr "Generato - Attenzione: Questo blocco non è stato ricevuto da nessun altro nodo e probabilmente non sarà accettato!"
|
||||
|
||||
#: ../../../ui.cpp:600
|
||||
msgid "Generated (not accepted)"
|
||||
msgstr "Generato (non accettato)"
|
||||
|
||||
#: ../../../ui.cpp:610
|
||||
msgid "From: "
|
||||
msgstr "Da: "
|
||||
|
||||
#: ../../../ui.cpp:634
|
||||
msgid "From: unknown, Received with: "
|
||||
msgstr "Da: sconosciuto, Ricevuto con: "
|
||||
|
||||
#: ../../../ui.cpp:676
|
||||
msgid "Payment to yourself"
|
||||
msgstr "Pagamento a te stesso"
|
||||
|
||||
#: ../../../ui.cpp:713
|
||||
msgid "To: "
|
||||
msgstr "A: "
|
||||
|
||||
#: ../../../ui.cpp:1009
|
||||
msgid " Generating"
|
||||
msgstr " Generando"
|
||||
|
||||
#: ../../../ui.cpp:1011
|
||||
msgid "(not connected)"
|
||||
msgstr "(non connesso)"
|
||||
|
||||
#: ../../../ui.cpp:1014
|
||||
#, c-format
|
||||
msgid " %d connections %d blocks %d transactions"
|
||||
msgstr " %d connessioni %d blocchi %d trasferimenti"
|
||||
|
||||
#: ../../../ui.cpp:1123
|
||||
#: ../../../ui.cpp:2351
|
||||
msgid "New Receiving Address"
|
||||
msgstr "Nuovo indirizzo ricevente"
|
||||
|
||||
#: ../../../ui.cpp:1124
|
||||
#: ../../../ui.cpp:2352
|
||||
msgid ""
|
||||
"It's good policy to use a new address for each payment you receive.\n"
|
||||
"\n"
|
||||
"Label"
|
||||
msgstr ""
|
||||
"E' una buona abitudine usare un nuovo indirizzo per ogni pagamento che ricevuto.\n"
|
||||
"\n"
|
||||
"Label"
|
||||
|
||||
#: ../../../ui.cpp:1193
|
||||
msgid "<b>Status:</b> "
|
||||
msgstr "<b>Stato:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1198
|
||||
msgid ", has not been successfully broadcast yet"
|
||||
msgstr ", non è ancora stato diffuso correttamente"
|
||||
|
||||
#: ../../../ui.cpp:1200
|
||||
#, c-format
|
||||
msgid ", broadcast through %d node"
|
||||
msgstr ", diffusione attraverso %d nodo"
|
||||
|
||||
#: ../../../ui.cpp:1202
|
||||
#, c-format
|
||||
msgid ", broadcast through %d nodes"
|
||||
msgstr ", diffusione attraverso %d nodi"
|
||||
|
||||
#: ../../../ui.cpp:1206
|
||||
msgid "<b>Date:</b> "
|
||||
msgstr "<b>Data:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1214
|
||||
msgid "<b>Source:</b> Generated<br>"
|
||||
msgstr "<b>Sorgente:</b> Generato<br>"
|
||||
|
||||
#: ../../../ui.cpp:1220
|
||||
#: ../../../ui.cpp:1238
|
||||
msgid "<b>From:</b> "
|
||||
msgstr "<b>Da:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1238
|
||||
msgid "unknown"
|
||||
msgstr "sconoscuto"
|
||||
|
||||
#: ../../../ui.cpp:1239
|
||||
#: ../../../ui.cpp:1263
|
||||
#: ../../../ui.cpp:1322
|
||||
msgid "<b>To:</b> "
|
||||
msgstr "<b>A:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1242
|
||||
msgid " (yours, label: "
|
||||
msgstr " (vostro, label: "
|
||||
|
||||
#: ../../../ui.cpp:1244
|
||||
msgid " (yours)"
|
||||
msgstr " (vostro)"
|
||||
|
||||
#: ../../../ui.cpp:1281
|
||||
#: ../../../ui.cpp:1293
|
||||
#: ../../../ui.cpp:1356
|
||||
msgid "<b>Credit:</b> "
|
||||
msgstr "<b>Credito:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1283
|
||||
#, c-format
|
||||
msgid "(%s matures in %d more blocks)"
|
||||
msgstr "(%s matureranno in %d altri blocchi)"
|
||||
|
||||
#: ../../../ui.cpp:1285
|
||||
msgid "(not accepted)"
|
||||
msgstr "(non accettato)"
|
||||
|
||||
#: ../../../ui.cpp:1330
|
||||
#: ../../../ui.cpp:1353
|
||||
msgid "<b>Debit:</b> "
|
||||
msgstr "<b>Debito:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1344
|
||||
msgid "<b>Transaction fee:</b> "
|
||||
msgstr "<b>Trasferimento costo:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1360
|
||||
msgid "<b>Net amount:</b> "
|
||||
msgstr "<b>Quantità del network:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1367
|
||||
msgid "Message:"
|
||||
msgstr "Messaggio:"
|
||||
|
||||
#: ../../../ui.cpp:1370
|
||||
msgid "Generated coins must wait 120 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, it will change to \"not accepted\" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours."
|
||||
msgstr "Le monete generate devono aspettare 120 blocchi prima di poter essere spese. Quando hai generato questo blocco, è stato diffuso sul network per essere aggiunto alla catena dei blocchi. Se fallirà l'entrata nella catena, cambierà in \"non accettato\" e non spendibile. Questo può capitare se un altro nodo genera un blocco pochi secondi prima del tuo."
|
||||
|
||||
#: ../../../ui.cpp:1437
|
||||
msgid "Main"
|
||||
msgstr "Principale"
|
||||
|
||||
#: ../../../ui.cpp:1442
|
||||
msgid "&Minimize on close"
|
||||
msgstr "&Minimizza se chiuso"
|
||||
|
||||
#: ../../../ui.cpp:1595
|
||||
#, c-format
|
||||
msgid "version 0.%d.%d beta"
|
||||
msgstr "versione 0.%d.%d beta"
|
||||
|
||||
#: ../../../ui.cpp:1681
|
||||
msgid "Will appear as \"From: Unknown\""
|
||||
msgstr "Apparirà come \"Da: Sconosciuto\""
|
||||
|
||||
#: ../../../ui.cpp:1682
|
||||
msgid "Can't include a message when sending to a Bitcoin address"
|
||||
msgstr "Non si può includere un messaggio quando si invia attraverso l'indirizzo Bitcoin"
|
||||
|
||||
#: ../../../ui.cpp:1735
|
||||
msgid "Error in amount "
|
||||
msgstr "Errore nell'ammontare "
|
||||
|
||||
#: ../../../ui.cpp:1735
|
||||
#: ../../../ui.cpp:1740
|
||||
#: ../../../ui.cpp:1745
|
||||
#: ../../../ui.cpp:1771
|
||||
#: ../../../uibase.cpp:61
|
||||
msgid "Send Coins"
|
||||
msgstr "Invia monete"
|
||||
|
||||
#: ../../../ui.cpp:1740
|
||||
msgid "Amount exceeds your balance "
|
||||
msgstr "L'ammontare è andato oltre i tuoi capitali "
|
||||
|
||||
#: ../../../ui.cpp:1745
|
||||
msgid "Total exceeds your balance when the "
|
||||
msgstr "Il totale va oltre i tuoi capitali quando il "
|
||||
|
||||
#: ../../../ui.cpp:1745
|
||||
msgid " transaction fee is included "
|
||||
msgstr " il costo trasferimento è incluso "
|
||||
|
||||
#: ../../../ui.cpp:1761
|
||||
msgid "Payment sent "
|
||||
msgstr "Pagamento inviato "
|
||||
|
||||
#: ../../../ui.cpp:1771
|
||||
msgid "Invalid address "
|
||||
msgstr "Indirizzo non valido "
|
||||
|
||||
#: ../../../ui.cpp:1825
|
||||
#, c-format
|
||||
msgid "Sending %s to %s"
|
||||
msgstr "Inviando %s a %s"
|
||||
|
||||
#: ../../../ui.cpp:1898
|
||||
#: ../../../ui.cpp:1931
|
||||
msgid "CANCELLED"
|
||||
msgstr "CANCELLATO"
|
||||
|
||||
#: ../../../ui.cpp:1902
|
||||
msgid "Cancelled"
|
||||
msgstr "Cancellato"
|
||||
|
||||
#: ../../../ui.cpp:1904
|
||||
msgid "Transfer cancelled "
|
||||
msgstr "Operazione cancellata "
|
||||
|
||||
#: ../../../ui.cpp:1957
|
||||
msgid "Error: "
|
||||
msgstr "Errore: "
|
||||
|
||||
#: ../../../ui.cpp:1976
|
||||
msgid "Connecting..."
|
||||
msgstr "Connessione in corso..."
|
||||
|
||||
#: ../../../ui.cpp:1981
|
||||
msgid "Unable to connect"
|
||||
msgstr "Impossibile connettersi"
|
||||
|
||||
#: ../../../ui.cpp:1986
|
||||
msgid "Requesting public key..."
|
||||
msgstr "Richiesta chiave pubblica..."
|
||||
|
||||
#: ../../../ui.cpp:1998
|
||||
msgid "Received public key..."
|
||||
msgstr "Ricezione chiave pubblica..."
|
||||
|
||||
#: ../../../ui.cpp:2010
|
||||
msgid "Transfer was not accepted"
|
||||
msgstr "Trasferimento non accettato"
|
||||
|
||||
#: ../../../ui.cpp:2019
|
||||
msgid "Invalid response received"
|
||||
msgstr "Risposta non valida ricevuta"
|
||||
|
||||
#: ../../../ui.cpp:2034
|
||||
msgid "Creating transaction..."
|
||||
msgstr "Creazione trasferimento..."
|
||||
|
||||
#: ../../../ui.cpp:2046
|
||||
#, c-format
|
||||
msgid "This is an oversized transaction that requires a transaction fee of %s"
|
||||
msgstr "Questo è un trasferimento fuoriscala che richiede un costo aggiuntivo di %s"
|
||||
|
||||
#: ../../../ui.cpp:2048
|
||||
msgid "Transaction creation failed"
|
||||
msgstr "Creazione trasferimento fallita"
|
||||
|
||||
#: ../../../ui.cpp:2055
|
||||
msgid "Transaction aborted"
|
||||
msgstr "Trasferimento bloccato"
|
||||
|
||||
#: ../../../ui.cpp:2063
|
||||
msgid "Lost connection, transaction cancelled"
|
||||
msgstr "Connessione persa, trasferimento cancellato"
|
||||
|
||||
#: ../../../ui.cpp:2079
|
||||
msgid "Sending payment..."
|
||||
msgstr "Inviando pagamento..."
|
||||
|
||||
#: ../../../ui.cpp:2085
|
||||
msgid "The transaction was rejected. This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here."
|
||||
msgstr "Il trasferimento è stato respinto. Questo può accadere se alcune delle monete nel tuo portafoglio erano già state spese, o anche se hai usato una copia di wallet.dat e le monete erano già state spese nella copia originale ma non segnate in quest'ultima."
|
||||
|
||||
#: ../../../ui.cpp:2092
|
||||
msgid "Waiting for confirmation..."
|
||||
msgstr "In attesa di conferma..."
|
||||
|
||||
#: ../../../ui.cpp:2110
|
||||
msgid ""
|
||||
"The payment was sent, but the recipient was unable to verify it.\n"
|
||||
"The transaction is recorded and will credit to the recipient,\n"
|
||||
"but the comment information will be blank."
|
||||
msgstr ""
|
||||
"Il pagamento è inviato, ma il ricevente non è stato in grado di verificarlo.\n"
|
||||
"Il trasferimento è registrato e costerà sarà accreditato al ricevente,\n"
|
||||
"ma il commento verrà mostrato come vuoto."
|
||||
|
||||
#: ../../../ui.cpp:2119
|
||||
msgid "Payment was sent, but an invalid response was received"
|
||||
msgstr "Il pagamento è stato inviato, ma è arrivata un risposta invalida"
|
||||
|
||||
#: ../../../ui.cpp:2125
|
||||
msgid "Payment completed"
|
||||
msgstr "Pagamento completato"
|
||||
|
||||
#: ../../../ui.cpp:2156
|
||||
#: ../../../ui.cpp:2302
|
||||
#: ../../../ui.cpp:2339
|
||||
msgid "Name"
|
||||
msgstr "Nome"
|
||||
|
||||
#: ../../../ui.cpp:2157
|
||||
#: ../../../ui.cpp:2302
|
||||
#: ../../../ui.cpp:2339
|
||||
msgid "Address"
|
||||
msgstr "Indirizzo"
|
||||
|
||||
#: ../../../ui.cpp:2159
|
||||
#: ../../../ui.cpp:2314
|
||||
msgid "Label"
|
||||
msgstr "Label"
|
||||
|
||||
#: ../../../ui.cpp:2160
|
||||
#: ../../../uibase.cpp:908
|
||||
msgid "Bitcoin Address"
|
||||
msgstr "Indirizzo Bitcoin"
|
||||
|
||||
#: ../../../ui.cpp:2284
|
||||
msgid "This is one of your own addresses for receiving payments and cannot be entered in the address book. "
|
||||
msgstr "Questo qui è uno dei tuoi indirizzi personali per ricevere pagamenti e non può essere inserito nella rubrica indirizzi. "
|
||||
|
||||
#: ../../../ui.cpp:2302
|
||||
#: ../../../ui.cpp:2308
|
||||
msgid "Edit Address"
|
||||
msgstr "Modifica indirizzo"
|
||||
|
||||
#: ../../../ui.cpp:2314
|
||||
msgid "Edit Address Label"
|
||||
msgstr "Modifica spazio indirizzo"
|
||||
|
||||
#: ../../../ui.cpp:2339
|
||||
#: ../../../ui.cpp:2345
|
||||
msgid "Add Address"
|
||||
msgstr "Aggiungi indirizzo"
|
||||
|
||||
#: ../../../ui.cpp:2421
|
||||
msgid "Bitcoin"
|
||||
msgstr "Bitcoin"
|
||||
|
||||
#: ../../../ui.cpp:2423
|
||||
msgid "Bitcoin - Generating"
|
||||
msgstr "Bitcoin - Generando"
|
||||
|
||||
#: ../../../ui.cpp:2425
|
||||
msgid "Bitcoin - (not connected)"
|
||||
msgstr "Bitcoin - (non connesso)"
|
||||
|
||||
#: ../../../ui.cpp:2500
|
||||
msgid "&Open Bitcoin"
|
||||
msgstr "&Apri Bitcoin"
|
||||
|
||||
#: ../../../ui.cpp:2501
|
||||
msgid "O&ptions..."
|
||||
msgstr "O&pzioni..."
|
||||
|
||||
#: ../../../ui.cpp:2502
|
||||
#: ../../../uibase.cpp:34
|
||||
msgid "&Generate Coins"
|
||||
msgstr "&Genera monete"
|
||||
|
||||
#: ../../../ui.cpp:2505
|
||||
#: ../../../uibase.cpp:27
|
||||
msgid "E&xit"
|
||||
msgstr "E&sci"
|
||||
|
||||
#: ../../../uibase.cpp:30
|
||||
msgid "&File"
|
||||
msgstr "&File"
|
||||
|
||||
#: ../../../uibase.cpp:38
|
||||
msgid "&Your Receiving Addresses..."
|
||||
msgstr "&Il tuo indirizzo di ricezione..."
|
||||
|
||||
#: ../../../uibase.cpp:42
|
||||
msgid "&Options..."
|
||||
msgstr "&Opzioni..."
|
||||
|
||||
#: ../../../uibase.cpp:45
|
||||
msgid "&Settings"
|
||||
msgstr "I&mpostazioni"
|
||||
|
||||
#: ../../../uibase.cpp:49
|
||||
msgid "&About..."
|
||||
msgstr "&Info..."
|
||||
|
||||
#: ../../../uibase.cpp:52
|
||||
msgid "&Help"
|
||||
msgstr "&Aiuto"
|
||||
|
||||
#: ../../../uibase.cpp:62
|
||||
msgid "Address Book"
|
||||
msgstr "Rubrica indirizzi"
|
||||
|
||||
#: ../../../uibase.cpp:77
|
||||
msgid "Your Bitcoin Address:"
|
||||
msgstr "Il tuo indirizzo Bitcoin:"
|
||||
|
||||
#: ../../../uibase.cpp:84
|
||||
msgid " &New... "
|
||||
msgstr " &Nuovo... "
|
||||
|
||||
#: ../../../uibase.cpp:87
|
||||
#: ../../../uibase.cpp:851
|
||||
#: ../../../uibase.cpp:954
|
||||
msgid " &Copy to Clipboard "
|
||||
msgstr " &Copia nella Clipboard "
|
||||
|
||||
#: ../../../uibase.cpp:102
|
||||
msgid "Balance:"
|
||||
msgstr "Capitali:"
|
||||
|
||||
#: ../../../uibase.cpp:121
|
||||
msgid " All"
|
||||
msgstr " Tutte"
|
||||
|
||||
#: ../../../uibase.cpp:121
|
||||
msgid " Sent"
|
||||
msgstr " Inviato"
|
||||
|
||||
#: ../../../uibase.cpp:121
|
||||
msgid " Received"
|
||||
msgstr " Ricevuto"
|
||||
|
||||
#: ../../../uibase.cpp:121
|
||||
msgid " In Progress"
|
||||
msgstr " In lavorazione"
|
||||
|
||||
#: ../../../uibase.cpp:142
|
||||
msgid "All Transactions"
|
||||
msgstr "Tutte le operazioni"
|
||||
|
||||
#: ../../../uibase.cpp:153
|
||||
msgid "Sent/Received"
|
||||
msgstr "Inviato/Ricevuto"
|
||||
|
||||
#: ../../../uibase.cpp:164
|
||||
msgid "Sent"
|
||||
msgstr "Inviato"
|
||||
|
||||
#: ../../../uibase.cpp:175
|
||||
msgid "Received"
|
||||
msgstr "Ricevuto"
|
||||
|
||||
#: ../../../uibase.cpp:318
|
||||
#: ../../../uibase.cpp:479
|
||||
#: ../../../uibase.cpp:580
|
||||
#: ../../../uibase.cpp:793
|
||||
#: ../../../uibase.cpp:854
|
||||
#: ../../../uibase.cpp:963
|
||||
#: ../../../uibase.cpp:1052
|
||||
msgid "OK"
|
||||
msgstr "OK"
|
||||
|
||||
#: ../../../uibase.cpp:361
|
||||
msgid "Optional transaction fee you give to the nodes that process your transactions."
|
||||
msgstr "Costo aggiuntivo opzionale che tu dai ai nodi che realizzano i tuoi trasferimenti"
|
||||
|
||||
#: ../../../uibase.cpp:370
|
||||
msgid "Transaction fee:"
|
||||
msgstr "Costo trasferimento:"
|
||||
|
||||
#: ../../../uibase.cpp:386
|
||||
msgid "&Limit coin generation to"
|
||||
msgstr "&Limita la generazione moneta a"
|
||||
|
||||
#: ../../../uibase.cpp:393
|
||||
msgid "processors"
|
||||
msgstr "processori"
|
||||
|
||||
#: ../../../uibase.cpp:399
|
||||
msgid "&Start Bitcoin on system startup"
|
||||
msgstr "A&vvia Bitcoin all'avvio del sistema"
|
||||
|
||||
#: ../../../uibase.cpp:403
|
||||
msgid "&Minimize to the tray instead of the taskbar"
|
||||
msgstr "&Minimizza nella tray invece che nella barra"
|
||||
|
||||
#: ../../../uibase.cpp:407
|
||||
msgid "M&inimize to the tray on close"
|
||||
msgstr "M&inimizza nella tray alla chiusura"
|
||||
|
||||
#: ../../../uibase.cpp:414
|
||||
msgid "&Connect through socks4 proxy: "
|
||||
msgstr "%Connesso attraverso proxy socks4: "
|
||||
|
||||
#: ../../../uibase.cpp:426
|
||||
msgid "Proxy &IP:"
|
||||
msgstr "Proxy &IP:"
|
||||
|
||||
#: ../../../uibase.cpp:434
|
||||
msgid " &Port:"
|
||||
msgstr " &Porta:"
|
||||
|
||||
#: ../../../uibase.cpp:456
|
||||
msgid "// [don't translate] Test panel 2 for future expansion"
|
||||
msgstr ""
|
||||
|
||||
#: ../../../uibase.cpp:460
|
||||
msgid "// [don't translate] Let's not start multiple pages until the first page is filled up"
|
||||
msgstr ""
|
||||
|
||||
#: ../../../uibase.cpp:482
|
||||
#: ../../../uibase.cpp:735
|
||||
#: ../../../uibase.cpp:798
|
||||
#: ../../../uibase.cpp:857
|
||||
#: ../../../uibase.cpp:966
|
||||
#: ../../../uibase.cpp:1055
|
||||
msgid "Cancel"
|
||||
msgstr "Cancella"
|
||||
|
||||
#: ../../../uibase.cpp:485
|
||||
msgid "&Apply"
|
||||
msgstr "&Accetta"
|
||||
|
||||
#: ../../../uibase.cpp:546
|
||||
msgid "Bitcoin "
|
||||
msgstr "Bitcoin "
|
||||
|
||||
#: ../../../uibase.cpp:552
|
||||
msgid "version"
|
||||
msgstr "versione"
|
||||
|
||||
#: ../../../uibase.cpp:563
|
||||
msgid ""
|
||||
"Copyright (c) 2009-2010 Satoshi Nakamoto.\n"
|
||||
"\n"
|
||||
"This is experimental software.\n"
|
||||
"\n"
|
||||
"Distributed under the MIT/X11 software license, see the accompanying file \n"
|
||||
"license.txt or http://www.opensource.org/licenses/mit-license.php.\n"
|
||||
"\n"
|
||||
"This product includes software developed by the OpenSSL Project for use in the \n"
|
||||
"OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by \n"
|
||||
"Eric Young (eay@cryptsoft.com)."
|
||||
msgstr ""
|
||||
"Copyright (c) 2009-2010 Satoshi Nakamoto.\n"
|
||||
"\n"
|
||||
"Questo è un software sperimentale.\n"
|
||||
"\n"
|
||||
"Distribuito sotto la licenza software MIT/X11, guarda il file license.txt\n"
|
||||
"incluso oppure su http://www.opensource.org/licenses/mit-license.php.\n"
|
||||
"\n"
|
||||
"Questo prodoto include software sviluppato dal progetto OpenSSL per\n"
|
||||
"l'uso del (http://www.openssl.org/) e il software criptografico scritto\n"
|
||||
"da Eric Young (eay@cryptsoft.com)."
|
||||
|
||||
#: ../../../uibase.cpp:619
|
||||
msgid "Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJED9L) or IP address (e.g. 123.45.6.7)"
|
||||
msgstr "Inserisci un indirizzo Bitcoin (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJED9L) o un indirizzo IP (e.g. 123.45.6.7)"
|
||||
|
||||
#: ../../../uibase.cpp:633
|
||||
msgid "Pay &To:"
|
||||
msgstr "Paga %a:"
|
||||
|
||||
#: ../../../uibase.cpp:648
|
||||
msgid "&Paste"
|
||||
msgstr "&Incolla"
|
||||
|
||||
#: ../../../uibase.cpp:651
|
||||
msgid " Address &Book..."
|
||||
msgstr " &Rubrica degli indirizzi..."
|
||||
|
||||
#: ../../../uibase.cpp:658
|
||||
msgid "&Amount:"
|
||||
msgstr "&Quantità"
|
||||
|
||||
#: ../../../uibase.cpp:668
|
||||
msgid "T&ransfer:"
|
||||
msgstr "T&rasferimento:"
|
||||
|
||||
#: ../../../uibase.cpp:674
|
||||
msgid " Standard"
|
||||
msgstr " Standard"
|
||||
|
||||
#: ../../../uibase.cpp:696
|
||||
msgid "&From:"
|
||||
msgstr "&Proveniente da:"
|
||||
|
||||
#: ../../../uibase.cpp:713
|
||||
msgid "&Message:"
|
||||
msgstr "&Messaggio:"
|
||||
|
||||
#: ../../../uibase.cpp:730
|
||||
msgid "&Send"
|
||||
msgstr "&Invia"
|
||||
|
||||
#: ../../../uibase.cpp:782
|
||||
msgid ""
|
||||
"\n"
|
||||
"\n"
|
||||
"Connecting..."
|
||||
msgstr ""
|
||||
"\n"
|
||||
"\n"
|
||||
"Connessione in corso..."
|
||||
|
||||
#: ../../../uibase.cpp:832
|
||||
msgid "These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. The highlighted address is displayed in the main window."
|
||||
msgstr "Questi sono i tuoi indirizzi Bitcoin per ricevere pagamenti. Potrai darne uno diverso ad ognuno per cosi tenere traccia di chi ti sta pagando. L'indirizzo selezionato sarà quello mostrato nella finestra principale."
|
||||
|
||||
#: ../../../uibase.cpp:845
|
||||
#: ../../../uibase.cpp:957
|
||||
msgid "&Edit..."
|
||||
msgstr "&Cambia..."
|
||||
|
||||
#: ../../../uibase.cpp:848
|
||||
#: ../../../uibase.cpp:960
|
||||
msgid " &New Address... "
|
||||
msgstr " &Nuovo indirizzo... "
|
||||
|
||||
#: ../../../uibase.cpp:920
|
||||
msgid "Sending"
|
||||
msgstr "Inviando"
|
||||
|
||||
#: ../../../uibase.cpp:928
|
||||
msgid "These are your Bitcoin addresses for receiving payments. You can give a different one to each sender to keep track of who is paying you. The highlighted address will be displayed in the main window."
|
||||
msgstr "Questi sono i tuoi indirizzi Bitcoin per ricevere pagamenti. Potrai darne uno diverso ad ognuno per cosi tenere traccia di chi ti sta pagando. L'indirizzo selezionato sarà quello mostrato nella finestra principale."
|
||||
|
||||
#: ../../../uibase.cpp:941
|
||||
msgid "Receiving"
|
||||
msgstr "Ricevendo"
|
||||
|
||||
#: ../../../uibase.cpp:951
|
||||
msgid "&Delete"
|
||||
msgstr "&Cancella"
|
||||
|
||||
#: ../../../uibase.h:150
|
||||
msgid "Transaction Details"
|
||||
msgstr "Dettagli operazione"
|
||||
|
||||
#: ../../../uibase.h:203
|
||||
msgid "Options"
|
||||
msgstr "Opzioni"
|
||||
|
||||
#: ../../../uibase.h:231
|
||||
msgid "About Bitcoin"
|
||||
msgstr "Info Bitcoin"
|
||||
|
||||
#: ../../../uibase.h:341
|
||||
msgid "Your Bitcoin Addresses"
|
||||
msgstr "Il tuo indirizzo Bitcoin"
|
||||
@@ -1,808 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-05-26 22:02-0000\n"
|
||||
"PO-Revision-Date: 2010-05-27 19:27+0100\n"
|
||||
"Last-Translator: Xunie\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Poedit-KeywordsList: _;gettext;gettext_noop\n"
|
||||
"X-Poedit-Basepath: .\n"
|
||||
"X-Poedit-SearchPath-0: ../../..\n"
|
||||
|
||||
#: ../../../init.cpp:342
|
||||
msgid "Usage: bitcoin [options]"
|
||||
msgstr ""
|
||||
|
||||
#: ../../../init.cpp:343
|
||||
msgid "Options:\n"
|
||||
msgstr "Opties:\n"
|
||||
|
||||
#: ../../../init.cpp:344
|
||||
msgid "Generate coins\n"
|
||||
msgstr "Genereer coins\n"
|
||||
|
||||
#: ../../../init.cpp:345
|
||||
msgid "Don't generate coins\n"
|
||||
msgstr "Genereer geen coins\n"
|
||||
|
||||
#: ../../../init.cpp:346
|
||||
msgid "Start minimized\n"
|
||||
msgstr "Start geminimalizeerd\n"
|
||||
|
||||
#: ../../../init.cpp:347
|
||||
msgid "Specify data directory\n"
|
||||
msgstr "Specificeer data map\n"
|
||||
|
||||
#: ../../../init.cpp:348
|
||||
msgid "Connect through socks4 proxy\n"
|
||||
msgstr "Verbind via socks4 proxy\n"
|
||||
|
||||
#: ../../../init.cpp:349
|
||||
msgid "Add a node to connect to\n"
|
||||
msgstr "Voeg een node om naar te verbinden toe\n"
|
||||
|
||||
#: ../../../init.cpp:350
|
||||
msgid "Connect only to the specified node\n"
|
||||
msgstr "Verbind alleen naar deze node\n"
|
||||
|
||||
#: ../../../init.cpp:351
|
||||
msgid "This help message\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../../../init.cpp:455
|
||||
msgid "Error loading addr.dat \n"
|
||||
msgstr "Fout bij laden van bestand addr.dat \n"
|
||||
|
||||
#: ../../../init.cpp:461
|
||||
msgid "Error loading blkindex.dat \n"
|
||||
msgstr "Fout bij laden van bestand blkindex.dat \n"
|
||||
|
||||
#: ../../../init.cpp:468
|
||||
msgid "Error loading wallet.dat \n"
|
||||
msgstr "Fout bij laden van bestand wallet.dat \n"
|
||||
|
||||
#: ../../../init.cpp:536
|
||||
msgid "Invalid -proxy address"
|
||||
msgstr "Foutief -proxy adres"
|
||||
|
||||
#: ../../../init.cpp:629
|
||||
msgid "Program has crashed and will terminate. "
|
||||
msgstr "Programma is gecrashed en word afgesloten. "
|
||||
|
||||
#: ../../../main.cpp:1465
|
||||
msgid "Warning: Disk space is low "
|
||||
msgstr "Waarschuwng: Gebrek aan schijf ruimte "
|
||||
|
||||
#: ../../../main.cpp:2994
|
||||
#, c-format
|
||||
msgid "Error: This is an oversized transaction that requires a transaction fee of %s "
|
||||
msgstr "Fout: Dit is een te grote transactie die een fooi nodig heeft van %s "
|
||||
|
||||
#: ../../../main.cpp:2996
|
||||
msgid "Error: Transaction creation failed "
|
||||
msgstr "Fout: Transactie aanmaak gefaald "
|
||||
|
||||
#: ../../../main.cpp:3001
|
||||
#: ../../../ui.cpp:1761
|
||||
#: ../../../ui.cpp:1763
|
||||
#: ../../../ui.cpp:1904
|
||||
#: ../../../ui.cpp:2053
|
||||
msgid "Sending..."
|
||||
msgstr "Versturen..."
|
||||
|
||||
#: ../../../main.cpp:3005
|
||||
msgid "Error: The transaction was rejected. This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here."
|
||||
msgstr "Fout: De transactie was afgekeurd. Dit kan komen als bepaalde coins in uw Portefeuille al zijn uitgegeven. Dit kan komen doordat u wallet.dat heeft gekopieerd en wat coins heeft uitgegeven en niet terug gekopieerd heeft."
|
||||
|
||||
#: ../../../main.cpp:3017
|
||||
msgid "Invalid amount"
|
||||
msgstr "Foutief aantal"
|
||||
|
||||
#: ../../../main.cpp:3019
|
||||
#: ../../../ui.cpp:1971
|
||||
#: ../../../ui.cpp:2038
|
||||
msgid "Insufficient funds"
|
||||
msgstr "Onvoldoende coins"
|
||||
|
||||
#: ../../../main.cpp:3024
|
||||
msgid "Invalid bitcoin address"
|
||||
msgstr "Foutief bitcoin adres"
|
||||
|
||||
#: ../../../ui.cpp:189
|
||||
#, c-format
|
||||
msgid "This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee?"
|
||||
msgstr "Deze transactie is over het limiet. U kunt nog door gaan met de transactie door een fooi te betalen van %s, deze word betaald aan de node die uw tranactie verwerkt. Wilt u de fooi betalen?"
|
||||
|
||||
#: ../../../ui.cpp:285
|
||||
msgid "Status"
|
||||
msgstr "Status"
|
||||
|
||||
#: ../../../ui.cpp:286
|
||||
msgid "Date"
|
||||
msgstr "Datum"
|
||||
|
||||
#: ../../../ui.cpp:287
|
||||
msgid "Description"
|
||||
msgstr "Beschrijving"
|
||||
|
||||
#: ../../../ui.cpp:288
|
||||
msgid "Debit"
|
||||
msgstr ""
|
||||
|
||||
#: ../../../ui.cpp:289
|
||||
msgid "Credit"
|
||||
msgstr ""
|
||||
|
||||
#: ../../../ui.cpp:489
|
||||
#, c-format
|
||||
msgid "Open for %d blocks"
|
||||
msgstr "Open voor %d blocks"
|
||||
|
||||
#: ../../../ui.cpp:491
|
||||
#, c-format
|
||||
msgid "Open until %s"
|
||||
msgstr "Open tot %s"
|
||||
|
||||
#: ../../../ui.cpp:497
|
||||
#, c-format
|
||||
msgid "%d/offline?"
|
||||
msgstr "%d/offline?"
|
||||
|
||||
#: ../../../ui.cpp:499
|
||||
#, c-format
|
||||
msgid "%d/unconfirmed"
|
||||
msgstr "%d/niet bevestigd"
|
||||
|
||||
#: ../../../ui.cpp:501
|
||||
#, c-format
|
||||
msgid "%d confirmations"
|
||||
msgstr "%d bevestigingen"
|
||||
|
||||
#: ../../../ui.cpp:584
|
||||
msgid "Generated"
|
||||
msgstr "Gegenereerd"
|
||||
|
||||
#: ../../../ui.cpp:592
|
||||
#, c-format
|
||||
msgid "Generated (%s matures in %d more blocks)"
|
||||
msgstr "Gegenereerd (%s word volwassen in %d blokken)"
|
||||
|
||||
#: ../../../ui.cpp:596
|
||||
msgid "Generated - Warning: This block was not received by any other nodes and will probably not be accepted!"
|
||||
msgstr "Gegenereerd - Waarschuwing: Dit blok is niet ontvangen door andere nodes en zal waarschijnlijk niet geaccepteerd worden!"
|
||||
|
||||
#: ../../../ui.cpp:600
|
||||
msgid "Generated (not accepted)"
|
||||
msgstr "Gegenereerd (niet geaccepteerd)"
|
||||
|
||||
#: ../../../ui.cpp:610
|
||||
msgid "From: "
|
||||
msgstr "Van: "
|
||||
|
||||
#: ../../../ui.cpp:634
|
||||
msgid "From: unknown, Received with: "
|
||||
msgstr "Van: onbekend, Ontvangen met: "
|
||||
|
||||
#: ../../../ui.cpp:676
|
||||
msgid "Payment to yourself"
|
||||
msgstr "Betaling naar u zelf"
|
||||
|
||||
#: ../../../ui.cpp:713
|
||||
msgid "To: "
|
||||
msgstr "Naar: "
|
||||
|
||||
#: ../../../ui.cpp:1009
|
||||
msgid " Generating"
|
||||
msgstr " Genereert"
|
||||
|
||||
#: ../../../ui.cpp:1011
|
||||
msgid "(not connected)"
|
||||
msgstr "(niet verbonden)"
|
||||
|
||||
#: ../../../ui.cpp:1014
|
||||
#, c-format
|
||||
msgid " %d connections %d blocks %d transactions"
|
||||
msgstr " %d verbindingen %d blokken %d transacties"
|
||||
|
||||
#: ../../../ui.cpp:1123
|
||||
#: ../../../ui.cpp:2351
|
||||
msgid "New Receiving Address"
|
||||
msgstr "Nieuw Ontvangings Adres"
|
||||
|
||||
#: ../../../ui.cpp:1124
|
||||
#: ../../../ui.cpp:2352
|
||||
msgid ""
|
||||
"It's good policy to use a new address for each payment you receive.\n"
|
||||
"\n"
|
||||
"Label"
|
||||
msgstr ""
|
||||
"Het is goed beleid om een nieuw adres voor elke betaling te hebben.\n"
|
||||
"\n"
|
||||
"Label"
|
||||
|
||||
#: ../../../ui.cpp:1193
|
||||
msgid "<b>Status:</b> "
|
||||
msgstr "<b>Status:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1198
|
||||
msgid ", has not been successfully broadcast yet"
|
||||
msgstr ", is nog niet succesvol verstuurd naar het netwerk"
|
||||
|
||||
#: ../../../ui.cpp:1200
|
||||
#, c-format
|
||||
msgid ", broadcast through %d node"
|
||||
msgstr ", verstuurd via %d node"
|
||||
|
||||
#: ../../../ui.cpp:1202
|
||||
#, c-format
|
||||
msgid ", broadcast through %d nodes"
|
||||
msgstr ", verstuurd via %d nodes"
|
||||
|
||||
#: ../../../ui.cpp:1206
|
||||
msgid "<b>Date:</b> "
|
||||
msgstr "<b>Datum:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1214
|
||||
msgid "<b>Source:</b> Generated<br>"
|
||||
msgstr "<b>Bron:</b> Gegenereerd<br>"
|
||||
|
||||
#: ../../../ui.cpp:1220
|
||||
#: ../../../ui.cpp:1238
|
||||
msgid "<b>From:</b> "
|
||||
msgstr "<b>Van:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1238
|
||||
msgid "unknown"
|
||||
msgstr "onbekend"
|
||||
|
||||
#: ../../../ui.cpp:1239
|
||||
#: ../../../ui.cpp:1263
|
||||
#: ../../../ui.cpp:1322
|
||||
msgid "<b>To:</b> "
|
||||
msgstr "<b>Naar:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1242
|
||||
msgid " (yours, label: "
|
||||
msgstr ""
|
||||
|
||||
#: ../../../ui.cpp:1244
|
||||
#, fuzzy
|
||||
msgid " (yours)"
|
||||
msgstr ""
|
||||
|
||||
#: ../../../ui.cpp:1281
|
||||
#: ../../../ui.cpp:1293
|
||||
#: ../../../ui.cpp:1356
|
||||
msgid "<b>Credit:</b> "
|
||||
msgstr ""
|
||||
|
||||
#: ../../../ui.cpp:1283
|
||||
#, c-format
|
||||
msgid "(%s matures in %d more blocks)"
|
||||
msgstr "(%s word volwassen in %d blokken)"
|
||||
|
||||
#: ../../../ui.cpp:1285
|
||||
msgid "(not accepted)"
|
||||
msgstr "(niet geaccepteerd"
|
||||
|
||||
#: ../../../ui.cpp:1330
|
||||
#: ../../../ui.cpp:1353
|
||||
msgid "<b>Debit:</b> "
|
||||
msgstr ""
|
||||
|
||||
#: ../../../ui.cpp:1344
|
||||
msgid "<b>Transaction fee:</b> "
|
||||
msgstr "<b>Transactie fooi:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1360
|
||||
msgid "<b>Net amount:</b> "
|
||||
msgstr "<b>Netto bedrag:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1367
|
||||
msgid "Message:"
|
||||
msgstr "Mededeling:"
|
||||
|
||||
#: ../../../ui.cpp:1370
|
||||
msgid "Generated coins must wait 120 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, it will change to \"not accepted\" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours."
|
||||
msgstr "Gegenereerde coins moeten 120 blokken wachten voordat ze uitgegeven kunnen worden. Wanneer je dit blok genereerde, werd het naar het netwerk gestuurd om opgenomen teworden in de rest van de blokken. Als dit faalt, dan zal de dit veranderen in \"niet geaccepteerd\" en zal niet uitgeefbaar zijn. Dit kan soms gebeuren als een node ook een blok rond dezelfde periode genereerd."
|
||||
|
||||
#: ../../../ui.cpp:1437
|
||||
msgid "Main"
|
||||
msgstr "Hoofd"
|
||||
|
||||
#: ../../../ui.cpp:1442
|
||||
msgid "&Minimize on close"
|
||||
msgstr "&Minimalizeer bij sluiten"
|
||||
|
||||
#: ../../../ui.cpp:1595
|
||||
#, c-format
|
||||
msgid "version 0.%d.%d beta"
|
||||
msgstr "versie 0.%d.%d beta"
|
||||
|
||||
#: ../../../ui.cpp:1681
|
||||
msgid "Will appear as \"From: Unknown\""
|
||||
msgstr "Word vertoont als \"Van: Onbekend\""
|
||||
|
||||
#: ../../../ui.cpp:1682
|
||||
msgid "Can't include a message when sending to a Bitcoin address"
|
||||
msgstr "Kan geen mededeling versturen bij gebruik van Bitcoin adressen"
|
||||
|
||||
#: ../../../ui.cpp:1735
|
||||
msgid "Error in amount "
|
||||
msgstr "Fout in hoeveelheid "
|
||||
|
||||
#: ../../../ui.cpp:1735
|
||||
#: ../../../ui.cpp:1740
|
||||
#: ../../../ui.cpp:1745
|
||||
#: ../../../ui.cpp:1771
|
||||
#: ../../../uibase.cpp:61
|
||||
msgid "Send Coins"
|
||||
msgstr "Verstuur Coins"
|
||||
|
||||
#: ../../../ui.cpp:1740
|
||||
msgid "Amount exceeds your balance "
|
||||
msgstr "Hoeveelheid hoger dan uw huidige balans "
|
||||
|
||||
#: ../../../ui.cpp:1745
|
||||
msgid "Total exceeds your balance when the "
|
||||
msgstr "Totaal groter dan uw huidige balans wanner de "
|
||||
|
||||
#: ../../../ui.cpp:1745
|
||||
msgid " transaction fee is included "
|
||||
msgstr " transactie fooi is bijgerekend "
|
||||
|
||||
#: ../../../ui.cpp:1761
|
||||
msgid "Payment sent "
|
||||
msgstr "Betaling verstuurd "
|
||||
|
||||
#: ../../../ui.cpp:1771
|
||||
msgid "Invalid address "
|
||||
msgstr "Foutief adres "
|
||||
|
||||
#: ../../../ui.cpp:1825
|
||||
#, c-format
|
||||
msgid "Sending %s to %s"
|
||||
msgstr "Verstuurd %s naar %s"
|
||||
|
||||
#: ../../../ui.cpp:1898
|
||||
#: ../../../ui.cpp:1931
|
||||
msgid "CANCELLED"
|
||||
msgstr "GEANNULEERD"
|
||||
|
||||
#: ../../../ui.cpp:1902
|
||||
msgid "Cancelled"
|
||||
msgstr "Geannuleerd"
|
||||
|
||||
#: ../../../ui.cpp:1904
|
||||
msgid "Transfer cancelled "
|
||||
msgstr "Transactie geannuleerd "
|
||||
|
||||
#: ../../../ui.cpp:1957
|
||||
msgid "Error: "
|
||||
msgstr "Fout: "
|
||||
|
||||
#: ../../../ui.cpp:1976
|
||||
msgid "Connecting..."
|
||||
msgstr "Verbinden..."
|
||||
|
||||
#: ../../../ui.cpp:1981
|
||||
msgid "Unable to connect"
|
||||
msgstr "Kan niet verbinden"
|
||||
|
||||
#: ../../../ui.cpp:1986
|
||||
msgid "Requesting public key..."
|
||||
msgstr "Aanvragen van publieke sleutel..."
|
||||
|
||||
#: ../../../ui.cpp:1998
|
||||
msgid "Received public key..."
|
||||
msgstr "Publieke sleutel ontvangen..."
|
||||
|
||||
#: ../../../ui.cpp:2010
|
||||
msgid "Transfer was not accepted"
|
||||
msgstr "Transactie niet geaccepteerd"
|
||||
|
||||
#: ../../../ui.cpp:2019
|
||||
msgid "Invalid response received"
|
||||
msgstr "Foutief antwoord ontvangen"
|
||||
|
||||
#: ../../../ui.cpp:2034
|
||||
msgid "Creating transaction..."
|
||||
msgstr "Maakt transactie aan..."
|
||||
|
||||
#: ../../../ui.cpp:2046
|
||||
#, c-format
|
||||
msgid "This is an oversized transaction that requires a transaction fee of %s"
|
||||
msgstr "Dit is een te grote transactie die een transactie fooi vereist van %s"
|
||||
|
||||
#: ../../../ui.cpp:2048
|
||||
msgid "Transaction creation failed"
|
||||
msgstr "Transactie aanmaak gefaald."
|
||||
|
||||
#: ../../../ui.cpp:2055
|
||||
msgid "Transaction aborted"
|
||||
msgstr "Transactie geannuleerd"
|
||||
|
||||
#: ../../../ui.cpp:2063
|
||||
msgid "Lost connection, transaction cancelled"
|
||||
msgstr "Verbinding verloren, transactie geannuleerd"
|
||||
|
||||
#: ../../../ui.cpp:2079
|
||||
msgid "Sending payment..."
|
||||
msgstr "Versturen van betaling..."
|
||||
|
||||
#: ../../../ui.cpp:2085
|
||||
msgid "The transaction was rejected. This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here."
|
||||
msgstr "De transactie was afgekeurd. Dit kan komen als bepaalde coins in uw Portefeuille al zijn uitgegeven. Dit kan komen doordat u wallet.dat heeft gekopieerd en wat coins heeft uitgegeven en niet terug gekopieerd heeft."
|
||||
|
||||
#: ../../../ui.cpp:2092
|
||||
msgid "Waiting for confirmation..."
|
||||
msgstr "Wachten op bevestiging..."
|
||||
|
||||
#: ../../../ui.cpp:2110
|
||||
msgid ""
|
||||
"The payment was sent, but the recipient was unable to verify it.\n"
|
||||
"The transaction is recorded and will credit to the recipient,\n"
|
||||
"but the comment information will be blank."
|
||||
msgstr ""
|
||||
"De betaling was verstuurd, maar de ontvanger kon het niet verifieeren.\n"
|
||||
"De transactie is opgenomen en word uitbetaald aan de ontvanger,\n"
|
||||
"maar de mededeling blijft blank bij de ontanger."
|
||||
|
||||
#: ../../../ui.cpp:2119
|
||||
msgid "Payment was sent, but an invalid response was received"
|
||||
msgstr "Betaling was verstuurd, maar een foutief antword was ontvangen."
|
||||
|
||||
#: ../../../ui.cpp:2125
|
||||
msgid "Payment completed"
|
||||
msgstr "Betaling voltooid"
|
||||
|
||||
#: ../../../ui.cpp:2156
|
||||
#: ../../../ui.cpp:2302
|
||||
#: ../../../ui.cpp:2339
|
||||
msgid "Name"
|
||||
msgstr "Naam"
|
||||
|
||||
#: ../../../ui.cpp:2157
|
||||
#: ../../../ui.cpp:2302
|
||||
#: ../../../ui.cpp:2339
|
||||
msgid "Address"
|
||||
msgstr "Adres"
|
||||
|
||||
#: ../../../ui.cpp:2159
|
||||
#: ../../../ui.cpp:2314
|
||||
msgid "Label"
|
||||
msgstr "Label"
|
||||
|
||||
#: ../../../ui.cpp:2160
|
||||
#: ../../../uibase.cpp:908
|
||||
msgid "Bitcoin Address"
|
||||
msgstr "Bitcoin Adres"
|
||||
|
||||
#: ../../../ui.cpp:2284
|
||||
msgid "This is one of your own addresses for receiving payments and cannot be entered in the address book. "
|
||||
msgstr "Dit is een van uw eigen adressen voor het ontvangen van betalingen en can niet worden toegevoegd aan uw adressen boek. "
|
||||
|
||||
#: ../../../ui.cpp:2302
|
||||
#: ../../../ui.cpp:2308
|
||||
msgid "Edit Address"
|
||||
msgstr "Bewerk Adres"
|
||||
|
||||
#: ../../../ui.cpp:2314
|
||||
msgid "Edit Address Label"
|
||||
msgstr "Bewerk Adres Label"
|
||||
|
||||
#: ../../../ui.cpp:2339
|
||||
#: ../../../ui.cpp:2345
|
||||
msgid "Add Address"
|
||||
msgstr "Adres Toevoegen"
|
||||
|
||||
#: ../../../ui.cpp:2421
|
||||
msgid "Bitcoin"
|
||||
msgstr "Bitcoin"
|
||||
|
||||
#: ../../../ui.cpp:2423
|
||||
msgid "Bitcoin - Generating"
|
||||
msgstr "Bitcoin - Genereert"
|
||||
|
||||
#: ../../../ui.cpp:2425
|
||||
msgid "Bitcoin - (not connected)"
|
||||
msgstr "Bitcoin - (niet verbonden)"
|
||||
|
||||
#: ../../../ui.cpp:2500
|
||||
msgid "&Open Bitcoin"
|
||||
msgstr "&Open Bitcoin"
|
||||
|
||||
#: ../../../ui.cpp:2501
|
||||
msgid "O&ptions..."
|
||||
msgstr "O&pties"
|
||||
|
||||
#: ../../../ui.cpp:2502
|
||||
#: ../../../uibase.cpp:34
|
||||
msgid "&Generate Coins"
|
||||
msgstr "&Genereer Coins"
|
||||
|
||||
#: ../../../ui.cpp:2505
|
||||
#: ../../../uibase.cpp:27
|
||||
msgid "E&xit"
|
||||
msgstr "A&fsluiten"
|
||||
|
||||
#: ../../../uibase.cpp:30
|
||||
msgid "&File"
|
||||
msgstr "&Bestand"
|
||||
|
||||
#: ../../../uibase.cpp:38
|
||||
msgid "&Your Receiving Addresses..."
|
||||
msgstr "&Uw Ontvang Adressen..."
|
||||
|
||||
#: ../../../uibase.cpp:42
|
||||
msgid "&Options..."
|
||||
msgstr "&Opties..."
|
||||
|
||||
#: ../../../uibase.cpp:45
|
||||
msgid "&Settings"
|
||||
msgstr "&Eigenschappen"
|
||||
|
||||
#: ../../../uibase.cpp:49
|
||||
msgid "&About..."
|
||||
msgstr "&Over..."
|
||||
|
||||
#: ../../../uibase.cpp:52
|
||||
msgid "&Help"
|
||||
msgstr "&Help"
|
||||
|
||||
#: ../../../uibase.cpp:62
|
||||
msgid "Address Book"
|
||||
msgstr "Adressen Boek"
|
||||
|
||||
#: ../../../uibase.cpp:77
|
||||
msgid "Your Bitcoin Address:"
|
||||
msgstr "Uw Bitcoin Address:"
|
||||
|
||||
#: ../../../uibase.cpp:84
|
||||
msgid " &New... "
|
||||
msgstr " &Nieuw... "
|
||||
|
||||
#: ../../../uibase.cpp:87
|
||||
#: ../../../uibase.cpp:851
|
||||
#: ../../../uibase.cpp:954
|
||||
msgid " &Copy to Clipboard "
|
||||
msgstr " &Kopieer naar Plakboord "
|
||||
|
||||
#: ../../../uibase.cpp:102
|
||||
msgid "Balance:"
|
||||
msgstr "Balans:"
|
||||
|
||||
#: ../../../uibase.cpp:121
|
||||
msgid " All"
|
||||
msgstr " Alles"
|
||||
|
||||
#: ../../../uibase.cpp:121
|
||||
msgid " Sent"
|
||||
msgstr " Verstuurd"
|
||||
|
||||
#: ../../../uibase.cpp:121
|
||||
msgid " Received"
|
||||
msgstr " Ontvangen"
|
||||
|
||||
#: ../../../uibase.cpp:121
|
||||
msgid " In Progress"
|
||||
msgstr " Word Verwerkt"
|
||||
|
||||
#: ../../../uibase.cpp:142
|
||||
msgid "All Transactions"
|
||||
msgstr "Alle transacties"
|
||||
|
||||
#: ../../../uibase.cpp:153
|
||||
msgid "Sent/Received"
|
||||
msgstr "Verstuurd/Ontvangen"
|
||||
|
||||
#: ../../../uibase.cpp:164
|
||||
msgid "Sent"
|
||||
msgstr "Verstuurd"
|
||||
|
||||
#: ../../../uibase.cpp:175
|
||||
msgid "Received"
|
||||
msgstr "Ontvangen"
|
||||
|
||||
#: ../../../uibase.cpp:318
|
||||
#: ../../../uibase.cpp:479
|
||||
#: ../../../uibase.cpp:580
|
||||
#: ../../../uibase.cpp:793
|
||||
#: ../../../uibase.cpp:854
|
||||
#: ../../../uibase.cpp:963
|
||||
#: ../../../uibase.cpp:1052
|
||||
msgid "OK"
|
||||
msgstr "OK"
|
||||
|
||||
#: ../../../uibase.cpp:361
|
||||
msgid "Optional transaction fee you give to the nodes that process your transactions."
|
||||
msgstr "Optionele transactie fooi die u geeft aan de nodes doe uw betaling verwerken."
|
||||
|
||||
#: ../../../uibase.cpp:370
|
||||
msgid "Transaction fee:"
|
||||
msgstr "Transactie fooi:"
|
||||
|
||||
#: ../../../uibase.cpp:386
|
||||
msgid "&Limit coin generation to"
|
||||
msgstr "&Limiteer coin generatie tot"
|
||||
|
||||
#: ../../../uibase.cpp:393
|
||||
msgid "processors"
|
||||
msgstr "processors"
|
||||
|
||||
#: ../../../uibase.cpp:399
|
||||
msgid "&Start Bitcoin on system startup"
|
||||
msgstr "&Start Bitcoin wanneer het systeem opstart"
|
||||
|
||||
#: ../../../uibase.cpp:403
|
||||
msgid "&Minimize to the tray instead of the taskbar"
|
||||
msgstr "&Minimalizeer tot systeemvak inplaats van taakbalk"
|
||||
|
||||
#: ../../../uibase.cpp:407
|
||||
msgid "M&inimize to the tray on close"
|
||||
msgstr "M&inimalizeer tot taakbalk bij sluiten"
|
||||
|
||||
#: ../../../uibase.cpp:414
|
||||
msgid "&Connect through socks4 proxy: "
|
||||
msgstr "&Verbind via socks4 proxy: "
|
||||
|
||||
#: ../../../uibase.cpp:426
|
||||
msgid "Proxy &IP:"
|
||||
msgstr "Proxy &IP:"
|
||||
|
||||
#: ../../../uibase.cpp:434
|
||||
msgid " &Port:"
|
||||
msgstr " &Poort:"
|
||||
|
||||
#: ../../../uibase.cpp:456
|
||||
msgid "// [don't translate] Test panel 2 for future expansion"
|
||||
msgstr ""
|
||||
|
||||
#: ../../../uibase.cpp:460
|
||||
msgid "// [don't translate] Let's not start multiple pages until the first page is filled up"
|
||||
msgstr ""
|
||||
|
||||
#: ../../../uibase.cpp:482
|
||||
#: ../../../uibase.cpp:735
|
||||
#: ../../../uibase.cpp:798
|
||||
#: ../../../uibase.cpp:857
|
||||
#: ../../../uibase.cpp:966
|
||||
#: ../../../uibase.cpp:1055
|
||||
msgid "Cancel"
|
||||
msgstr "Annuleer"
|
||||
|
||||
#: ../../../uibase.cpp:485
|
||||
msgid "&Apply"
|
||||
msgstr "&Toepassen"
|
||||
|
||||
#: ../../../uibase.cpp:546
|
||||
msgid "Bitcoin "
|
||||
msgstr "Bitcoin "
|
||||
|
||||
#: ../../../uibase.cpp:552
|
||||
msgid "version"
|
||||
msgstr "versie"
|
||||
|
||||
#: ../../../uibase.cpp:563
|
||||
msgid ""
|
||||
"Copyright (c) 2009-2010 Satoshi Nakamoto.\n"
|
||||
"\n"
|
||||
"This is experimental software.\n"
|
||||
"\n"
|
||||
"Distributed under the MIT/X11 software license, see the accompanying file \n"
|
||||
"license.txt or http://www.opensource.org/licenses/mit-license.php.\n"
|
||||
"\n"
|
||||
"This product includes software developed by the OpenSSL Project for use in the \n"
|
||||
"OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by \n"
|
||||
"Eric Young (eay@cryptsoft.com)."
|
||||
msgstr ""
|
||||
"Copyright (c) 2009-2010 Satoshi Nakamoto.\n"
|
||||
"\n"
|
||||
"Dit is experimentele software.\n"
|
||||
"\n"
|
||||
"Gedistributeerd onder de MIT/X11 software licentie, see het bijbehorende bestand \n"
|
||||
"license.txt of http://www.opensource.org/licenses/mit-license.php.\n"
|
||||
"\n"
|
||||
"Dit product komt met software ontwikkeld door het OpenSSL Project for gebruik \n"
|
||||
"in de OpenSSL Toolkit (http://www.openssl.org/) and de cryptografische \n"
|
||||
"software geschreven door Eric Young (eay@cryptsoft.com)."
|
||||
|
||||
#: ../../../uibase.cpp:619
|
||||
msgid "Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJED9L) or IP address (e.g. 123.45.6.7)"
|
||||
msgstr "Voer een Bitcoin adres (bijvoorbeeld: 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJED9L) of IP address (bijvoorbeeld: 123.45.6.7) in."
|
||||
|
||||
#: ../../../uibase.cpp:633
|
||||
msgid "Pay &To:"
|
||||
msgstr "Betaal &Naar:"
|
||||
|
||||
#: ../../../uibase.cpp:648
|
||||
msgid "&Paste"
|
||||
msgstr "&Plakken"
|
||||
|
||||
#: ../../../uibase.cpp:651
|
||||
msgid " Address &Book..."
|
||||
msgstr " Adressen &Boek..."
|
||||
|
||||
#: ../../../uibase.cpp:658
|
||||
msgid "&Amount:"
|
||||
msgstr "&Hoeveelheid:"
|
||||
|
||||
#: ../../../uibase.cpp:668
|
||||
msgid "T&ransfer:"
|
||||
msgstr "O&verdracht:"
|
||||
|
||||
#: ../../../uibase.cpp:674
|
||||
msgid " Standard"
|
||||
msgstr " Standaard"
|
||||
|
||||
#: ../../../uibase.cpp:696
|
||||
msgid "&From:"
|
||||
msgstr "&Van:"
|
||||
|
||||
#: ../../../uibase.cpp:713
|
||||
msgid "&Message:"
|
||||
msgstr "&Mededeling:"
|
||||
|
||||
#: ../../../uibase.cpp:730
|
||||
msgid "&Send"
|
||||
msgstr "&Verstuur"
|
||||
|
||||
#: ../../../uibase.cpp:782
|
||||
msgid ""
|
||||
"\n"
|
||||
"\n"
|
||||
"Connecting..."
|
||||
msgstr ""
|
||||
"\n"
|
||||
"\n"
|
||||
"Verbinden..."
|
||||
|
||||
#: ../../../uibase.cpp:832
|
||||
msgid "These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. The highlighted address is displayed in the main window."
|
||||
msgstr "Dit zijn uw Bitcoin Adressen voor het ontvangen van betalingen. Misschien wilt u elk contact persoon een ander adres geven zodat u kunt bij houden wie er u heeft betaald. De opgelichte adressen worden weergeven in het hoofd venster."
|
||||
|
||||
#: ../../../uibase.cpp:845
|
||||
#: ../../../uibase.cpp:957
|
||||
msgid "&Edit..."
|
||||
msgstr "&Bewerk..."
|
||||
|
||||
#: ../../../uibase.cpp:848
|
||||
#: ../../../uibase.cpp:960
|
||||
msgid " &New Address... "
|
||||
msgstr " &New Adres... "
|
||||
|
||||
#: ../../../uibase.cpp:920
|
||||
msgid "Sending"
|
||||
msgstr "Versturen"
|
||||
|
||||
#: ../../../uibase.cpp:928
|
||||
msgid "These are your Bitcoin addresses for receiving payments. You can give a different one to each sender to keep track of who is paying you. The highlighted address will be displayed in the main window."
|
||||
msgstr "Dit zijn uw Bitcoin adressen voor het ontvangen van betalingen. U kunt een aan elk contact persoon geven zodat u een overzicht kunt houden wie u betaald. Dit adres zal wergeven worden in het hoofd main venster."
|
||||
|
||||
#: ../../../uibase.cpp:941
|
||||
msgid "Receiving"
|
||||
msgstr "Ontvangen"
|
||||
|
||||
#: ../../../uibase.cpp:951
|
||||
msgid "&Delete"
|
||||
msgstr "&Verwijder"
|
||||
|
||||
#: ../../../uibase.h:150
|
||||
msgid "Transaction Details"
|
||||
msgstr "Transactie Details"
|
||||
|
||||
#: ../../../uibase.h:203
|
||||
msgid "Options"
|
||||
msgstr "Opties"
|
||||
|
||||
#: ../../../uibase.h:231
|
||||
msgid "About Bitcoin"
|
||||
msgstr "Over Bitcoin"
|
||||
|
||||
#: ../../../uibase.h:341
|
||||
msgid "Your Bitcoin Addresses"
|
||||
msgstr "Uw Bitcoin Adressen"
|
||||
@@ -1,807 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-05-26 22:02-0000\n"
|
||||
"PO-Revision-Date: 2010-07-05 09:06+0100\n"
|
||||
"Last-Translator: Tiago Faria\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Poedit-KeywordsList: _;gettext;gettext_noop\n"
|
||||
"X-Poedit-Basepath: .\n"
|
||||
"X-Poedit-SearchPath-0: ../../..\n"
|
||||
|
||||
#: ../../../init.cpp:342
|
||||
msgid "Usage: bitcoin [options]"
|
||||
msgstr "Utilização Bitcoin [opções]"
|
||||
|
||||
#: ../../../init.cpp:343
|
||||
msgid "Options:\n"
|
||||
msgstr "Opções:\n"
|
||||
|
||||
#: ../../../init.cpp:344
|
||||
msgid "Generate coins\n"
|
||||
msgstr "Gerar moedas\n"
|
||||
|
||||
#: ../../../init.cpp:345
|
||||
msgid "Don't generate coins\n"
|
||||
msgstr "Não gerar moedas\n"
|
||||
|
||||
#: ../../../init.cpp:346
|
||||
msgid "Start minimized\n"
|
||||
msgstr "Iniciar minimizado\n"
|
||||
|
||||
#: ../../../init.cpp:347
|
||||
msgid "Specify data directory\n"
|
||||
msgstr "Especificar localização dos dados\n"
|
||||
|
||||
#: ../../../init.cpp:348
|
||||
msgid "Connect through socks4 proxy\n"
|
||||
msgstr "Ligar através de um proxy socks4\n"
|
||||
|
||||
#: ../../../init.cpp:349
|
||||
msgid "Add a node to connect to\n"
|
||||
msgstr "Adicionar um nó para efectuar ligação\n"
|
||||
|
||||
#: ../../../init.cpp:350
|
||||
msgid "Connect only to the specified node\n"
|
||||
msgstr "Ligar apenas ao nó especificado\n"
|
||||
|
||||
#: ../../../init.cpp:351
|
||||
msgid "This help message\n"
|
||||
msgstr "Esta mensagem de ajuda\n"
|
||||
|
||||
#: ../../../init.cpp:455
|
||||
msgid "Error loading addr.dat \n"
|
||||
msgstr "Erro ao carregar addr.dat \n"
|
||||
|
||||
#: ../../../init.cpp:461
|
||||
msgid "Error loading blkindex.dat \n"
|
||||
msgstr "Erro ao carregar blkindex.dat \n"
|
||||
|
||||
#: ../../../init.cpp:468
|
||||
msgid "Error loading wallet.dat \n"
|
||||
msgstr "Erro ao carregar wallet.dat \n"
|
||||
|
||||
#: ../../../init.cpp:536
|
||||
msgid "Invalid -proxy address"
|
||||
msgstr "Endereço -proxy inválido"
|
||||
|
||||
#: ../../../init.cpp:629
|
||||
msgid "Program has crashed and will terminate. "
|
||||
msgstr "A aplicação bloqueou e vai terminar. "
|
||||
|
||||
#: ../../../main.cpp:1465
|
||||
msgid "Warning: Disk space is low "
|
||||
msgstr "Aviso: Espaço em disco limitado "
|
||||
|
||||
#: ../../../main.cpp:2994
|
||||
#, c-format
|
||||
msgid "Error: This is an oversized transaction that requires a transaction fee of %s "
|
||||
msgstr "Erro: Esta transacção necessita de uma percentagem de transferência no valor de %s "
|
||||
|
||||
#: ../../../main.cpp:2996
|
||||
msgid "Error: Transaction creation failed "
|
||||
msgstr "Erro: Criação da transacção falhou "
|
||||
|
||||
#: ../../../main.cpp:3001
|
||||
#: ../../../ui.cpp:1761
|
||||
#: ../../../ui.cpp:1763
|
||||
#: ../../../ui.cpp:1904
|
||||
#: ../../../ui.cpp:2053
|
||||
msgid "Sending..."
|
||||
msgstr "A enviar ..."
|
||||
|
||||
#: ../../../main.cpp:3005
|
||||
msgid "Error: The transaction was rejected. This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here."
|
||||
msgstr "Erro: A transacção foi rejeitada. Isto pode acontecer se algumas das moedas na sua carteira já tenham sido gastas, como por exemplo na utilização de uma cópia do wallet.dat onde as moedas foram gastas na cópia mas não aqui."
|
||||
|
||||
#: ../../../main.cpp:3017
|
||||
msgid "Invalid amount"
|
||||
msgstr "Montante inválido"
|
||||
|
||||
#: ../../../main.cpp:3019
|
||||
#: ../../../ui.cpp:1971
|
||||
#: ../../../ui.cpp:2038
|
||||
msgid "Insufficient funds"
|
||||
msgstr "Fundos insuficientes"
|
||||
|
||||
#: ../../../main.cpp:3024
|
||||
msgid "Invalid bitcoin address"
|
||||
msgstr "Endereço Bitcoin inválido"
|
||||
|
||||
#: ../../../ui.cpp:189
|
||||
#, c-format
|
||||
msgid "This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee?"
|
||||
msgstr "Esta transacção ultrapassa o limite. Pode, mesmo assim, efectuá-la, no entanto, uma percentagem de %s será enviada para os nós da rede que processam este pagamento. Quer pagar a percentagem?"
|
||||
|
||||
#: ../../../ui.cpp:285
|
||||
msgid "Status"
|
||||
msgstr "Estado"
|
||||
|
||||
#: ../../../ui.cpp:286
|
||||
msgid "Date"
|
||||
msgstr "Data"
|
||||
|
||||
#: ../../../ui.cpp:287
|
||||
msgid "Description"
|
||||
msgstr "Descrição"
|
||||
|
||||
#: ../../../ui.cpp:288
|
||||
msgid "Debit"
|
||||
msgstr "Débito"
|
||||
|
||||
#: ../../../ui.cpp:289
|
||||
msgid "Credit"
|
||||
msgstr "Crédito"
|
||||
|
||||
#: ../../../ui.cpp:489
|
||||
#, c-format
|
||||
msgid "Open for %d blocks"
|
||||
msgstr "Aberto para %d blocos"
|
||||
|
||||
#: ../../../ui.cpp:491
|
||||
#, c-format
|
||||
msgid "Open until %s"
|
||||
msgstr "Aberto até %s"
|
||||
|
||||
#: ../../../ui.cpp:497
|
||||
#, c-format
|
||||
msgid "%d/offline?"
|
||||
msgstr "%d/offline?"
|
||||
|
||||
#: ../../../ui.cpp:499
|
||||
#, c-format
|
||||
msgid "%d/unconfirmed"
|
||||
msgstr "%d/não confirmado"
|
||||
|
||||
#: ../../../ui.cpp:501
|
||||
#, c-format
|
||||
msgid "%d confirmations"
|
||||
msgstr "%d confirmados"
|
||||
|
||||
#: ../../../ui.cpp:584
|
||||
msgid "Generated"
|
||||
msgstr "Gerado"
|
||||
|
||||
#: ../../../ui.cpp:592
|
||||
#, c-format
|
||||
msgid "Generated (%s matures in %d more blocks)"
|
||||
msgstr "Gerado (%s maduras em mais %d blocos)"
|
||||
|
||||
#: ../../../ui.cpp:596
|
||||
msgid "Generated - Warning: This block was not received by any other nodes and will probably not be accepted!"
|
||||
msgstr "Gerado - Aviso: Este bloco não foi recebido por mais nenhum nó da rede e provavelmente não será aceite."
|
||||
|
||||
#: ../../../ui.cpp:600
|
||||
msgid "Generated (not accepted)"
|
||||
msgstr "Gerado (não aceite)"
|
||||
|
||||
#: ../../../ui.cpp:610
|
||||
msgid "From: "
|
||||
msgstr "Remetente: "
|
||||
|
||||
#: ../../../ui.cpp:634
|
||||
msgid "From: unknown, Received with: "
|
||||
msgstr "Remetente: desconhecido, Recebido por: "
|
||||
|
||||
#: ../../../ui.cpp:676
|
||||
msgid "Payment to yourself"
|
||||
msgstr "Pagamento ao próprio"
|
||||
|
||||
#: ../../../ui.cpp:713
|
||||
msgid "To: "
|
||||
msgstr "Destinatário: "
|
||||
|
||||
#: ../../../ui.cpp:1009
|
||||
msgid " Generating"
|
||||
msgstr " A gerar"
|
||||
|
||||
#: ../../../ui.cpp:1011
|
||||
msgid "(not connected)"
|
||||
msgstr "(sem ligação)"
|
||||
|
||||
#: ../../../ui.cpp:1014
|
||||
#, c-format
|
||||
msgid " %d connections %d blocks %d transactions"
|
||||
msgstr " %d ligações %d blocos %d transacções"
|
||||
|
||||
#: ../../../ui.cpp:1123
|
||||
#: ../../../ui.cpp:2351
|
||||
msgid "New Receiving Address"
|
||||
msgstr "Novo Endereço de Recepção"
|
||||
|
||||
#: ../../../ui.cpp:1124
|
||||
#: ../../../ui.cpp:2352
|
||||
msgid ""
|
||||
"It's good policy to use a new address for each payment you receive.\n"
|
||||
"\n"
|
||||
"Label"
|
||||
msgstr ""
|
||||
"É uma boa política utilizar um endereço diferente para cada pagamento que recebe.\n"
|
||||
"\n"
|
||||
"Etiqueta"
|
||||
|
||||
#: ../../../ui.cpp:1193
|
||||
msgid "<b>Status:</b> "
|
||||
msgstr "<b>Estado:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1198
|
||||
msgid ", has not been successfully broadcast yet"
|
||||
msgstr ", ainda não foram anunciadas com sucesso"
|
||||
|
||||
#: ../../../ui.cpp:1200
|
||||
#, c-format
|
||||
msgid ", broadcast through %d node"
|
||||
msgstr ", anunciar por %d nó"
|
||||
|
||||
#: ../../../ui.cpp:1202
|
||||
#, c-format
|
||||
msgid ", broadcast through %d nodes"
|
||||
msgstr ", anunciar por %d nós"
|
||||
|
||||
#: ../../../ui.cpp:1206
|
||||
msgid "<b>Date:</b> "
|
||||
msgstr "<b>Data:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1214
|
||||
msgid "<b>Source:</b> Generated<br>"
|
||||
msgstr "<b>Fonte:</b> Gerado<br>"
|
||||
|
||||
#: ../../../ui.cpp:1220
|
||||
#: ../../../ui.cpp:1238
|
||||
msgid "<b>From:</b> "
|
||||
msgstr "<b>Remetente:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1238
|
||||
msgid "unknown"
|
||||
msgstr "desconhecido"
|
||||
|
||||
#: ../../../ui.cpp:1239
|
||||
#: ../../../ui.cpp:1263
|
||||
#: ../../../ui.cpp:1322
|
||||
msgid "<b>To:</b> "
|
||||
msgstr "<b>Destinatário:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1242
|
||||
msgid " (yours, label: "
|
||||
msgstr " (seu, etiqueta: "
|
||||
|
||||
#: ../../../ui.cpp:1244
|
||||
msgid " (yours)"
|
||||
msgstr " (seu)"
|
||||
|
||||
#: ../../../ui.cpp:1281
|
||||
#: ../../../ui.cpp:1293
|
||||
#: ../../../ui.cpp:1356
|
||||
msgid "<b>Credit:</b> "
|
||||
msgstr "<b>Crédito:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1283
|
||||
#, c-format
|
||||
msgid "(%s matures in %d more blocks)"
|
||||
msgstr "(%s maduras em mais %d blocos)"
|
||||
|
||||
#: ../../../ui.cpp:1285
|
||||
msgid "(not accepted)"
|
||||
msgstr "(não aceite)"
|
||||
|
||||
#: ../../../ui.cpp:1330
|
||||
#: ../../../ui.cpp:1353
|
||||
msgid "<b>Debit:</b> "
|
||||
msgstr "<b>Débito:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1344
|
||||
msgid "<b>Transaction fee:</b> "
|
||||
msgstr "<b>Percentagem da transacção:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1360
|
||||
msgid "<b>Net amount:</b> "
|
||||
msgstr "<b>Quantia Net:</b> "
|
||||
|
||||
#: ../../../ui.cpp:1367
|
||||
msgid "Message:"
|
||||
msgstr "Mensagem:"
|
||||
|
||||
#: ../../../ui.cpp:1370
|
||||
msgid "Generated coins must wait 120 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, it will change to \"not accepted\" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours."
|
||||
msgstr "As moedas geradas necessitam de 120 blocos para que possam ser gastas. Quando gera um bloco, ele será anunciado pela rede para ser adicionado à cadeia de blocos. Se falhar, mudará para \"não aceite\" e não será possível utilizá-lo. Isto pode acontecer se um nó gerar outro bloco após alguns segundos do seu."
|
||||
|
||||
#: ../../../ui.cpp:1437
|
||||
msgid "Main"
|
||||
msgstr "Principal"
|
||||
|
||||
#: ../../../ui.cpp:1442
|
||||
msgid "&Minimize on close"
|
||||
msgstr "&Minimizar ao fechar"
|
||||
|
||||
#: ../../../ui.cpp:1595
|
||||
#, c-format
|
||||
msgid "version 0.%d.%d beta"
|
||||
msgstr "versão 0.%d.%d beta"
|
||||
|
||||
#: ../../../ui.cpp:1681
|
||||
msgid "Will appear as \"From: Unknown\""
|
||||
msgstr "Irá aparecer como \"De: Desconhecido\""
|
||||
|
||||
#: ../../../ui.cpp:1682
|
||||
msgid "Can't include a message when sending to a Bitcoin address"
|
||||
msgstr "Não é possível incluir uma mensagem ao enviar para um endereço Bitcoin"
|
||||
|
||||
#: ../../../ui.cpp:1735
|
||||
msgid "Error in amount "
|
||||
msgstr "Erro na quantia "
|
||||
|
||||
#: ../../../ui.cpp:1735
|
||||
#: ../../../ui.cpp:1740
|
||||
#: ../../../ui.cpp:1745
|
||||
#: ../../../ui.cpp:1771
|
||||
#: ../../../uibase.cpp:61
|
||||
msgid "Send Coins"
|
||||
msgstr "Enviar Moedas"
|
||||
|
||||
#: ../../../ui.cpp:1740
|
||||
msgid "Amount exceeds your balance "
|
||||
msgstr "A quantia excede o seu saldo "
|
||||
|
||||
#: ../../../ui.cpp:1745
|
||||
msgid "Total exceeds your balance when the "
|
||||
msgstr "O total excede o seu saldo quando a "
|
||||
|
||||
#: ../../../ui.cpp:1745
|
||||
msgid " transaction fee is included "
|
||||
msgstr " taxa de transacção for incluída "
|
||||
|
||||
#: ../../../ui.cpp:1761
|
||||
msgid "Payment sent "
|
||||
msgstr "Pagamento enviado "
|
||||
|
||||
#: ../../../ui.cpp:1771
|
||||
msgid "Invalid address "
|
||||
msgstr "Endereço inválido "
|
||||
|
||||
#: ../../../ui.cpp:1825
|
||||
#, c-format
|
||||
msgid "Sending %s to %s"
|
||||
msgstr "A enviar %s para %s"
|
||||
|
||||
#: ../../../ui.cpp:1898
|
||||
#: ../../../ui.cpp:1931
|
||||
msgid "CANCELLED"
|
||||
msgstr "CANCELADO"
|
||||
|
||||
#: ../../../ui.cpp:1902
|
||||
msgid "Cancelled"
|
||||
msgstr "Cancelado"
|
||||
|
||||
#: ../../../ui.cpp:1904
|
||||
msgid "Transfer cancelled "
|
||||
msgstr "Transferência cancelada "
|
||||
|
||||
#: ../../../ui.cpp:1957
|
||||
msgid "Error: "
|
||||
msgstr "Erro: "
|
||||
|
||||
#: ../../../ui.cpp:1976
|
||||
msgid "Connecting..."
|
||||
msgstr "A estabelecer ligação ..."
|
||||
|
||||
#: ../../../ui.cpp:1981
|
||||
msgid "Unable to connect"
|
||||
msgstr "Impossível estabelecer ligação"
|
||||
|
||||
#: ../../../ui.cpp:1986
|
||||
msgid "Requesting public key..."
|
||||
msgstr "A requisitar a chave pública ..."
|
||||
|
||||
#: ../../../ui.cpp:1998
|
||||
msgid "Received public key..."
|
||||
msgstr "Chave pública recebida"
|
||||
|
||||
#: ../../../ui.cpp:2010
|
||||
msgid "Transfer was not accepted"
|
||||
msgstr "A transferência não foi aceite"
|
||||
|
||||
#: ../../../ui.cpp:2019
|
||||
msgid "Invalid response received"
|
||||
msgstr "Resposta inválida recebida"
|
||||
|
||||
#: ../../../ui.cpp:2034
|
||||
msgid "Creating transaction..."
|
||||
msgstr "A criar a transacção ..."
|
||||
|
||||
#: ../../../ui.cpp:2046
|
||||
#, c-format
|
||||
msgid "This is an oversized transaction that requires a transaction fee of %s"
|
||||
msgstr "Esta transferência requer o pagamento de uma taxa de transacção de %s"
|
||||
|
||||
#: ../../../ui.cpp:2048
|
||||
msgid "Transaction creation failed"
|
||||
msgstr "A criação da transacção falhou"
|
||||
|
||||
#: ../../../ui.cpp:2055
|
||||
msgid "Transaction aborted"
|
||||
msgstr "Transacção cancelada"
|
||||
|
||||
#: ../../../ui.cpp:2063
|
||||
msgid "Lost connection, transaction cancelled"
|
||||
msgstr "Perca de ligação, transacção cancelada"
|
||||
|
||||
#: ../../../ui.cpp:2079
|
||||
msgid "Sending payment..."
|
||||
msgstr "A enviar pagamento ..."
|
||||
|
||||
#: ../../../ui.cpp:2085
|
||||
msgid "The transaction was rejected. This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here."
|
||||
msgstr "A transacção foi rejeitada. Isto pode acontecer se algumas das moedas na sua carteira já foram utilizadas, como na utilização de uma cópia do wallet.dat, onde as moedas foram utilizadas na cópia do ficheiro e essas alterações não reflectem o estado desta carteira."
|
||||
|
||||
#: ../../../ui.cpp:2092
|
||||
msgid "Waiting for confirmation..."
|
||||
msgstr "A aguardar confirmação ..."
|
||||
|
||||
#: ../../../ui.cpp:2110
|
||||
msgid ""
|
||||
"The payment was sent, but the recipient was unable to verify it.\n"
|
||||
"The transaction is recorded and will credit to the recipient,\n"
|
||||
"but the comment information will be blank."
|
||||
msgstr ""
|
||||
"O pagamento foi enviado, mas o remetente não consegiu verificar o seu pagamento.\n"
|
||||
"A transacção foi entregue, e o remetente receberá as modeas,\n"
|
||||
"no entanto, o comentário de transacção estará vazio."
|
||||
|
||||
#: ../../../ui.cpp:2119
|
||||
msgid "Payment was sent, but an invalid response was received"
|
||||
msgstr "O pagamento foi enviado, mas foi recebida uma resposta inválida"
|
||||
|
||||
#: ../../../ui.cpp:2125
|
||||
msgid "Payment completed"
|
||||
msgstr "Pagamento completo"
|
||||
|
||||
#: ../../../ui.cpp:2156
|
||||
#: ../../../ui.cpp:2302
|
||||
#: ../../../ui.cpp:2339
|
||||
msgid "Name"
|
||||
msgstr "Nome"
|
||||
|
||||
#: ../../../ui.cpp:2157
|
||||
#: ../../../ui.cpp:2302
|
||||
#: ../../../ui.cpp:2339
|
||||
msgid "Address"
|
||||
msgstr "Endereço"
|
||||
|
||||
#: ../../../ui.cpp:2159
|
||||
#: ../../../ui.cpp:2314
|
||||
msgid "Label"
|
||||
msgstr "Nota"
|
||||
|
||||
#: ../../../ui.cpp:2160
|
||||
#: ../../../uibase.cpp:908
|
||||
msgid "Bitcoin Address"
|
||||
msgstr "Endereço Bitcoin"
|
||||
|
||||
#: ../../../ui.cpp:2284
|
||||
msgid "This is one of your own addresses for receiving payments and cannot be entered in the address book. "
|
||||
msgstr "Este endereço é seu (onde recebe pagamentos) e não pode ser introduzido no seu livros de endereços. "
|
||||
|
||||
#: ../../../ui.cpp:2302
|
||||
#: ../../../ui.cpp:2308
|
||||
msgid "Edit Address"
|
||||
msgstr "Editar endereço"
|
||||
|
||||
#: ../../../ui.cpp:2314
|
||||
msgid "Edit Address Label"
|
||||
msgstr "Editar nota de endereço"
|
||||
|
||||
#: ../../../ui.cpp:2339
|
||||
#: ../../../ui.cpp:2345
|
||||
msgid "Add Address"
|
||||
msgstr "Adicionar endereço"
|
||||
|
||||
#: ../../../ui.cpp:2421
|
||||
msgid "Bitcoin"
|
||||
msgstr "Bitcoin"
|
||||
|
||||
#: ../../../ui.cpp:2423
|
||||
msgid "Bitcoin - Generating"
|
||||
msgstr "Bitcoin - A gerar"
|
||||
|
||||
#: ../../../ui.cpp:2425
|
||||
msgid "Bitcoin - (not connected)"
|
||||
msgstr "Bitcoin - (sem ligação)"
|
||||
|
||||
#: ../../../ui.cpp:2500
|
||||
msgid "&Open Bitcoin"
|
||||
msgstr "&Abrir Bitcoin"
|
||||
|
||||
#: ../../../ui.cpp:2501
|
||||
msgid "O&ptions..."
|
||||
msgstr "O&pções"
|
||||
|
||||
#: ../../../ui.cpp:2502
|
||||
#: ../../../uibase.cpp:34
|
||||
msgid "&Generate Coins"
|
||||
msgstr "&Gerar Moedas"
|
||||
|
||||
#: ../../../ui.cpp:2505
|
||||
#: ../../../uibase.cpp:27
|
||||
msgid "E&xit"
|
||||
msgstr "S&air"
|
||||
|
||||
#: ../../../uibase.cpp:30
|
||||
msgid "&File"
|
||||
msgstr "&Ficheiro"
|
||||
|
||||
#: ../../../uibase.cpp:38
|
||||
msgid "&Your Receiving Addresses..."
|
||||
msgstr "&Os seus endereços"
|
||||
|
||||
#: ../../../uibase.cpp:42
|
||||
msgid "&Options..."
|
||||
msgstr "&Opções ..."
|
||||
|
||||
#: ../../../uibase.cpp:45
|
||||
msgid "&Settings"
|
||||
msgstr "&Definições"
|
||||
|
||||
#: ../../../uibase.cpp:49
|
||||
msgid "&About..."
|
||||
msgstr "&Sobre ..."
|
||||
|
||||
#: ../../../uibase.cpp:52
|
||||
msgid "&Help"
|
||||
msgstr "&Ajuda"
|
||||
|
||||
#: ../../../uibase.cpp:62
|
||||
msgid "Address Book"
|
||||
msgstr "Livro de Endereços"
|
||||
|
||||
#: ../../../uibase.cpp:77
|
||||
msgid "Your Bitcoin Address:"
|
||||
msgstr "O seu endereço Bitcoin:"
|
||||
|
||||
#: ../../../uibase.cpp:84
|
||||
msgid " &New... "
|
||||
msgstr " &Novo ... "
|
||||
|
||||
#: ../../../uibase.cpp:87
|
||||
#: ../../../uibase.cpp:851
|
||||
#: ../../../uibase.cpp:954
|
||||
msgid " &Copy to Clipboard "
|
||||
msgstr " &Copiar para o Clipboard "
|
||||
|
||||
#: ../../../uibase.cpp:102
|
||||
msgid "Balance:"
|
||||
msgstr "Saldo:"
|
||||
|
||||
#: ../../../uibase.cpp:121
|
||||
msgid " All"
|
||||
msgstr " Todos"
|
||||
|
||||
#: ../../../uibase.cpp:121
|
||||
msgid " Sent"
|
||||
msgstr " Enviado"
|
||||
|
||||
#: ../../../uibase.cpp:121
|
||||
msgid " Received"
|
||||
msgstr " Recebido"
|
||||
|
||||
#: ../../../uibase.cpp:121
|
||||
msgid " In Progress"
|
||||
msgstr " Em progresso"
|
||||
|
||||
#: ../../../uibase.cpp:142
|
||||
msgid "All Transactions"
|
||||
msgstr "Todas as transacções"
|
||||
|
||||
#: ../../../uibase.cpp:153
|
||||
msgid "Sent/Received"
|
||||
msgstr "Enviadas/Recebidas"
|
||||
|
||||
#: ../../../uibase.cpp:164
|
||||
msgid "Sent"
|
||||
msgstr "Enviado"
|
||||
|
||||
#: ../../../uibase.cpp:175
|
||||
msgid "Received"
|
||||
msgstr "Recebido"
|
||||
|
||||
#: ../../../uibase.cpp:318
|
||||
#: ../../../uibase.cpp:479
|
||||
#: ../../../uibase.cpp:580
|
||||
#: ../../../uibase.cpp:793
|
||||
#: ../../../uibase.cpp:854
|
||||
#: ../../../uibase.cpp:963
|
||||
#: ../../../uibase.cpp:1052
|
||||
msgid "OK"
|
||||
msgstr "OK"
|
||||
|
||||
#: ../../../uibase.cpp:361
|
||||
msgid "Optional transaction fee you give to the nodes that process your transactions."
|
||||
msgstr "Pagamento de taxa de transacção opcional que é entregue aos nós que ajudam a processar o seu pagamento"
|
||||
|
||||
#: ../../../uibase.cpp:370
|
||||
msgid "Transaction fee:"
|
||||
msgstr "Taxa de transacção:"
|
||||
|
||||
#: ../../../uibase.cpp:386
|
||||
msgid "&Limit coin generation to"
|
||||
msgstr "&Limitar a geração de moedas a"
|
||||
|
||||
#: ../../../uibase.cpp:393
|
||||
msgid "processors"
|
||||
msgstr "processadores"
|
||||
|
||||
#: ../../../uibase.cpp:399
|
||||
msgid "&Start Bitcoin on system startup"
|
||||
msgstr "&Iniciar o Bitcoin no arranque do sistema"
|
||||
|
||||
#: ../../../uibase.cpp:403
|
||||
msgid "&Minimize to the tray instead of the taskbar"
|
||||
msgstr "&Minimizar para a zona do relógio em vez da barra de janelas"
|
||||
|
||||
#: ../../../uibase.cpp:407
|
||||
msgid "M&inimize to the tray on close"
|
||||
msgstr "M&inimizar para a zona do relógio ao fechar"
|
||||
|
||||
#: ../../../uibase.cpp:414
|
||||
msgid "&Connect through socks4 proxy: "
|
||||
msgstr "&Ligar através de um prozy socks4: "
|
||||
|
||||
#: ../../../uibase.cpp:426
|
||||
msgid "Proxy &IP:"
|
||||
msgstr "Proxy &IP:"
|
||||
|
||||
#: ../../../uibase.cpp:434
|
||||
msgid " &Port:"
|
||||
msgstr " &Porto:"
|
||||
|
||||
#: ../../../uibase.cpp:456
|
||||
msgid "// [don't translate] Test panel 2 for future expansion"
|
||||
msgstr ""
|
||||
|
||||
#: ../../../uibase.cpp:460
|
||||
msgid "// [don't translate] Let's not start multiple pages until the first page is filled up"
|
||||
msgstr ""
|
||||
|
||||
#: ../../../uibase.cpp:482
|
||||
#: ../../../uibase.cpp:735
|
||||
#: ../../../uibase.cpp:798
|
||||
#: ../../../uibase.cpp:857
|
||||
#: ../../../uibase.cpp:966
|
||||
#: ../../../uibase.cpp:1055
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
#: ../../../uibase.cpp:485
|
||||
msgid "&Apply"
|
||||
msgstr "&Aplicar"
|
||||
|
||||
#: ../../../uibase.cpp:546
|
||||
msgid "Bitcoin "
|
||||
msgstr "Bitcoin "
|
||||
|
||||
#: ../../../uibase.cpp:552
|
||||
msgid "version"
|
||||
msgstr "versão"
|
||||
|
||||
#: ../../../uibase.cpp:563
|
||||
msgid ""
|
||||
"Copyright (c) 2009-2010 Satoshi Nakamoto.\n"
|
||||
"\n"
|
||||
"This is experimental software.\n"
|
||||
"\n"
|
||||
"Distributed under the MIT/X11 software license, see the accompanying file \n"
|
||||
"license.txt or http://www.opensource.org/licenses/mit-license.php.\n"
|
||||
"\n"
|
||||
"This product includes software developed by the OpenSSL Project for use in the \n"
|
||||
"OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by \n"
|
||||
"Eric Young (eay@cryptsoft.com)."
|
||||
msgstr ""
|
||||
"Copyright (c) 2009-2010 Satoshi Nakamoto.\n"
|
||||
"\n"
|
||||
"Este software é experimental.\n"
|
||||
"\n"
|
||||
"Distribuído sob a licença de software MIT/X11. Veja os seguintes ficheiros \n"
|
||||
"para mais informações license.txt ou \n"
|
||||
"http://www.opensource.org/licenses/mit-license.php.\n"
|
||||
"Este producto inclui software desenvolvido pelo projecto OpenSSL, para \n"
|
||||
"ser utilizado no OpenSSL Toolkit (http://www.openssl.org) e software de \n"
|
||||
"criptografia desenvolvido por Eric Young (eay@cryptsoft.com)."
|
||||
|
||||
#: ../../../uibase.cpp:619
|
||||
msgid "Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJED9L) or IP address (e.g. 123.45.6.7)"
|
||||
msgstr "Introduza um endereço Bitcoin (exemplo: 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJED9L) ou um endereço de IP (exemplo: 123.45.6.7)"
|
||||
|
||||
#: ../../../uibase.cpp:633
|
||||
msgid "Pay &To:"
|
||||
msgstr "Pagar &a:"
|
||||
|
||||
#: ../../../uibase.cpp:648
|
||||
msgid "&Paste"
|
||||
msgstr "&Colar"
|
||||
|
||||
#: ../../../uibase.cpp:651
|
||||
msgid " Address &Book..."
|
||||
msgstr " Livro de endereços ..."
|
||||
|
||||
#: ../../../uibase.cpp:658
|
||||
msgid "&Amount:"
|
||||
msgstr "&Quantia:"
|
||||
|
||||
#: ../../../uibase.cpp:668
|
||||
msgid "T&ransfer:"
|
||||
msgstr "T&ransferência:"
|
||||
|
||||
#: ../../../uibase.cpp:674
|
||||
msgid " Standard"
|
||||
msgstr " Standard"
|
||||
|
||||
#: ../../../uibase.cpp:696
|
||||
msgid "&From:"
|
||||
msgstr "&De:"
|
||||
|
||||
#: ../../../uibase.cpp:713
|
||||
msgid "&Message:"
|
||||
msgstr "&Mensagem:"
|
||||
|
||||
#: ../../../uibase.cpp:730
|
||||
msgid "&Send"
|
||||
msgstr "&Enviar"
|
||||
|
||||
#: ../../../uibase.cpp:782
|
||||
msgid ""
|
||||
"\n"
|
||||
"\n"
|
||||
"Connecting..."
|
||||
msgstr ""
|
||||
"\n"
|
||||
"\n"
|
||||
"A estabelecer ligação ..."
|
||||
|
||||
#: ../../../uibase.cpp:832
|
||||
msgid "These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. The highlighted address is displayed in the main window."
|
||||
msgstr "Estes são os seus endereços de Bitcoin onde poderá receber os seus pagamentos. Pode dar um endereço diferente a cada pessoa ou identidade para ter uma melhor ideia sobre quem o está a pagar. O endereço seleccionado será o que aparecerá na janela principal."
|
||||
|
||||
#: ../../../uibase.cpp:845
|
||||
#: ../../../uibase.cpp:957
|
||||
msgid "&Edit..."
|
||||
msgstr "&Editar ..."
|
||||
|
||||
#: ../../../uibase.cpp:848
|
||||
#: ../../../uibase.cpp:960
|
||||
msgid " &New Address... "
|
||||
msgstr " &Novo endereço ... "
|
||||
|
||||
#: ../../../uibase.cpp:920
|
||||
msgid "Sending"
|
||||
msgstr "A enviar"
|
||||
|
||||
#: ../../../uibase.cpp:928
|
||||
msgid "These are your Bitcoin addresses for receiving payments. You can give a different one to each sender to keep track of who is paying you. The highlighted address will be displayed in the main window."
|
||||
msgstr "Estes são os seus endereços de Bitcoin onde poderá receber os seus pagamentos. Pode dar um endereço diferente a cada pessoa ou identidade para ter uma melhor ideia sobre quem o está a pagar. O endereço seleccionado será o que aparecerá na janela principal."
|
||||
|
||||
#: ../../../uibase.cpp:941
|
||||
msgid "Receiving"
|
||||
msgstr "A receber"
|
||||
|
||||
#: ../../../uibase.cpp:951
|
||||
msgid "&Delete"
|
||||
msgstr "&Remover"
|
||||
|
||||
#: ../../../uibase.h:150
|
||||
msgid "Transaction Details"
|
||||
msgstr "Detalhes da transacção"
|
||||
|
||||
#: ../../../uibase.h:203
|
||||
msgid "Options"
|
||||
msgstr "Opções"
|
||||
|
||||
#: ../../../uibase.h:231
|
||||
msgid "About Bitcoin"
|
||||
msgstr "Sobre o Bitcoin"
|
||||
|
||||
#: ../../../uibase.h:341
|
||||
msgid "Your Bitcoin Addresses"
|
||||
msgstr "O seu endereço de Bitcoin"
|
||||
@@ -1,5 +0,0 @@
|
||||
put bitcoin.po and bitcoin.mo files at:
|
||||
locale/<langcode>/LC_MESSAGES/bitcoin.mo and .po
|
||||
|
||||
.po is the sourcefile
|
||||
.mo is the compiled translation
|
||||
@@ -1,76 +0,0 @@
|
||||
# Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
# Distributed under the MIT/X11 software license, see the accompanying
|
||||
# file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
|
||||
# for wxWidgets-2.8.x, search and replace "mswud"->"mswd" and "29u"->"28"
|
||||
|
||||
INCLUDEPATHS= \
|
||||
-I"/boost" \
|
||||
-I"/db/build_unix" \
|
||||
-I"/openssl/include" \
|
||||
-I"/wxwidgets/lib/gcc_lib/mswud" \
|
||||
-I"/wxwidgets/include"
|
||||
|
||||
LIBPATHS= \
|
||||
-L"/boost/stage/lib" \
|
||||
-L"/db/build_unix" \
|
||||
-L"/openssl/out" \
|
||||
-L"/wxwidgets/lib/gcc_lib"
|
||||
|
||||
WXLIBS= \
|
||||
-l wxmsw29ud_html -l wxmsw29ud_core -l wxmsw29ud_adv -l wxbase29ud -l wxtiffd -l wxjpegd -l wxpngd -l wxzlibd
|
||||
|
||||
LIBS= \
|
||||
-l libboost_system-mgw34-mt-d -l libboost_filesystem-mgw34-mt-d \
|
||||
-l db_cxx \
|
||||
-l eay32 \
|
||||
-l kernel32 -l user32 -l gdi32 -l comdlg32 -l winspool -l winmm -l shell32 -l comctl32 -l ole32 -l oleaut32 -l uuid -l rpcrt4 -l advapi32 -l ws2_32 -l shlwapi
|
||||
|
||||
WXDEFS=-DWIN32 -D__WXMSW__ -D_WINDOWS -DNOPCH
|
||||
DEBUGFLAGS=-g -D__WXDEBUG__
|
||||
CFLAGS=-mthreads -O2 -w -Wno-invalid-offsetof -Wformat $(DEBUGFLAGS) $(WXDEFS) $(INCLUDEPATHS)
|
||||
HEADERS=headers.h strlcpy.h serialize.h uint256.h util.h key.h bignum.h base58.h \
|
||||
script.h db.h net.h irc.h main.h rpc.h uibase.h ui.h init.h sha.h
|
||||
|
||||
|
||||
all: bitcoin.exe
|
||||
|
||||
|
||||
headers.h.gch: headers.h $(HEADERS)
|
||||
g++ -c $(CFLAGS) -o $@ $<
|
||||
|
||||
obj/%.o: %.cpp $(HEADERS) headers.h.gch
|
||||
g++ -c $(CFLAGS) -o $@ $<
|
||||
|
||||
obj/sha.o: sha.cpp sha.h
|
||||
g++ -c $(CFLAGS) -O3 -o $@ $<
|
||||
|
||||
obj/ui_res.o: ui.rc rc/bitcoin.ico rc/check.ico rc/send16.bmp rc/send16mask.bmp rc/send16masknoshadow.bmp rc/send20.bmp rc/send20mask.bmp rc/addressbook16.bmp rc/addressbook16mask.bmp rc/addressbook20.bmp rc/addressbook20mask.bmp
|
||||
windres $(WXDEFS) $(INCLUDEPATHS) -o $@ -i $<
|
||||
|
||||
OBJS= \
|
||||
obj/util.o \
|
||||
obj/script.o \
|
||||
obj/db.o \
|
||||
obj/net.o \
|
||||
obj/irc.o \
|
||||
obj/main.o \
|
||||
obj/rpc.o \
|
||||
obj/init.o
|
||||
|
||||
bitcoin.exe: $(OBJS) obj/ui.o obj/uibase.o obj/sha.o obj/ui_res.o
|
||||
g++ $(CFLAGS) -mwindows -Wl,--subsystem,windows -o $@ $(LIBPATHS) $^ $(WXLIBS) $(LIBS)
|
||||
|
||||
|
||||
obj/nogui/%.o: %.cpp $(HEADERS)
|
||||
g++ -c $(CFLAGS) -DwxUSE_GUI=0 -o $@ $<
|
||||
|
||||
bitcoind.exe: $(OBJS:obj/%=obj/nogui/%) obj/sha.o obj/ui_res.o
|
||||
g++ $(CFLAGS) -o $@ $(LIBPATHS) $^ -l wxbase29ud $(LIBS)
|
||||
|
||||
|
||||
clean:
|
||||
-del /Q obj\*
|
||||
-del /Q obj\nogui\*
|
||||
-del /Q headers.h.gch
|
||||
65
makefile.osx
@@ -1,65 +0,0 @@
|
||||
# Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
# Distributed under the MIT/X11 software license, see the accompanying
|
||||
# file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
# Mac OS X makefile for bitcoin
|
||||
# Laszlo Hanyecz (solar@heliacal.net)
|
||||
|
||||
DEPSDIR=/Users/macosuser/bitcoin/deps
|
||||
|
||||
INCLUDEPATHS= \
|
||||
-I"$(DEPSDIR)/include"
|
||||
|
||||
LIBPATHS= \
|
||||
-L"$(DEPSDIR)/lib"
|
||||
|
||||
WXLIBS=$(shell $(DEPSDIR)/bin/wx-config --libs --static)
|
||||
|
||||
LIBS= -dead_strip \
|
||||
$(DEPSDIR)/lib/libdb_cxx-4.8.a \
|
||||
$(DEPSDIR)/lib/libboost_system.a \
|
||||
$(DEPSDIR)/lib/libboost_filesystem.a \
|
||||
$(DEPSDIR)/lib/libcrypto.a
|
||||
|
||||
WXDEFS=$(shell $(DEPSDIR)/bin/wx-config --cxxflags) -DNOPCH -DMSG_NOSIGNAL=0
|
||||
|
||||
DEBUGFLAGS=-g -DwxDEBUG_LEVEL=0
|
||||
# ppc doesn't work because we don't support big-endian
|
||||
CFLAGS=-mmacosx-version-min=10.5 -arch i386 -arch x86_64 -O2 -Wno-invalid-offsetof -Wformat $(DEBUGFLAGS) $(WXDEFS) $(INCLUDEPATHS)
|
||||
HEADERS=headers.h strlcpy.h serialize.h uint256.h util.h key.h bignum.h base58.h \
|
||||
script.h db.h net.h irc.h main.h rpc.h uibase.h ui.h init.h sha.h
|
||||
|
||||
|
||||
all: bitcoin
|
||||
|
||||
|
||||
obj/%.o: %.cpp $(HEADERS)
|
||||
g++ -c $(CFLAGS) -o $@ $<
|
||||
|
||||
obj/sha.o: sha.cpp sha.h
|
||||
g++ -c $(CFLAGS) -O3 -o $@ $<
|
||||
|
||||
OBJS= \
|
||||
obj/util.o \
|
||||
obj/script.o \
|
||||
obj/db.o \
|
||||
obj/net.o \
|
||||
obj/irc.o \
|
||||
obj/main.o \
|
||||
obj/rpc.o \
|
||||
obj/init.o
|
||||
|
||||
bitcoin: $(OBJS) obj/ui.o obj/uibase.o obj/sha.o
|
||||
g++ $(CFLAGS) -o $@ $(LIBPATHS) $^ $(WXLIBS) $(LIBS)
|
||||
|
||||
|
||||
obj/nogui/%.o: %.cpp $(HEADERS)
|
||||
g++ -c $(CFLAGS) -DwxUSE_GUI=0 -o $@ $<
|
||||
|
||||
bitcoind: $(OBJS:obj/%=obj/nogui/%) obj/sha.o
|
||||
g++ $(CFLAGS) -o $@ $(LIBPATHS) $^ $(WXLIBS) $(LIBS)
|
||||
|
||||
|
||||
clean:
|
||||
-rm -f obj/*.o
|
||||
-rm -f obj/nogui/*.o
|
||||
@@ -1,73 +0,0 @@
|
||||
# Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
# Distributed under the MIT/X11 software license, see the accompanying
|
||||
# file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
|
||||
|
||||
INCLUDEPATHS= \
|
||||
-I"/usr/include" \
|
||||
-I"/usr/local/include/wx-2.9" \
|
||||
-I"/usr/local/lib/wx/include/gtk2-unicode-debug-static-2.9"
|
||||
|
||||
LIBPATHS= \
|
||||
-L"/usr/lib" \
|
||||
-L"/usr/local/lib"
|
||||
|
||||
WXLIBS= \
|
||||
-Wl,-Bstatic \
|
||||
-l wx_gtk2ud-2.9 \
|
||||
-Wl,-Bdynamic \
|
||||
-l gtk-x11-2.0 -l SM
|
||||
|
||||
LIBS= \
|
||||
-Wl,-Bstatic \
|
||||
-l boost_system -l boost_filesystem \
|
||||
-l db_cxx \
|
||||
-l crypto \
|
||||
-Wl,-Bdynamic \
|
||||
-l gthread-2.0
|
||||
|
||||
WXDEFS=-D__WXGTK__ -DNOPCH
|
||||
DEBUGFLAGS=-g -D__WXDEBUG__
|
||||
CFLAGS=-O2 -Wno-invalid-offsetof -Wformat $(DEBUGFLAGS) $(WXDEFS) $(INCLUDEPATHS)
|
||||
HEADERS=headers.h strlcpy.h serialize.h uint256.h util.h key.h bignum.h base58.h \
|
||||
script.h db.h net.h irc.h main.h rpc.h uibase.h ui.h init.h sha.h
|
||||
|
||||
|
||||
all: bitcoin
|
||||
|
||||
|
||||
headers.h.gch: headers.h $(HEADERS)
|
||||
g++ -c $(CFLAGS) -o $@ $<
|
||||
|
||||
obj/%.o: %.cpp $(HEADERS) headers.h.gch
|
||||
g++ -c $(CFLAGS) -o $@ $<
|
||||
|
||||
obj/sha.o: sha.cpp sha.h
|
||||
g++ -c $(CFLAGS) -O3 -o $@ $<
|
||||
|
||||
OBJS= \
|
||||
obj/util.o \
|
||||
obj/script.o \
|
||||
obj/db.o \
|
||||
obj/net.o \
|
||||
obj/irc.o \
|
||||
obj/main.o \
|
||||
obj/rpc.o \
|
||||
obj/init.o
|
||||
|
||||
bitcoin: $(OBJS) obj/ui.o obj/uibase.o obj/sha.o
|
||||
g++ $(CFLAGS) -o $@ $(LIBPATHS) $^ $(WXLIBS) $(LIBS)
|
||||
|
||||
|
||||
obj/nogui/%.o: %.cpp $(HEADERS)
|
||||
g++ -c $(CFLAGS) -DwxUSE_GUI=0 -o $@ $<
|
||||
|
||||
bitcoind: $(OBJS:obj/%=obj/nogui/%) obj/sha.o
|
||||
g++ $(CFLAGS) -o $@ $(LIBPATHS) $^ -l wx_baseud-2.9 $(LIBS)
|
||||
|
||||
|
||||
clean:
|
||||
-rm -f obj/*.o
|
||||
-rm -f obj/nogui/*.o
|
||||
-rm -f headers.h.gch
|
||||
107
makefile.vc
@@ -1,107 +0,0 @@
|
||||
# Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
# Distributed under the MIT/X11 software license, see the accompanying
|
||||
# file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
|
||||
# for wxWidgets-2.8.x, search and replace "mswud"->"mswd" and "29u"->"28"
|
||||
|
||||
INCLUDEPATHS= \
|
||||
/I"/boost" \
|
||||
/I"/db/build_windows" \
|
||||
/I"/openssl/include" \
|
||||
/I"/wxwidgets/lib/vc_lib/mswud" \
|
||||
/I"/wxwidgets/include"
|
||||
|
||||
LIBPATHS= \
|
||||
/LIBPATH:"/boost/stage/lib" \
|
||||
/LIBPATH:"/db/build_windows/debug" \
|
||||
/LIBPATH:"/openssl/out" \
|
||||
/LIBPATH:"/wxwidgets/lib/vc_lib"
|
||||
|
||||
LIBS= \
|
||||
libboost_system-vc80-mt-gd.lib libboost_filesystem-vc80-mt-gd.lib \
|
||||
libdb47sd.lib \
|
||||
libeay32.lib \
|
||||
wxmsw29ud_html.lib wxmsw29ud_core.lib wxmsw29ud_adv.lib wxbase29ud.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib \
|
||||
kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib ws2_32.lib shlwapi.lib
|
||||
|
||||
WXDEFS=/DWIN32 /D__WXMSW__ /D_WINDOWS /DNOPCH
|
||||
DEBUGFLAGS=/Zi /Od /D__WXDEBUG__
|
||||
CFLAGS=/c /nologo /Ob0 /MDd /EHsc /GR /Zm300 $(DEBUGFLAGS) $(WXDEFS) $(INCLUDEPATHS)
|
||||
HEADERS=headers.h strlcpy.h serialize.h uint256.h util.h key.h bignum.h base58.h \
|
||||
script.h db.h net.h irc.h main.h rpc.h uibase.h ui.h init.h sha.h
|
||||
|
||||
|
||||
all: bitcoin.exe
|
||||
|
||||
|
||||
.cpp{obj}.obj:
|
||||
cl $(CFLAGS) /Fo$@ %s
|
||||
|
||||
obj\util.obj: $(HEADERS)
|
||||
|
||||
obj\script.obj: $(HEADERS)
|
||||
|
||||
obj\db.obj: $(HEADERS)
|
||||
|
||||
obj\net.obj: $(HEADERS)
|
||||
|
||||
obj\irc.obj: $(HEADERS)
|
||||
|
||||
obj\main.obj: $(HEADERS)
|
||||
|
||||
obj\rpc.obj: $(HEADERS)
|
||||
|
||||
obj\init.obj: $(HEADERS)
|
||||
|
||||
obj\ui.obj: $(HEADERS)
|
||||
|
||||
obj\uibase.obj: $(HEADERS)
|
||||
|
||||
obj\sha.obj: sha.cpp sha.h
|
||||
cl $(CFLAGS) /O2 /Fo$@ %s
|
||||
|
||||
obj\ui.res: ui.rc rc/bitcoin.ico rc/check.ico rc/send16.bmp rc/send16mask.bmp rc/send16masknoshadow.bmp rc/send20.bmp rc/send20mask.bmp rc/addressbook16.bmp rc/addressbook16mask.bmp rc/addressbook20.bmp rc/addressbook20mask.bmp
|
||||
rc $(INCLUDEPATHS) $(WXDEFS) /Fo$@ %s
|
||||
|
||||
OBJS= \
|
||||
obj\util.obj \
|
||||
obj\script.obj \
|
||||
obj\db.obj \
|
||||
obj\net.obj \
|
||||
obj\irc.obj \
|
||||
obj\main.obj \
|
||||
obj\rpc.obj \
|
||||
obj\init.obj
|
||||
|
||||
bitcoin.exe: $(OBJS) obj\ui.obj obj\uibase.obj obj\sha.obj obj\ui.res
|
||||
link /nologo /DEBUG /SUBSYSTEM:WINDOWS /OUT:$@ $(LIBPATHS) $** $(LIBS)
|
||||
|
||||
|
||||
.cpp{obj\nogui}.obj:
|
||||
cl $(CFLAGS) /DwxUSE_GUI=0 /Fo$@ %s
|
||||
|
||||
obj\nogui\util.obj: $(HEADERS)
|
||||
|
||||
obj\nogui\script.obj: $(HEADERS)
|
||||
|
||||
obj\nogui\db.obj: $(HEADERS)
|
||||
|
||||
obj\nogui\net.obj: $(HEADERS)
|
||||
|
||||
obj\nogui\irc.obj: $(HEADERS)
|
||||
|
||||
obj\nogui\main.obj: $(HEADERS)
|
||||
|
||||
obj\nogui\rpc.obj: $(HEADERS)
|
||||
|
||||
obj\nogui\init.obj: $(HEADERS)
|
||||
|
||||
bitcoind.exe: $(OBJS:obj\=obj\nogui\) obj\sha.obj obj\ui.res
|
||||
link /nologo /DEBUG /OUT:$@ $(LIBPATHS) $** $(LIBS)
|
||||
|
||||
|
||||
clean:
|
||||
-del /Q obj\*
|
||||
-del *.ilk
|
||||
-del *.pdb
|
||||
BIN
rc/bitcoin.ico
|
Before Width: | Height: | Size: 25 KiB |
986
rpc.cpp
@@ -1,986 +0,0 @@
|
||||
// Copyright (c) 2010 Satoshi Nakamoto
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include "headers.h"
|
||||
#undef printf
|
||||
#include <boost/asio.hpp>
|
||||
#include "json/json_spirit_reader_template.h"
|
||||
#include "json/json_spirit_writer_template.h"
|
||||
#include "json/json_spirit_utils.h"
|
||||
#define printf OutputDebugStringF
|
||||
// MinGW 3.4.5 gets "fatal error: had to relocate PCH" if the json headers are
|
||||
// precompiled in headers.h. The problem might be when the pch file goes over
|
||||
// a certain size around 145MB. If we need access to json_spirit outside this
|
||||
// file, we could use the compiled json_spirit option.
|
||||
|
||||
using boost::asio::ip::tcp;
|
||||
using namespace json_spirit;
|
||||
|
||||
void ThreadRPCServer2(void* parg);
|
||||
typedef Value(*rpcfn_type)(const Array& params, bool fHelp);
|
||||
extern map<string, rpcfn_type> mapCallTable;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
///
|
||||
/// Note: This interface may still be subject to change.
|
||||
///
|
||||
|
||||
|
||||
|
||||
Value help(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() != 0)
|
||||
throw runtime_error(
|
||||
"help\n"
|
||||
"List commands.");
|
||||
|
||||
string strRet;
|
||||
for (map<string, rpcfn_type>::iterator mi = mapCallTable.begin(); mi != mapCallTable.end(); ++mi)
|
||||
{
|
||||
try
|
||||
{
|
||||
Array params;
|
||||
(*(*mi).second)(params, true);
|
||||
}
|
||||
catch (std::exception& e)
|
||||
{
|
||||
// Help text is returned in an exception
|
||||
string strHelp = string(e.what());
|
||||
if (strHelp.find('\n') != -1)
|
||||
strHelp = strHelp.substr(0, strHelp.find('\n'));
|
||||
strRet += strHelp + "\n";
|
||||
}
|
||||
}
|
||||
strRet = strRet.substr(0,strRet.size()-1);
|
||||
return strRet;
|
||||
}
|
||||
|
||||
|
||||
Value stop(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() != 0)
|
||||
throw runtime_error(
|
||||
"stop\n"
|
||||
"Stop bitcoin server.");
|
||||
|
||||
// Shutdown will take long enough that the response should get back
|
||||
CreateThread(Shutdown, NULL);
|
||||
return "bitcoin server stopping";
|
||||
}
|
||||
|
||||
|
||||
Value getblockcount(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() != 0)
|
||||
throw runtime_error(
|
||||
"getblockcount\n"
|
||||
"Returns the number of blocks in the longest block chain.");
|
||||
|
||||
return nBestHeight + 1;
|
||||
}
|
||||
|
||||
|
||||
Value getblocknumber(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() != 0)
|
||||
throw runtime_error(
|
||||
"getblocknumber\n"
|
||||
"Returns the block number of the latest block in the longest block chain.");
|
||||
|
||||
return nBestHeight;
|
||||
}
|
||||
|
||||
|
||||
Value getconnectioncount(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() != 0)
|
||||
throw runtime_error(
|
||||
"getconnectioncount\n"
|
||||
"Returns the number of connections to other nodes.");
|
||||
|
||||
return (int)vNodes.size();
|
||||
}
|
||||
|
||||
|
||||
double GetDifficulty()
|
||||
{
|
||||
// Floating point number that is a multiple of the minimum difficulty,
|
||||
// minimum difficulty = 1.0.
|
||||
if (pindexBest == NULL)
|
||||
return 1.0;
|
||||
int nShift = 256 - 32 - 31; // to fit in a uint
|
||||
double dMinimum = (CBigNum().SetCompact(bnProofOfWorkLimit.GetCompact()) >> nShift).getuint();
|
||||
double dCurrently = (CBigNum().SetCompact(pindexBest->nBits) >> nShift).getuint();
|
||||
return dMinimum / dCurrently;
|
||||
}
|
||||
|
||||
Value getdifficulty(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() != 0)
|
||||
throw runtime_error(
|
||||
"getdifficulty\n"
|
||||
"Returns the proof-of-work difficulty as a multiple of the minimum difficulty.");
|
||||
|
||||
return GetDifficulty();
|
||||
}
|
||||
|
||||
|
||||
Value getbalance(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() != 0)
|
||||
throw runtime_error(
|
||||
"getbalance\n"
|
||||
"Returns the server's available balance.");
|
||||
|
||||
return ((double)GetBalance() / (double)COIN);
|
||||
}
|
||||
|
||||
|
||||
Value getgenerate(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() != 0)
|
||||
throw runtime_error(
|
||||
"getgenerate\n"
|
||||
"Returns true or false.");
|
||||
|
||||
return (bool)fGenerateBitcoins;
|
||||
}
|
||||
|
||||
|
||||
Value setgenerate(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() < 1 || params.size() > 2)
|
||||
throw runtime_error(
|
||||
"setgenerate <generate> [genproclimit]\n"
|
||||
"<generate> is true or false to turn generation on or off.\n"
|
||||
"Generation is limited to [genproclimit] processors, -1 is unlimited.");
|
||||
|
||||
bool fGenerate = true;
|
||||
if (params.size() > 0)
|
||||
fGenerate = params[0].get_bool();
|
||||
|
||||
if (params.size() > 1)
|
||||
{
|
||||
int nGenProcLimit = params[1].get_int();
|
||||
fLimitProcessors = (nGenProcLimit != -1);
|
||||
CWalletDB().WriteSetting("fLimitProcessors", fLimitProcessors);
|
||||
if (nGenProcLimit != -1)
|
||||
CWalletDB().WriteSetting("nLimitProcessors", nLimitProcessors = nGenProcLimit);
|
||||
}
|
||||
|
||||
GenerateBitcoins(fGenerate);
|
||||
return Value::null;
|
||||
}
|
||||
|
||||
|
||||
Value getinfo(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() != 0)
|
||||
throw runtime_error(
|
||||
"getinfo");
|
||||
|
||||
Object obj;
|
||||
obj.push_back(Pair("balance", (double)GetBalance() / (double)COIN));
|
||||
obj.push_back(Pair("blocks", (int)nBestHeight + 1));
|
||||
obj.push_back(Pair("connections", (int)vNodes.size()));
|
||||
obj.push_back(Pair("proxy", (fUseProxy ? addrProxy.ToStringIPPort() : string())));
|
||||
obj.push_back(Pair("generate", (bool)fGenerateBitcoins));
|
||||
obj.push_back(Pair("genproclimit", (int)(fLimitProcessors ? nLimitProcessors : -1)));
|
||||
obj.push_back(Pair("difficulty", (double)GetDifficulty()));
|
||||
return obj;
|
||||
}
|
||||
|
||||
|
||||
Value getnewaddress(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() > 1)
|
||||
throw runtime_error(
|
||||
"getnewaddress [label]\n"
|
||||
"Returns a new bitcoin address for receiving payments. "
|
||||
"If [label] is specified (recommended), it is added to the address book "
|
||||
"so payments received with the address will be labeled.");
|
||||
|
||||
// Parse the label first so we don't generate a key if there's an error
|
||||
string strLabel;
|
||||
if (params.size() > 0)
|
||||
strLabel = params[0].get_str();
|
||||
|
||||
// Generate a new key that is added to wallet
|
||||
string strAddress = PubKeyToAddress(GenerateNewKey());
|
||||
|
||||
SetAddressBookName(strAddress, strLabel);
|
||||
return strAddress;
|
||||
}
|
||||
|
||||
|
||||
Value setlabel(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() < 1 || params.size() > 2)
|
||||
throw runtime_error(
|
||||
"setlabel <bitcoinaddress> <label>\n"
|
||||
"Sets the label associated with the given address.");
|
||||
|
||||
string strAddress = params[0].get_str();
|
||||
string strLabel;
|
||||
if (params.size() > 1)
|
||||
strLabel = params[1].get_str();
|
||||
|
||||
SetAddressBookName(strAddress, strLabel);
|
||||
return Value::null;
|
||||
}
|
||||
|
||||
|
||||
Value getlabel(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() != 1)
|
||||
throw runtime_error(
|
||||
"getlabel <bitcoinaddress>\n"
|
||||
"Returns the label associated with the given address.");
|
||||
|
||||
string strAddress = params[0].get_str();
|
||||
|
||||
string strLabel;
|
||||
CRITICAL_BLOCK(cs_mapAddressBook)
|
||||
{
|
||||
map<string, string>::iterator mi = mapAddressBook.find(strAddress);
|
||||
if (mi != mapAddressBook.end() && !(*mi).second.empty())
|
||||
strLabel = (*mi).second;
|
||||
}
|
||||
return strLabel;
|
||||
}
|
||||
|
||||
|
||||
Value getaddressesbylabel(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() != 1)
|
||||
throw runtime_error(
|
||||
"getaddressesbylabel <label>\n"
|
||||
"Returns the list of addresses with the given label.");
|
||||
|
||||
string strLabel = params[0].get_str();
|
||||
|
||||
// Find all addresses that have the given label
|
||||
Array ret;
|
||||
CRITICAL_BLOCK(cs_mapAddressBook)
|
||||
{
|
||||
foreach(const PAIRTYPE(string, string)& item, mapAddressBook)
|
||||
{
|
||||
const string& strAddress = item.first;
|
||||
const string& strName = item.second;
|
||||
if (strName == strLabel)
|
||||
{
|
||||
// We're only adding valid bitcoin addresses and not ip addresses
|
||||
CScript scriptPubKey;
|
||||
if (scriptPubKey.SetBitcoinAddress(strAddress))
|
||||
ret.push_back(strAddress);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
Value sendtoaddress(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() < 2 || params.size() > 4)
|
||||
throw runtime_error(
|
||||
"sendtoaddress <bitcoinaddress> <amount> [comment] [comment-to]\n"
|
||||
"<amount> is a real and is rounded to the nearest 0.01");
|
||||
|
||||
string strAddress = params[0].get_str();
|
||||
|
||||
// Amount
|
||||
if (params[1].get_real() <= 0.0 || params[1].get_real() > 21000000.0)
|
||||
throw runtime_error("Invalid amount");
|
||||
int64 nAmount = roundint64(params[1].get_real() * 100.00) * CENT;
|
||||
|
||||
// Wallet comments
|
||||
CWalletTx wtx;
|
||||
if (params.size() > 2 && params[2].type() != null_type && !params[2].get_str().empty())
|
||||
wtx.mapValue["message"] = params[2].get_str();
|
||||
if (params.size() > 3 && params[3].type() != null_type && !params[3].get_str().empty())
|
||||
wtx.mapValue["to"] = params[3].get_str();
|
||||
|
||||
string strError = SendMoneyToBitcoinAddress(strAddress, nAmount, wtx);
|
||||
if (strError != "")
|
||||
throw runtime_error(strError);
|
||||
return "sent";
|
||||
}
|
||||
|
||||
|
||||
Value listtransactions(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() > 2)
|
||||
throw runtime_error(
|
||||
"listtransactions [count=10] [includegenerated=false]\n"
|
||||
"Returns up to [count] most recent transactions.");
|
||||
|
||||
int64 nCount = 10;
|
||||
if (params.size() > 0)
|
||||
nCount = params[0].get_int64();
|
||||
bool fGenerated = false;
|
||||
if (params.size() > 1)
|
||||
fGenerated = params[1].get_bool();
|
||||
|
||||
Array ret;
|
||||
//// not finished
|
||||
ret.push_back("not implemented yet");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
Value getreceivedbyaddress(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() < 1 || params.size() > 2)
|
||||
throw runtime_error(
|
||||
"getreceivedbyaddress <bitcoinaddress> [minconf=1]\n"
|
||||
"Returns the total amount received by <bitcoinaddress> in transactions with at least [minconf] confirmations.");
|
||||
|
||||
// Bitcoin address
|
||||
string strAddress = params[0].get_str();
|
||||
CScript scriptPubKey;
|
||||
if (!scriptPubKey.SetBitcoinAddress(strAddress))
|
||||
throw runtime_error("Invalid bitcoin address");
|
||||
if (!IsMine(scriptPubKey))
|
||||
return (double)0.0;
|
||||
|
||||
// Minimum confirmations
|
||||
int nMinDepth = 1;
|
||||
if (params.size() > 1)
|
||||
nMinDepth = params[1].get_int();
|
||||
|
||||
// Tally
|
||||
int64 nAmount = 0;
|
||||
CRITICAL_BLOCK(cs_mapWallet)
|
||||
{
|
||||
for (map<uint256, CWalletTx>::iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
|
||||
{
|
||||
const CWalletTx& wtx = (*it).second;
|
||||
if (wtx.IsCoinBase() || !wtx.IsFinal())
|
||||
continue;
|
||||
|
||||
foreach(const CTxOut& txout, wtx.vout)
|
||||
if (txout.scriptPubKey == scriptPubKey)
|
||||
if (wtx.GetDepthInMainChain() >= nMinDepth)
|
||||
nAmount += txout.nValue;
|
||||
}
|
||||
}
|
||||
|
||||
return (double)nAmount / (double)COIN;
|
||||
}
|
||||
|
||||
|
||||
Value getreceivedbylabel(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() < 1 || params.size() > 2)
|
||||
throw runtime_error(
|
||||
"getreceivedbylabel <label> [minconf=1]\n"
|
||||
"Returns the total amount received by addresses with <label> in transactions with at least [minconf] confirmations.");
|
||||
|
||||
// Get the set of pub keys that have the label
|
||||
string strLabel = params[0].get_str();
|
||||
set<CScript> setPubKey;
|
||||
CRITICAL_BLOCK(cs_mapAddressBook)
|
||||
{
|
||||
foreach(const PAIRTYPE(string, string)& item, mapAddressBook)
|
||||
{
|
||||
const string& strAddress = item.first;
|
||||
const string& strName = item.second;
|
||||
if (strName == strLabel)
|
||||
{
|
||||
// We're only counting our own valid bitcoin addresses and not ip addresses
|
||||
CScript scriptPubKey;
|
||||
if (scriptPubKey.SetBitcoinAddress(strAddress))
|
||||
if (IsMine(scriptPubKey))
|
||||
setPubKey.insert(scriptPubKey);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Minimum confirmations
|
||||
int nMinDepth = 1;
|
||||
if (params.size() > 1)
|
||||
nMinDepth = params[1].get_int();
|
||||
|
||||
// Tally
|
||||
int64 nAmount = 0;
|
||||
CRITICAL_BLOCK(cs_mapWallet)
|
||||
{
|
||||
for (map<uint256, CWalletTx>::iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
|
||||
{
|
||||
const CWalletTx& wtx = (*it).second;
|
||||
if (wtx.IsCoinBase() || !wtx.IsFinal())
|
||||
continue;
|
||||
|
||||
foreach(const CTxOut& txout, wtx.vout)
|
||||
if (setPubKey.count(txout.scriptPubKey))
|
||||
if (wtx.GetDepthInMainChain() >= nMinDepth)
|
||||
nAmount += txout.nValue;
|
||||
}
|
||||
}
|
||||
|
||||
return (double)nAmount / (double)COIN;
|
||||
}
|
||||
|
||||
|
||||
struct tallyitem
|
||||
{
|
||||
int64 nAmount;
|
||||
int nConf;
|
||||
tallyitem()
|
||||
{
|
||||
nAmount = 0;
|
||||
nConf = INT_MAX;
|
||||
}
|
||||
};
|
||||
|
||||
Value ListReceived(const Array& params, bool fByLabels)
|
||||
{
|
||||
// Minimum confirmations
|
||||
int nMinDepth = 1;
|
||||
if (params.size() > 0)
|
||||
nMinDepth = params[0].get_int();
|
||||
|
||||
// Whether to include empty accounts
|
||||
bool fIncludeEmpty = false;
|
||||
if (params.size() > 1)
|
||||
fIncludeEmpty = params[1].get_bool();
|
||||
|
||||
// Tally
|
||||
map<uint160, tallyitem> mapTally;
|
||||
CRITICAL_BLOCK(cs_mapWallet)
|
||||
{
|
||||
for (map<uint256, CWalletTx>::iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
|
||||
{
|
||||
const CWalletTx& wtx = (*it).second;
|
||||
if (wtx.IsCoinBase() || !wtx.IsFinal())
|
||||
continue;
|
||||
|
||||
int nDepth = wtx.GetDepthInMainChain();
|
||||
if (nDepth < nMinDepth)
|
||||
continue;
|
||||
|
||||
foreach(const CTxOut& txout, wtx.vout)
|
||||
{
|
||||
// Only counting our own bitcoin addresses and not ip addresses
|
||||
uint160 hash160 = txout.scriptPubKey.GetBitcoinAddressHash160();
|
||||
if (hash160 == 0 || !mapPubKeys.count(hash160)) // IsMine
|
||||
continue;
|
||||
|
||||
tallyitem& item = mapTally[hash160];
|
||||
item.nAmount += txout.nValue;
|
||||
item.nConf = min(item.nConf, nDepth);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Reply
|
||||
Array ret;
|
||||
map<string, tallyitem> mapLabelTally;
|
||||
CRITICAL_BLOCK(cs_mapAddressBook)
|
||||
{
|
||||
foreach(const PAIRTYPE(string, string)& item, mapAddressBook)
|
||||
{
|
||||
const string& strAddress = item.first;
|
||||
const string& strLabel = item.second;
|
||||
uint160 hash160;
|
||||
if (!AddressToHash160(strAddress, hash160))
|
||||
continue;
|
||||
map<uint160, tallyitem>::iterator it = mapTally.find(hash160);
|
||||
if (it == mapTally.end() && !fIncludeEmpty)
|
||||
continue;
|
||||
|
||||
int64 nAmount = 0;
|
||||
int nConf = INT_MAX;
|
||||
if (it != mapTally.end())
|
||||
{
|
||||
nAmount = (*it).second.nAmount;
|
||||
nConf = (*it).second.nConf;
|
||||
}
|
||||
|
||||
if (fByLabels)
|
||||
{
|
||||
tallyitem& item = mapLabelTally[strLabel];
|
||||
item.nAmount += nAmount;
|
||||
item.nConf = min(item.nConf, nConf);
|
||||
}
|
||||
else
|
||||
{
|
||||
Object obj;
|
||||
obj.push_back(Pair("address", strAddress));
|
||||
obj.push_back(Pair("label", strLabel));
|
||||
obj.push_back(Pair("amount", (double)nAmount / (double)COIN));
|
||||
obj.push_back(Pair("confirmations", (nConf == INT_MAX ? 0 : nConf)));
|
||||
ret.push_back(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (fByLabels)
|
||||
{
|
||||
for (map<string, tallyitem>::iterator it = mapLabelTally.begin(); it != mapLabelTally.end(); ++it)
|
||||
{
|
||||
int64 nAmount = (*it).second.nAmount;
|
||||
int nConf = (*it).second.nConf;
|
||||
Object obj;
|
||||
obj.push_back(Pair("label", (*it).first));
|
||||
obj.push_back(Pair("amount", (double)nAmount / (double)COIN));
|
||||
obj.push_back(Pair("confirmations", (nConf == INT_MAX ? 0 : nConf)));
|
||||
ret.push_back(obj);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
Value listreceivedbyaddress(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() > 2)
|
||||
throw runtime_error(
|
||||
"listreceivedbyaddress [minconf=1] [includeempty=false]\n"
|
||||
"[minconf] is the minimum number of confirmations before payments are included.\n"
|
||||
"[includeempty] whether to include addresses that haven't received any payments.\n"
|
||||
"Returns an array of objects containing:\n"
|
||||
" \"address\" : receiving address\n"
|
||||
" \"label\" : the label of the receiving address\n"
|
||||
" \"amount\" : total amount received by the address\n"
|
||||
" \"confirmations\" : number of confirmations of the most recent transaction included");
|
||||
|
||||
return ListReceived(params, false);
|
||||
}
|
||||
|
||||
Value listreceivedbylabel(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() > 2)
|
||||
throw runtime_error(
|
||||
"listreceivedbylabel [minconf=1] [includeempty=false]\n"
|
||||
"[minconf] is the minimum number of confirmations before payments are included.\n"
|
||||
"[includeempty] whether to include labels that haven't received any payments.\n"
|
||||
"Returns an array of objects containing:\n"
|
||||
" \"label\" : the label of the receiving addresses\n"
|
||||
" \"amount\" : total amount received by addresses with this label\n"
|
||||
" \"confirmations\" : number of confirmations of the most recent transaction included");
|
||||
|
||||
return ListReceived(params, true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Call Table
|
||||
//
|
||||
|
||||
pair<string, rpcfn_type> pCallTable[] =
|
||||
{
|
||||
make_pair("help", &help),
|
||||
make_pair("stop", &stop),
|
||||
make_pair("getblockcount", &getblockcount),
|
||||
make_pair("getblocknumber", &getblocknumber),
|
||||
make_pair("getconnectioncount", &getconnectioncount),
|
||||
make_pair("getdifficulty", &getdifficulty),
|
||||
make_pair("getbalance", &getbalance),
|
||||
make_pair("getgenerate", &getgenerate),
|
||||
make_pair("setgenerate", &setgenerate),
|
||||
make_pair("getinfo", &getinfo),
|
||||
make_pair("getnewaddress", &getnewaddress),
|
||||
make_pair("setlabel", &setlabel),
|
||||
make_pair("getlabel", &getlabel),
|
||||
make_pair("getaddressesbylabel", &getaddressesbylabel),
|
||||
make_pair("sendtoaddress", &sendtoaddress),
|
||||
make_pair("listtransactions", &listtransactions),
|
||||
make_pair("getamountreceived", &getreceivedbyaddress), // deprecated, renamed to getreceivedbyaddress
|
||||
make_pair("getallreceived", &listreceivedbyaddress), // deprecated, renamed to listreceivedbyaddress
|
||||
make_pair("getreceivedbyaddress", &getreceivedbyaddress),
|
||||
make_pair("getreceivedbylabel", &getreceivedbylabel),
|
||||
make_pair("listreceivedbyaddress", &listreceivedbyaddress),
|
||||
make_pair("listreceivedbylabel", &listreceivedbylabel),
|
||||
};
|
||||
map<string, rpcfn_type> mapCallTable(pCallTable, pCallTable + sizeof(pCallTable)/sizeof(pCallTable[0]));
|
||||
|
||||
|
||||
|
||||
|
||||
//
|
||||
// HTTP protocol
|
||||
//
|
||||
// This ain't Apache. We're just using HTTP header for the length field
|
||||
// and to be compatible with other JSON-RPC implementations.
|
||||
//
|
||||
|
||||
string HTTPPost(const string& strMsg)
|
||||
{
|
||||
return strprintf(
|
||||
"POST / HTTP/1.1\r\n"
|
||||
"User-Agent: json-rpc/1.0\r\n"
|
||||
"Host: 127.0.0.1\r\n"
|
||||
"Content-Type: application/json\r\n"
|
||||
"Content-Length: %d\r\n"
|
||||
"Accept: application/json\r\n"
|
||||
"\r\n"
|
||||
"%s",
|
||||
strMsg.size(),
|
||||
strMsg.c_str());
|
||||
}
|
||||
|
||||
string HTTPReply(const string& strMsg, int nStatus=200)
|
||||
{
|
||||
string strStatus;
|
||||
if (nStatus == 200) strStatus = "OK";
|
||||
if (nStatus == 500) strStatus = "Internal Server Error";
|
||||
return strprintf(
|
||||
"HTTP/1.1 %d %s\r\n"
|
||||
"Connection: close\r\n"
|
||||
"Content-Length: %d\r\n"
|
||||
"Content-Type: application/json\r\n"
|
||||
"Date: Sat, 08 Jul 2006 12:04:08 GMT\r\n"
|
||||
"Server: json-rpc/1.0\r\n"
|
||||
"\r\n"
|
||||
"%s",
|
||||
nStatus,
|
||||
strStatus.c_str(),
|
||||
strMsg.size(),
|
||||
strMsg.c_str());
|
||||
}
|
||||
|
||||
int ReadHTTPHeader(tcp::iostream& stream)
|
||||
{
|
||||
int nLen = 0;
|
||||
loop
|
||||
{
|
||||
string str;
|
||||
std::getline(stream, str);
|
||||
if (str.empty() || str == "\r")
|
||||
break;
|
||||
if (str.substr(0,15) == "Content-Length:")
|
||||
nLen = atoi(str.substr(15));
|
||||
}
|
||||
return nLen;
|
||||
}
|
||||
|
||||
inline string ReadHTTP(tcp::iostream& stream)
|
||||
{
|
||||
// Read header
|
||||
int nLen = ReadHTTPHeader(stream);
|
||||
if (nLen <= 0)
|
||||
return string();
|
||||
|
||||
// Read message
|
||||
vector<char> vch(nLen);
|
||||
stream.read(&vch[0], nLen);
|
||||
return string(vch.begin(), vch.end());
|
||||
}
|
||||
|
||||
|
||||
|
||||
//
|
||||
// JSON-RPC protocol
|
||||
//
|
||||
// http://json-rpc.org/wiki/specification
|
||||
// http://www.codeproject.com/KB/recipes/JSON_Spirit.aspx
|
||||
//
|
||||
|
||||
string JSONRPCRequest(const string& strMethod, const Array& params, const Value& id)
|
||||
{
|
||||
Object request;
|
||||
request.push_back(Pair("method", strMethod));
|
||||
request.push_back(Pair("params", params));
|
||||
request.push_back(Pair("id", id));
|
||||
return write_string(Value(request), false) + "\n";
|
||||
}
|
||||
|
||||
string JSONRPCReply(const Value& result, const Value& error, const Value& id)
|
||||
{
|
||||
Object reply;
|
||||
if (error.type() != null_type)
|
||||
reply.push_back(Pair("result", Value::null));
|
||||
else
|
||||
reply.push_back(Pair("result", result));
|
||||
reply.push_back(Pair("error", error));
|
||||
reply.push_back(Pair("id", id));
|
||||
return write_string(Value(reply), false) + "\n";
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void ThreadRPCServer(void* parg)
|
||||
{
|
||||
IMPLEMENT_RANDOMIZE_STACK(ThreadRPCServer(parg));
|
||||
try
|
||||
{
|
||||
vnThreadsRunning[4]++;
|
||||
ThreadRPCServer2(parg);
|
||||
vnThreadsRunning[4]--;
|
||||
}
|
||||
catch (std::exception& e) {
|
||||
vnThreadsRunning[4]--;
|
||||
PrintException(&e, "ThreadRPCServer()");
|
||||
} catch (...) {
|
||||
vnThreadsRunning[4]--;
|
||||
PrintException(NULL, "ThreadRPCServer()");
|
||||
}
|
||||
printf("ThreadRPCServer exiting\n");
|
||||
}
|
||||
|
||||
void ThreadRPCServer2(void* parg)
|
||||
{
|
||||
printf("ThreadRPCServer started\n");
|
||||
|
||||
// Bind to loopback 127.0.0.1 so the socket can only be accessed locally
|
||||
boost::asio::io_service io_service;
|
||||
tcp::endpoint endpoint(boost::asio::ip::address_v4::loopback(), 8332);
|
||||
tcp::acceptor acceptor(io_service, endpoint);
|
||||
|
||||
loop
|
||||
{
|
||||
// Accept connection
|
||||
tcp::iostream stream;
|
||||
tcp::endpoint peer;
|
||||
vnThreadsRunning[4]--;
|
||||
acceptor.accept(*stream.rdbuf(), peer);
|
||||
vnThreadsRunning[4]++;
|
||||
if (fShutdown)
|
||||
return;
|
||||
|
||||
// Shouldn't be possible for anyone else to connect, but just in case
|
||||
if (peer.address().to_string() != "127.0.0.1")
|
||||
continue;
|
||||
|
||||
// Receive request
|
||||
string strRequest = ReadHTTP(stream);
|
||||
printf("ThreadRPCServer request=%s", strRequest.c_str());
|
||||
|
||||
// Handle multiple invocations per request
|
||||
string::iterator begin = strRequest.begin();
|
||||
while (skipspaces(begin), begin != strRequest.end())
|
||||
{
|
||||
string::iterator prev = begin;
|
||||
Value id;
|
||||
try
|
||||
{
|
||||
// Parse request
|
||||
Value valRequest;
|
||||
if (!read_range(begin, strRequest.end(), valRequest))
|
||||
throw runtime_error("Parse error.");
|
||||
const Object& request = valRequest.get_obj();
|
||||
if (find_value(request, "method").type() != str_type ||
|
||||
find_value(request, "params").type() != array_type)
|
||||
throw runtime_error("Invalid request.");
|
||||
|
||||
string strMethod = find_value(request, "method").get_str();
|
||||
const Array& params = find_value(request, "params").get_array();
|
||||
id = find_value(request, "id");
|
||||
|
||||
// Execute
|
||||
map<string, rpcfn_type>::iterator mi = mapCallTable.find(strMethod);
|
||||
if (mi == mapCallTable.end())
|
||||
throw runtime_error("Method not found.");
|
||||
Value result = (*(*mi).second)(params, false);
|
||||
|
||||
// Send reply
|
||||
string strReply = JSONRPCReply(result, Value::null, id);
|
||||
stream << HTTPReply(strReply, 200) << std::flush;
|
||||
}
|
||||
catch (std::exception& e)
|
||||
{
|
||||
// Send error reply
|
||||
string strReply = JSONRPCReply(Value::null, e.what(), id);
|
||||
stream << HTTPReply(strReply, 500) << std::flush;
|
||||
}
|
||||
if (begin == prev)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Value CallRPC(const string& strMethod, const Array& params)
|
||||
{
|
||||
// Connect to localhost
|
||||
tcp::iostream stream("127.0.0.1", "8332");
|
||||
if (stream.fail())
|
||||
throw runtime_error("couldn't connect to server");
|
||||
|
||||
// Send request
|
||||
string strRequest = JSONRPCRequest(strMethod, params, 1);
|
||||
stream << HTTPPost(strRequest) << std::flush;
|
||||
|
||||
// Receive reply
|
||||
string strReply = ReadHTTP(stream);
|
||||
if (strReply.empty())
|
||||
throw runtime_error("no response from server");
|
||||
|
||||
// Parse reply
|
||||
Value valReply;
|
||||
if (!read_string(strReply, valReply))
|
||||
throw runtime_error("couldn't parse reply from server");
|
||||
const Object& reply = valReply.get_obj();
|
||||
if (reply.empty())
|
||||
throw runtime_error("expected reply to have result, error and id properties");
|
||||
|
||||
const Value& result = find_value(reply, "result");
|
||||
const Value& error = find_value(reply, "error");
|
||||
const Value& id = find_value(reply, "id");
|
||||
|
||||
if (error.type() == str_type)
|
||||
throw runtime_error(error.get_str());
|
||||
else if (error.type() != null_type)
|
||||
throw runtime_error(write_string(error, false));
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
template<typename T>
|
||||
void ConvertTo(Value& value)
|
||||
{
|
||||
if (value.type() == str_type)
|
||||
{
|
||||
// reinterpret string as unquoted json value
|
||||
Value value2;
|
||||
if (!read_string(value.get_str(), value2))
|
||||
throw runtime_error("type mismatch");
|
||||
value = value2.get_value<T>();
|
||||
}
|
||||
else
|
||||
{
|
||||
value = value.get_value<T>();
|
||||
}
|
||||
}
|
||||
|
||||
int CommandLineRPC(int argc, char *argv[])
|
||||
{
|
||||
try
|
||||
{
|
||||
// Check that method exists
|
||||
if (argc < 2)
|
||||
throw runtime_error("too few parameters");
|
||||
string strMethod = argv[1];
|
||||
if (!mapCallTable.count(strMethod))
|
||||
throw runtime_error(strprintf("unknown command: %s", strMethod.c_str()));
|
||||
|
||||
Value result;
|
||||
if (argc == 3 && strcmp(argv[2], "-?") == 0)
|
||||
{
|
||||
// Call help locally, help text is returned in an exception
|
||||
try
|
||||
{
|
||||
map<string, rpcfn_type>::iterator mi = mapCallTable.find(strMethod);
|
||||
Array params;
|
||||
(*(*mi).second)(params, true);
|
||||
}
|
||||
catch (std::exception& e)
|
||||
{
|
||||
result = e.what();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Parameters default to strings
|
||||
Array params;
|
||||
for (int i = 2; i < argc; i++)
|
||||
params.push_back(argv[i]);
|
||||
int n = params.size();
|
||||
|
||||
//
|
||||
// Special case non-string parameter types
|
||||
//
|
||||
if (strMethod == "setgenerate" && n > 0) ConvertTo<bool>(params[0]);
|
||||
if (strMethod == "setgenerate" && n > 1) ConvertTo<boost::int64_t>(params[1]);
|
||||
if (strMethod == "sendtoaddress" && n > 1) ConvertTo<double>(params[1]);
|
||||
if (strMethod == "listtransactions" && n > 0) ConvertTo<boost::int64_t>(params[0]);
|
||||
if (strMethod == "listtransactions" && n > 1) ConvertTo<bool>(params[1]);
|
||||
if (strMethod == "getamountreceived" && n > 1) ConvertTo<boost::int64_t>(params[1]); // deprecated
|
||||
if (strMethod == "getreceivedbyaddress" && n > 1) ConvertTo<boost::int64_t>(params[1]);
|
||||
if (strMethod == "getreceivedbylabel" && n > 1) ConvertTo<boost::int64_t>(params[1]);
|
||||
if (strMethod == "getallreceived" && n > 0) ConvertTo<boost::int64_t>(params[0]); // deprecated
|
||||
if (strMethod == "getallreceived" && n > 1) ConvertTo<bool>(params[1]);
|
||||
if (strMethod == "listreceivedbyaddress" && n > 0) ConvertTo<boost::int64_t>(params[0]);
|
||||
if (strMethod == "listreceivedbyaddress" && n > 1) ConvertTo<bool>(params[1]);
|
||||
if (strMethod == "listreceivedbylabel" && n > 0) ConvertTo<boost::int64_t>(params[0]);
|
||||
if (strMethod == "listreceivedbylabel" && n > 1) ConvertTo<bool>(params[1]);
|
||||
|
||||
// Execute
|
||||
result = CallRPC(strMethod, params);
|
||||
}
|
||||
|
||||
// Print result
|
||||
string strResult = (result.type() == str_type ? result.get_str() : write_string(result, true));
|
||||
if (result.type() != null_type)
|
||||
{
|
||||
#if defined(__WXMSW__) && wxUSE_GUI
|
||||
// Windows GUI apps can't print to command line,
|
||||
// so settle for a message box yuck
|
||||
MyMessageBox(strResult.c_str(), "Bitcoin", wxOK);
|
||||
#else
|
||||
fprintf(stdout, "%s\n", strResult.c_str());
|
||||
#endif
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
catch (std::exception& e) {
|
||||
#if defined(__WXMSW__) && wxUSE_GUI
|
||||
MyMessageBox(strprintf("error: %s\n", e.what()).c_str(), "Bitcoin", wxOK);
|
||||
#else
|
||||
fprintf(stderr, "error: %s\n", e.what());
|
||||
#endif
|
||||
} catch (...) {
|
||||
PrintException(NULL, "CommandLineRPC()");
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef TEST
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
// Turn off microsoft heap dump noise
|
||||
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
|
||||
_CrtSetReportFile(_CRT_WARN, CreateFile("NUL", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0));
|
||||
#endif
|
||||
setbuf(stdin, NULL);
|
||||
setbuf(stdout, NULL);
|
||||
setbuf(stderr, NULL);
|
||||
|
||||
try
|
||||
{
|
||||
if (argc >= 2 && string(argv[1]) == "-server")
|
||||
{
|
||||
printf("server ready\n");
|
||||
ThreadRPCServer(NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
return CommandLineRPC(argc, argv);
|
||||
}
|
||||
}
|
||||
catch (std::exception& e) {
|
||||
PrintException(&e, "main()");
|
||||
} catch (...) {
|
||||
PrintException(NULL, "main()");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
1134
script.cpp
63
scripts/qt/extract_strings_qt.py
Executable file
@@ -0,0 +1,63 @@
|
||||
#!/usr/bin/python
|
||||
'''
|
||||
Extract _("...") strings for translation and convert to Qt4 stringdefs so that
|
||||
they can be picked up by Qt linguist.
|
||||
'''
|
||||
from subprocess import Popen, PIPE
|
||||
|
||||
OUT_CPP="src/qt/bitcoinstrings.cpp"
|
||||
EMPTY=['""']
|
||||
|
||||
def parse_po(text):
|
||||
"""
|
||||
Parse 'po' format produced by xgettext.
|
||||
Return a list of (msgid,msgstr) tuples.
|
||||
"""
|
||||
messages = []
|
||||
msgid = []
|
||||
msgstr = []
|
||||
in_msgid = False
|
||||
in_msgstr = False
|
||||
|
||||
for line in text.split('\n'):
|
||||
line = line.rstrip('\r')
|
||||
if line.startswith('msgid '):
|
||||
if in_msgstr:
|
||||
messages.append((msgid, msgstr))
|
||||
in_msgstr = False
|
||||
# message start
|
||||
in_msgid = True
|
||||
|
||||
msgid = [line[6:]]
|
||||
elif line.startswith('msgstr '):
|
||||
in_msgid = False
|
||||
in_msgstr = True
|
||||
msgstr = [line[7:]]
|
||||
elif line.startswith('"'):
|
||||
if in_msgid:
|
||||
msgid.append(line)
|
||||
if in_msgstr:
|
||||
msgstr.append(line)
|
||||
|
||||
if in_msgstr:
|
||||
messages.append((msgid, msgstr))
|
||||
|
||||
return messages
|
||||
|
||||
files = ['src/base58.h', 'src/bignum.h', 'src/db.cpp', 'src/db.h', 'src/headers.h', 'src/init.cpp', 'src/init.h', 'src/irc.cpp', 'src/irc.h', 'src/key.h', 'src/main.cpp', 'src/main.h', 'src/net.cpp', 'src/net.h', 'src/noui.h', 'src/script.cpp', 'src/script.h', 'src/serialize.h', 'src/strlcpy.h', 'src/uint256.h', 'src/util.cpp', 'src/util.h']
|
||||
|
||||
# xgettext -n --keyword=_ $FILES
|
||||
child = Popen(['xgettext','--output=-','-n','--keyword=_'] + files, stdout=PIPE)
|
||||
(out, err) = child.communicate()
|
||||
|
||||
messages = parse_po(out)
|
||||
|
||||
f = open(OUT_CPP, 'w')
|
||||
f.write('#include <QtGlobal>\n')
|
||||
f.write('// Automatically generated by extract_strings.py\n')
|
||||
f.write('static const char *bitcoin_strings[] = {')
|
||||
for (msgid, msgstr) in messages:
|
||||
if msgid != EMPTY:
|
||||
f.write('QT_TRANSLATE_NOOP("bitcoin-core", %s),\n' % ('\n'.join(msgid)))
|
||||
f.write('};')
|
||||
f.close()
|
||||
BIN
scripts/qt/img/reload.xcf
Normal file
43
scripts/qt/make_spinner.py
Executable file
@@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env python
|
||||
# W.J. van der Laan, 2011
|
||||
# Make spinning .mng animation from a .png
|
||||
# Requires imagemagick 6.7+
|
||||
from __future__ import division
|
||||
from os import path
|
||||
from PIL import Image
|
||||
from subprocess import Popen
|
||||
|
||||
SRC='img/reload_scaled.png'
|
||||
DST='../../src/qt/res/movies/update_spinner.mng'
|
||||
TMPDIR='/tmp'
|
||||
TMPNAME='tmp-%03i.png'
|
||||
NUMFRAMES=35
|
||||
FRAMERATE=10.0
|
||||
CONVERT='convert'
|
||||
CLOCKWISE=True
|
||||
DSIZE=(16,16)
|
||||
|
||||
im_src = Image.open(SRC)
|
||||
|
||||
if CLOCKWISE:
|
||||
im_src = im_src.transpose(Image.FLIP_LEFT_RIGHT)
|
||||
|
||||
def frame_to_filename(frame):
|
||||
return path.join(TMPDIR, TMPNAME % frame)
|
||||
|
||||
frame_files = []
|
||||
for frame in xrange(NUMFRAMES):
|
||||
rotation = (frame + 0.5) / NUMFRAMES * 360.0
|
||||
if CLOCKWISE:
|
||||
rotation = -rotation
|
||||
im_new = im_src.rotate(rotation, Image.BICUBIC)
|
||||
im_new.thumbnail(DSIZE, Image.ANTIALIAS)
|
||||
outfile = frame_to_filename(frame)
|
||||
im_new.save(outfile, 'png')
|
||||
frame_files.append(outfile)
|
||||
|
||||
p = Popen([CONVERT, "-delay", str(FRAMERATE), "-dispose", "2"] + frame_files + [DST])
|
||||
p.communicate()
|
||||
|
||||
|
||||
|
||||
9
scripts/qt/make_windows_icon.py
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/bin/bash
|
||||
# create multiresolution windows icon
|
||||
ICON_SRC=../../src/qt/res/icons/bitcoin.png
|
||||
ICON_DST=../../src/qt/res/icons/bitcoin.ico
|
||||
convert ${ICON_SRC} -resize 16x16 bitcoin-16.png
|
||||
convert ${ICON_SRC} -resize 32x32 bitcoin-32.png
|
||||
convert ${ICON_SRC} -resize 48x48 bitcoin-48.png
|
||||
convert bitcoin-16.png bitcoin-32.png bitcoin-48.png ${ICON_DST}
|
||||
|
||||
554
sha.cpp
@@ -1,554 +0,0 @@
|
||||
// This file is public domain
|
||||
// SHA routines extracted as a standalone file from:
|
||||
// Crypto++: a C++ Class Library of Cryptographic Schemes
|
||||
// Version 5.5.2 (9/24/2007)
|
||||
// http://www.cryptopp.com
|
||||
|
||||
// sha.cpp - modified by Wei Dai from Steve Reid's public domain sha1.c
|
||||
|
||||
// Steve Reid implemented SHA-1. Wei Dai implemented SHA-2.
|
||||
// Both are in the public domain.
|
||||
|
||||
#include <assert.h>
|
||||
#include <memory.h>
|
||||
#include "sha.h"
|
||||
|
||||
namespace CryptoPP
|
||||
{
|
||||
|
||||
// start of Steve Reid's code
|
||||
|
||||
#define blk0(i) (W[i] = data[i])
|
||||
#define blk1(i) (W[i&15] = rotlFixed(W[(i+13)&15]^W[(i+8)&15]^W[(i+2)&15]^W[i&15],1))
|
||||
|
||||
void SHA1::InitState(HashWordType *state)
|
||||
{
|
||||
state[0] = 0x67452301L;
|
||||
state[1] = 0xEFCDAB89L;
|
||||
state[2] = 0x98BADCFEL;
|
||||
state[3] = 0x10325476L;
|
||||
state[4] = 0xC3D2E1F0L;
|
||||
}
|
||||
|
||||
#define f1(x,y,z) (z^(x&(y^z)))
|
||||
#define f2(x,y,z) (x^y^z)
|
||||
#define f3(x,y,z) ((x&y)|(z&(x|y)))
|
||||
#define f4(x,y,z) (x^y^z)
|
||||
|
||||
/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
|
||||
#define R0(v,w,x,y,z,i) z+=f1(w,x,y)+blk0(i)+0x5A827999+rotlFixed(v,5);w=rotlFixed(w,30);
|
||||
#define R1(v,w,x,y,z,i) z+=f1(w,x,y)+blk1(i)+0x5A827999+rotlFixed(v,5);w=rotlFixed(w,30);
|
||||
#define R2(v,w,x,y,z,i) z+=f2(w,x,y)+blk1(i)+0x6ED9EBA1+rotlFixed(v,5);w=rotlFixed(w,30);
|
||||
#define R3(v,w,x,y,z,i) z+=f3(w,x,y)+blk1(i)+0x8F1BBCDC+rotlFixed(v,5);w=rotlFixed(w,30);
|
||||
#define R4(v,w,x,y,z,i) z+=f4(w,x,y)+blk1(i)+0xCA62C1D6+rotlFixed(v,5);w=rotlFixed(w,30);
|
||||
|
||||
void SHA1::Transform(word32 *state, const word32 *data)
|
||||
{
|
||||
word32 W[16];
|
||||
/* Copy context->state[] to working vars */
|
||||
word32 a = state[0];
|
||||
word32 b = state[1];
|
||||
word32 c = state[2];
|
||||
word32 d = state[3];
|
||||
word32 e = state[4];
|
||||
/* 4 rounds of 20 operations each. Loop unrolled. */
|
||||
R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
|
||||
R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
|
||||
R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
|
||||
R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
|
||||
R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
|
||||
R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
|
||||
R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
|
||||
R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
|
||||
R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
|
||||
R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
|
||||
R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
|
||||
R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
|
||||
R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
|
||||
R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
|
||||
R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
|
||||
R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
|
||||
R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
|
||||
R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
|
||||
R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
|
||||
R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
|
||||
/* Add the working vars back into context.state[] */
|
||||
state[0] += a;
|
||||
state[1] += b;
|
||||
state[2] += c;
|
||||
state[3] += d;
|
||||
state[4] += e;
|
||||
}
|
||||
|
||||
// end of Steve Reid's code
|
||||
|
||||
// *************************************************************
|
||||
|
||||
void SHA224::InitState(HashWordType *state)
|
||||
{
|
||||
static const word32 s[8] = {0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4};
|
||||
memcpy(state, s, sizeof(s));
|
||||
}
|
||||
|
||||
void SHA256::InitState(HashWordType *state)
|
||||
{
|
||||
static const word32 s[8] = {0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19};
|
||||
memcpy(state, s, sizeof(s));
|
||||
}
|
||||
|
||||
static const word32 SHA256_K[64] = {
|
||||
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
|
||||
0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
||||
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
|
||||
0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
||||
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
|
||||
0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
||||
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
|
||||
0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
||||
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
|
||||
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
||||
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
|
||||
0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
||||
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
|
||||
0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
||||
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
|
||||
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
|
||||
};
|
||||
|
||||
#define blk2(i) (W[i&15]+=s1(W[(i-2)&15])+W[(i-7)&15]+s0(W[(i-15)&15]))
|
||||
|
||||
#define Ch(x,y,z) (z^(x&(y^z)))
|
||||
#define Maj(x,y,z) ((x&y)|(z&(x|y)))
|
||||
|
||||
#define a(i) T[(0-i)&7]
|
||||
#define b(i) T[(1-i)&7]
|
||||
#define c(i) T[(2-i)&7]
|
||||
#define d(i) T[(3-i)&7]
|
||||
#define e(i) T[(4-i)&7]
|
||||
#define f(i) T[(5-i)&7]
|
||||
#define g(i) T[(6-i)&7]
|
||||
#define h(i) T[(7-i)&7]
|
||||
|
||||
#define R(i) h(i)+=S1(e(i))+Ch(e(i),f(i),g(i))+SHA256_K[i+j]+(j?blk2(i):blk0(i));\
|
||||
d(i)+=h(i);h(i)+=S0(a(i))+Maj(a(i),b(i),c(i))
|
||||
|
||||
// for SHA256
|
||||
#define S0(x) (rotrFixed(x,2)^rotrFixed(x,13)^rotrFixed(x,22))
|
||||
#define S1(x) (rotrFixed(x,6)^rotrFixed(x,11)^rotrFixed(x,25))
|
||||
#define s0(x) (rotrFixed(x,7)^rotrFixed(x,18)^(x>>3))
|
||||
#define s1(x) (rotrFixed(x,17)^rotrFixed(x,19)^(x>>10))
|
||||
|
||||
void SHA256::Transform(word32 *state, const word32 *data)
|
||||
{
|
||||
word32 W[16];
|
||||
word32 T[8];
|
||||
/* Copy context->state[] to working vars */
|
||||
memcpy(T, state, sizeof(T));
|
||||
/* 64 operations, partially loop unrolled */
|
||||
for (unsigned int j=0; j<64; j+=16)
|
||||
{
|
||||
R( 0); R( 1); R( 2); R( 3);
|
||||
R( 4); R( 5); R( 6); R( 7);
|
||||
R( 8); R( 9); R(10); R(11);
|
||||
R(12); R(13); R(14); R(15);
|
||||
}
|
||||
/* Add the working vars back into context.state[] */
|
||||
state[0] += a(0);
|
||||
state[1] += b(0);
|
||||
state[2] += c(0);
|
||||
state[3] += d(0);
|
||||
state[4] += e(0);
|
||||
state[5] += f(0);
|
||||
state[6] += g(0);
|
||||
state[7] += h(0);
|
||||
}
|
||||
|
||||
/*
|
||||
// smaller but slower
|
||||
void SHA256_Transform(word32 *state, const word32 *data)
|
||||
{
|
||||
word32 T[20];
|
||||
word32 W[32];
|
||||
unsigned int i = 0, j = 0;
|
||||
word32 *t = T+8;
|
||||
|
||||
memcpy(t, state, 8*4);
|
||||
word32 e = t[4], a = t[0];
|
||||
|
||||
do
|
||||
{
|
||||
word32 w = data[j];
|
||||
W[j] = w;
|
||||
w += K[j];
|
||||
w += t[7];
|
||||
w += S1(e);
|
||||
w += Ch(e, t[5], t[6]);
|
||||
e = t[3] + w;
|
||||
t[3] = t[3+8] = e;
|
||||
w += S0(t[0]);
|
||||
a = w + Maj(a, t[1], t[2]);
|
||||
t[-1] = t[7] = a;
|
||||
--t;
|
||||
++j;
|
||||
if (j%8 == 0)
|
||||
t += 8;
|
||||
} while (j<16);
|
||||
|
||||
do
|
||||
{
|
||||
i = j&0xf;
|
||||
word32 w = s1(W[i+16-2]) + s0(W[i+16-15]) + W[i] + W[i+16-7];
|
||||
W[i+16] = W[i] = w;
|
||||
w += K[j];
|
||||
w += t[7];
|
||||
w += S1(e);
|
||||
w += Ch(e, t[5], t[6]);
|
||||
e = t[3] + w;
|
||||
t[3] = t[3+8] = e;
|
||||
w += S0(t[0]);
|
||||
a = w + Maj(a, t[1], t[2]);
|
||||
t[-1] = t[7] = a;
|
||||
|
||||
w = s1(W[(i+1)+16-2]) + s0(W[(i+1)+16-15]) + W[(i+1)] + W[(i+1)+16-7];
|
||||
W[(i+1)+16] = W[(i+1)] = w;
|
||||
w += K[j+1];
|
||||
w += (t-1)[7];
|
||||
w += S1(e);
|
||||
w += Ch(e, (t-1)[5], (t-1)[6]);
|
||||
e = (t-1)[3] + w;
|
||||
(t-1)[3] = (t-1)[3+8] = e;
|
||||
w += S0((t-1)[0]);
|
||||
a = w + Maj(a, (t-1)[1], (t-1)[2]);
|
||||
(t-1)[-1] = (t-1)[7] = a;
|
||||
|
||||
t-=2;
|
||||
j+=2;
|
||||
if (j%8 == 0)
|
||||
t += 8;
|
||||
} while (j<64);
|
||||
|
||||
state[0] += a;
|
||||
state[1] += t[1];
|
||||
state[2] += t[2];
|
||||
state[3] += t[3];
|
||||
state[4] += e;
|
||||
state[5] += t[5];
|
||||
state[6] += t[6];
|
||||
state[7] += t[7];
|
||||
}
|
||||
*/
|
||||
|
||||
#undef S0
|
||||
#undef S1
|
||||
#undef s0
|
||||
#undef s1
|
||||
#undef R
|
||||
|
||||
// *************************************************************
|
||||
|
||||
#ifdef WORD64_AVAILABLE
|
||||
|
||||
void SHA384::InitState(HashWordType *state)
|
||||
{
|
||||
static const word64 s[8] = {
|
||||
W64LIT(0xcbbb9d5dc1059ed8), W64LIT(0x629a292a367cd507),
|
||||
W64LIT(0x9159015a3070dd17), W64LIT(0x152fecd8f70e5939),
|
||||
W64LIT(0x67332667ffc00b31), W64LIT(0x8eb44a8768581511),
|
||||
W64LIT(0xdb0c2e0d64f98fa7), W64LIT(0x47b5481dbefa4fa4)};
|
||||
memcpy(state, s, sizeof(s));
|
||||
}
|
||||
|
||||
void SHA512::InitState(HashWordType *state)
|
||||
{
|
||||
static const word64 s[8] = {
|
||||
W64LIT(0x6a09e667f3bcc908), W64LIT(0xbb67ae8584caa73b),
|
||||
W64LIT(0x3c6ef372fe94f82b), W64LIT(0xa54ff53a5f1d36f1),
|
||||
W64LIT(0x510e527fade682d1), W64LIT(0x9b05688c2b3e6c1f),
|
||||
W64LIT(0x1f83d9abfb41bd6b), W64LIT(0x5be0cd19137e2179)};
|
||||
memcpy(state, s, sizeof(s));
|
||||
}
|
||||
|
||||
CRYPTOPP_ALIGN_DATA(16) static const word64 SHA512_K[80] CRYPTOPP_SECTION_ALIGN16 = {
|
||||
W64LIT(0x428a2f98d728ae22), W64LIT(0x7137449123ef65cd),
|
||||
W64LIT(0xb5c0fbcfec4d3b2f), W64LIT(0xe9b5dba58189dbbc),
|
||||
W64LIT(0x3956c25bf348b538), W64LIT(0x59f111f1b605d019),
|
||||
W64LIT(0x923f82a4af194f9b), W64LIT(0xab1c5ed5da6d8118),
|
||||
W64LIT(0xd807aa98a3030242), W64LIT(0x12835b0145706fbe),
|
||||
W64LIT(0x243185be4ee4b28c), W64LIT(0x550c7dc3d5ffb4e2),
|
||||
W64LIT(0x72be5d74f27b896f), W64LIT(0x80deb1fe3b1696b1),
|
||||
W64LIT(0x9bdc06a725c71235), W64LIT(0xc19bf174cf692694),
|
||||
W64LIT(0xe49b69c19ef14ad2), W64LIT(0xefbe4786384f25e3),
|
||||
W64LIT(0x0fc19dc68b8cd5b5), W64LIT(0x240ca1cc77ac9c65),
|
||||
W64LIT(0x2de92c6f592b0275), W64LIT(0x4a7484aa6ea6e483),
|
||||
W64LIT(0x5cb0a9dcbd41fbd4), W64LIT(0x76f988da831153b5),
|
||||
W64LIT(0x983e5152ee66dfab), W64LIT(0xa831c66d2db43210),
|
||||
W64LIT(0xb00327c898fb213f), W64LIT(0xbf597fc7beef0ee4),
|
||||
W64LIT(0xc6e00bf33da88fc2), W64LIT(0xd5a79147930aa725),
|
||||
W64LIT(0x06ca6351e003826f), W64LIT(0x142929670a0e6e70),
|
||||
W64LIT(0x27b70a8546d22ffc), W64LIT(0x2e1b21385c26c926),
|
||||
W64LIT(0x4d2c6dfc5ac42aed), W64LIT(0x53380d139d95b3df),
|
||||
W64LIT(0x650a73548baf63de), W64LIT(0x766a0abb3c77b2a8),
|
||||
W64LIT(0x81c2c92e47edaee6), W64LIT(0x92722c851482353b),
|
||||
W64LIT(0xa2bfe8a14cf10364), W64LIT(0xa81a664bbc423001),
|
||||
W64LIT(0xc24b8b70d0f89791), W64LIT(0xc76c51a30654be30),
|
||||
W64LIT(0xd192e819d6ef5218), W64LIT(0xd69906245565a910),
|
||||
W64LIT(0xf40e35855771202a), W64LIT(0x106aa07032bbd1b8),
|
||||
W64LIT(0x19a4c116b8d2d0c8), W64LIT(0x1e376c085141ab53),
|
||||
W64LIT(0x2748774cdf8eeb99), W64LIT(0x34b0bcb5e19b48a8),
|
||||
W64LIT(0x391c0cb3c5c95a63), W64LIT(0x4ed8aa4ae3418acb),
|
||||
W64LIT(0x5b9cca4f7763e373), W64LIT(0x682e6ff3d6b2b8a3),
|
||||
W64LIT(0x748f82ee5defb2fc), W64LIT(0x78a5636f43172f60),
|
||||
W64LIT(0x84c87814a1f0ab72), W64LIT(0x8cc702081a6439ec),
|
||||
W64LIT(0x90befffa23631e28), W64LIT(0xa4506cebde82bde9),
|
||||
W64LIT(0xbef9a3f7b2c67915), W64LIT(0xc67178f2e372532b),
|
||||
W64LIT(0xca273eceea26619c), W64LIT(0xd186b8c721c0c207),
|
||||
W64LIT(0xeada7dd6cde0eb1e), W64LIT(0xf57d4f7fee6ed178),
|
||||
W64LIT(0x06f067aa72176fba), W64LIT(0x0a637dc5a2c898a6),
|
||||
W64LIT(0x113f9804bef90dae), W64LIT(0x1b710b35131c471b),
|
||||
W64LIT(0x28db77f523047d84), W64LIT(0x32caab7b40c72493),
|
||||
W64LIT(0x3c9ebe0a15c9bebc), W64LIT(0x431d67c49c100d4c),
|
||||
W64LIT(0x4cc5d4becb3e42b6), W64LIT(0x597f299cfc657e2a),
|
||||
W64LIT(0x5fcb6fab3ad6faec), W64LIT(0x6c44198c4a475817)
|
||||
};
|
||||
|
||||
#if CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE && CRYPTOPP_BOOL_X86
|
||||
// put assembly version in separate function, otherwise MSVC 2005 SP1 doesn't generate correct code for the non-assembly version
|
||||
CRYPTOPP_NAKED static void CRYPTOPP_FASTCALL SHA512_SSE2_Transform(word64 *state, const word64 *data)
|
||||
{
|
||||
#ifdef __GNUC__
|
||||
__asm__ __volatile__
|
||||
(
|
||||
".intel_syntax noprefix;"
|
||||
AS1( push ebx)
|
||||
AS2( mov ebx, eax)
|
||||
#else
|
||||
AS1( push ebx)
|
||||
AS1( push esi)
|
||||
AS1( push edi)
|
||||
AS2( lea ebx, SHA512_K)
|
||||
#endif
|
||||
|
||||
AS2( mov eax, esp)
|
||||
AS2( and esp, 0xfffffff0)
|
||||
AS2( sub esp, 27*16) // 17*16 for expanded data, 20*8 for state
|
||||
AS1( push eax)
|
||||
AS2( xor eax, eax)
|
||||
AS2( lea edi, [esp+4+8*8]) // start at middle of state buffer. will decrement pointer each round to avoid copying
|
||||
AS2( lea esi, [esp+4+20*8+8]) // 16-byte alignment, then add 8
|
||||
|
||||
AS2( movq mm4, [ecx+0*8])
|
||||
AS2( movq [edi+0*8], mm4)
|
||||
AS2( movq mm0, [ecx+1*8])
|
||||
AS2( movq [edi+1*8], mm0)
|
||||
AS2( movq mm0, [ecx+2*8])
|
||||
AS2( movq [edi+2*8], mm0)
|
||||
AS2( movq mm0, [ecx+3*8])
|
||||
AS2( movq [edi+3*8], mm0)
|
||||
AS2( movq mm5, [ecx+4*8])
|
||||
AS2( movq [edi+4*8], mm5)
|
||||
AS2( movq mm0, [ecx+5*8])
|
||||
AS2( movq [edi+5*8], mm0)
|
||||
AS2( movq mm0, [ecx+6*8])
|
||||
AS2( movq [edi+6*8], mm0)
|
||||
AS2( movq mm0, [ecx+7*8])
|
||||
AS2( movq [edi+7*8], mm0)
|
||||
ASJ( jmp, 0, f)
|
||||
|
||||
#define SSE2_S0_S1(r, a, b, c) \
|
||||
AS2( movq mm6, r)\
|
||||
AS2( psrlq r, a)\
|
||||
AS2( movq mm7, r)\
|
||||
AS2( psllq mm6, 64-c)\
|
||||
AS2( pxor mm7, mm6)\
|
||||
AS2( psrlq r, b-a)\
|
||||
AS2( pxor mm7, r)\
|
||||
AS2( psllq mm6, c-b)\
|
||||
AS2( pxor mm7, mm6)\
|
||||
AS2( psrlq r, c-b)\
|
||||
AS2( pxor r, mm7)\
|
||||
AS2( psllq mm6, b-a)\
|
||||
AS2( pxor r, mm6)
|
||||
|
||||
#define SSE2_s0(r, a, b, c) \
|
||||
AS2( movdqa xmm6, r)\
|
||||
AS2( psrlq r, a)\
|
||||
AS2( movdqa xmm7, r)\
|
||||
AS2( psllq xmm6, 64-c)\
|
||||
AS2( pxor xmm7, xmm6)\
|
||||
AS2( psrlq r, b-a)\
|
||||
AS2( pxor xmm7, r)\
|
||||
AS2( psrlq r, c-b)\
|
||||
AS2( pxor r, xmm7)\
|
||||
AS2( psllq xmm6, c-a)\
|
||||
AS2( pxor r, xmm6)
|
||||
|
||||
#define SSE2_s1(r, a, b, c) \
|
||||
AS2( movdqa xmm6, r)\
|
||||
AS2( psrlq r, a)\
|
||||
AS2( movdqa xmm7, r)\
|
||||
AS2( psllq xmm6, 64-c)\
|
||||
AS2( pxor xmm7, xmm6)\
|
||||
AS2( psrlq r, b-a)\
|
||||
AS2( pxor xmm7, r)\
|
||||
AS2( psllq xmm6, c-b)\
|
||||
AS2( pxor xmm7, xmm6)\
|
||||
AS2( psrlq r, c-b)\
|
||||
AS2( pxor r, xmm7)
|
||||
|
||||
ASL(SHA512_Round)
|
||||
// k + w is in mm0, a is in mm4, e is in mm5
|
||||
AS2( paddq mm0, [edi+7*8]) // h
|
||||
AS2( movq mm2, [edi+5*8]) // f
|
||||
AS2( movq mm3, [edi+6*8]) // g
|
||||
AS2( pxor mm2, mm3)
|
||||
AS2( pand mm2, mm5)
|
||||
SSE2_S0_S1(mm5,14,18,41)
|
||||
AS2( pxor mm2, mm3)
|
||||
AS2( paddq mm0, mm2) // h += Ch(e,f,g)
|
||||
AS2( paddq mm5, mm0) // h += S1(e)
|
||||
AS2( movq mm2, [edi+1*8]) // b
|
||||
AS2( movq mm1, mm2)
|
||||
AS2( por mm2, mm4)
|
||||
AS2( pand mm2, [edi+2*8]) // c
|
||||
AS2( pand mm1, mm4)
|
||||
AS2( por mm1, mm2)
|
||||
AS2( paddq mm1, mm5) // temp = h + Maj(a,b,c)
|
||||
AS2( paddq mm5, [edi+3*8]) // e = d + h
|
||||
AS2( movq [edi+3*8], mm5)
|
||||
AS2( movq [edi+11*8], mm5)
|
||||
SSE2_S0_S1(mm4,28,34,39) // S0(a)
|
||||
AS2( paddq mm4, mm1) // a = temp + S0(a)
|
||||
AS2( movq [edi-8], mm4)
|
||||
AS2( movq [edi+7*8], mm4)
|
||||
AS1( ret)
|
||||
|
||||
// first 16 rounds
|
||||
ASL(0)
|
||||
AS2( movq mm0, [edx+eax*8])
|
||||
AS2( movq [esi+eax*8], mm0)
|
||||
AS2( movq [esi+eax*8+16*8], mm0)
|
||||
AS2( paddq mm0, [ebx+eax*8])
|
||||
ASC( call, SHA512_Round)
|
||||
AS1( inc eax)
|
||||
AS2( sub edi, 8)
|
||||
AS2( test eax, 7)
|
||||
ASJ( jnz, 0, b)
|
||||
AS2( add edi, 8*8)
|
||||
AS2( cmp eax, 16)
|
||||
ASJ( jne, 0, b)
|
||||
|
||||
// rest of the rounds
|
||||
AS2( movdqu xmm0, [esi+(16-2)*8])
|
||||
ASL(1)
|
||||
// data expansion, W[i-2] already in xmm0
|
||||
AS2( movdqu xmm3, [esi])
|
||||
AS2( paddq xmm3, [esi+(16-7)*8])
|
||||
AS2( movdqa xmm2, [esi+(16-15)*8])
|
||||
SSE2_s1(xmm0, 6, 19, 61)
|
||||
AS2( paddq xmm0, xmm3)
|
||||
SSE2_s0(xmm2, 1, 7, 8)
|
||||
AS2( paddq xmm0, xmm2)
|
||||
AS2( movdq2q mm0, xmm0)
|
||||
AS2( movhlps xmm1, xmm0)
|
||||
AS2( paddq mm0, [ebx+eax*8])
|
||||
AS2( movlps [esi], xmm0)
|
||||
AS2( movlps [esi+8], xmm1)
|
||||
AS2( movlps [esi+8*16], xmm0)
|
||||
AS2( movlps [esi+8*17], xmm1)
|
||||
// 2 rounds
|
||||
ASC( call, SHA512_Round)
|
||||
AS2( sub edi, 8)
|
||||
AS2( movdq2q mm0, xmm1)
|
||||
AS2( paddq mm0, [ebx+eax*8+8])
|
||||
ASC( call, SHA512_Round)
|
||||
// update indices and loop
|
||||
AS2( add esi, 16)
|
||||
AS2( add eax, 2)
|
||||
AS2( sub edi, 8)
|
||||
AS2( test eax, 7)
|
||||
ASJ( jnz, 1, b)
|
||||
// do housekeeping every 8 rounds
|
||||
AS2( mov esi, 0xf)
|
||||
AS2( and esi, eax)
|
||||
AS2( lea esi, [esp+4+20*8+8+esi*8])
|
||||
AS2( add edi, 8*8)
|
||||
AS2( cmp eax, 80)
|
||||
ASJ( jne, 1, b)
|
||||
|
||||
#define SSE2_CombineState(i) \
|
||||
AS2( movq mm0, [edi+i*8])\
|
||||
AS2( paddq mm0, [ecx+i*8])\
|
||||
AS2( movq [ecx+i*8], mm0)
|
||||
|
||||
SSE2_CombineState(0)
|
||||
SSE2_CombineState(1)
|
||||
SSE2_CombineState(2)
|
||||
SSE2_CombineState(3)
|
||||
SSE2_CombineState(4)
|
||||
SSE2_CombineState(5)
|
||||
SSE2_CombineState(6)
|
||||
SSE2_CombineState(7)
|
||||
|
||||
AS1( pop esp)
|
||||
AS1( emms)
|
||||
|
||||
#if defined(__GNUC__)
|
||||
AS1( pop ebx)
|
||||
".att_syntax prefix;"
|
||||
:
|
||||
: "a" (SHA512_K), "c" (state), "d" (data)
|
||||
: "%esi", "%edi", "memory", "cc"
|
||||
);
|
||||
#else
|
||||
AS1( pop edi)
|
||||
AS1( pop esi)
|
||||
AS1( pop ebx)
|
||||
AS1( ret)
|
||||
#endif
|
||||
}
|
||||
#endif // #if CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE
|
||||
|
||||
void SHA512::Transform(word64 *state, const word64 *data)
|
||||
{
|
||||
#if CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE && CRYPTOPP_BOOL_X86
|
||||
if (HasSSE2())
|
||||
{
|
||||
SHA512_SSE2_Transform(state, data);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#define S0(x) (rotrFixed(x,28)^rotrFixed(x,34)^rotrFixed(x,39))
|
||||
#define S1(x) (rotrFixed(x,14)^rotrFixed(x,18)^rotrFixed(x,41))
|
||||
#define s0(x) (rotrFixed(x,1)^rotrFixed(x,8)^(x>>7))
|
||||
#define s1(x) (rotrFixed(x,19)^rotrFixed(x,61)^(x>>6))
|
||||
|
||||
#define R(i) h(i)+=S1(e(i))+Ch(e(i),f(i),g(i))+SHA512_K[i+j]+(j?blk2(i):blk0(i));\
|
||||
d(i)+=h(i);h(i)+=S0(a(i))+Maj(a(i),b(i),c(i))
|
||||
|
||||
word64 W[16];
|
||||
word64 T[8];
|
||||
/* Copy context->state[] to working vars */
|
||||
memcpy(T, state, sizeof(T));
|
||||
/* 80 operations, partially loop unrolled */
|
||||
for (unsigned int j=0; j<80; j+=16)
|
||||
{
|
||||
R( 0); R( 1); R( 2); R( 3);
|
||||
R( 4); R( 5); R( 6); R( 7);
|
||||
R( 8); R( 9); R(10); R(11);
|
||||
R(12); R(13); R(14); R(15);
|
||||
}
|
||||
/* Add the working vars back into context.state[] */
|
||||
state[0] += a(0);
|
||||
state[1] += b(0);
|
||||
state[2] += c(0);
|
||||
state[3] += d(0);
|
||||
state[4] += e(0);
|
||||
state[5] += f(0);
|
||||
state[6] += g(0);
|
||||
state[7] += h(0);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
}
|
||||
177
sha.h
@@ -1,177 +0,0 @@
|
||||
// This file is public domain
|
||||
// SHA routines extracted as a standalone file from:
|
||||
// Crypto++: a C++ Class Library of Cryptographic Schemes
|
||||
// Version 5.5.2 (9/24/2007)
|
||||
// http://www.cryptopp.com
|
||||
#ifndef CRYPTOPP_SHA_H
|
||||
#define CRYPTOPP_SHA_H
|
||||
#include <stdlib.h>
|
||||
|
||||
namespace CryptoPP
|
||||
{
|
||||
|
||||
//
|
||||
// Dependencies
|
||||
//
|
||||
|
||||
typedef unsigned char byte;
|
||||
typedef unsigned short word16;
|
||||
typedef unsigned int word32;
|
||||
#if defined(_MSC_VER) || defined(__BORLANDC__)
|
||||
typedef unsigned __int64 word64;
|
||||
#else
|
||||
typedef unsigned long long word64;
|
||||
#endif
|
||||
|
||||
template <class T> inline T rotlFixed(T x, unsigned int y)
|
||||
{
|
||||
assert(y < sizeof(T)*8);
|
||||
return T((x<<y) | (x>>(sizeof(T)*8-y)));
|
||||
}
|
||||
|
||||
template <class T> inline T rotrFixed(T x, unsigned int y)
|
||||
{
|
||||
assert(y < sizeof(T)*8);
|
||||
return T((x>>y) | (x<<(sizeof(T)*8-y)));
|
||||
}
|
||||
|
||||
// ************** endian reversal ***************
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#if _MSC_VER >= 1400
|
||||
#define CRYPTOPP_FAST_ROTATE(x) 1
|
||||
#elif _MSC_VER >= 1300
|
||||
#define CRYPTOPP_FAST_ROTATE(x) ((x) == 32 | (x) == 64)
|
||||
#else
|
||||
#define CRYPTOPP_FAST_ROTATE(x) ((x) == 32)
|
||||
#endif
|
||||
#elif (defined(__MWERKS__) && TARGET_CPU_PPC) || \
|
||||
(defined(__GNUC__) && (defined(_ARCH_PWR2) || defined(_ARCH_PWR) || defined(_ARCH_PPC) || defined(_ARCH_PPC64) || defined(_ARCH_COM)))
|
||||
#define CRYPTOPP_FAST_ROTATE(x) ((x) == 32)
|
||||
#elif defined(__GNUC__) && (CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X86) // depend on GCC's peephole optimization to generate rotate instructions
|
||||
#define CRYPTOPP_FAST_ROTATE(x) 1
|
||||
#else
|
||||
#define CRYPTOPP_FAST_ROTATE(x) 0
|
||||
#endif
|
||||
|
||||
inline byte ByteReverse(byte value)
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
inline word16 ByteReverse(word16 value)
|
||||
{
|
||||
#ifdef CRYPTOPP_BYTESWAP_AVAILABLE
|
||||
return bswap_16(value);
|
||||
#elif defined(_MSC_VER) && _MSC_VER >= 1300
|
||||
return _byteswap_ushort(value);
|
||||
#else
|
||||
return rotlFixed(value, 8U);
|
||||
#endif
|
||||
}
|
||||
|
||||
inline word32 ByteReverse(word32 value)
|
||||
{
|
||||
#if defined(__GNUC__)
|
||||
__asm__ ("bswap %0" : "=r" (value) : "0" (value));
|
||||
return value;
|
||||
#elif defined(CRYPTOPP_BYTESWAP_AVAILABLE)
|
||||
return bswap_32(value);
|
||||
#elif defined(__MWERKS__) && TARGET_CPU_PPC
|
||||
return (word32)__lwbrx(&value,0);
|
||||
#elif _MSC_VER >= 1400 || (_MSC_VER >= 1300 && !defined(_DLL))
|
||||
return _byteswap_ulong(value);
|
||||
#elif CRYPTOPP_FAST_ROTATE(32)
|
||||
// 5 instructions with rotate instruction, 9 without
|
||||
return (rotrFixed(value, 8U) & 0xff00ff00) | (rotlFixed(value, 8U) & 0x00ff00ff);
|
||||
#else
|
||||
// 6 instructions with rotate instruction, 8 without
|
||||
value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8);
|
||||
return rotlFixed(value, 16U);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef WORD64_AVAILABLE
|
||||
inline word64 ByteReverse(word64 value)
|
||||
{
|
||||
#if defined(__GNUC__) && defined(__x86_64__)
|
||||
__asm__ ("bswap %0" : "=r" (value) : "0" (value));
|
||||
return value;
|
||||
#elif defined(CRYPTOPP_BYTESWAP_AVAILABLE)
|
||||
return bswap_64(value);
|
||||
#elif defined(_MSC_VER) && _MSC_VER >= 1300
|
||||
return _byteswap_uint64(value);
|
||||
#elif defined(CRYPTOPP_SLOW_WORD64)
|
||||
return (word64(ByteReverse(word32(value))) << 32) | ByteReverse(word32(value>>32));
|
||||
#else
|
||||
value = ((value & W64LIT(0xFF00FF00FF00FF00)) >> 8) | ((value & W64LIT(0x00FF00FF00FF00FF)) << 8);
|
||||
value = ((value & W64LIT(0xFFFF0000FFFF0000)) >> 16) | ((value & W64LIT(0x0000FFFF0000FFFF)) << 16);
|
||||
return rotlFixed(value, 32U);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//
|
||||
// SHA
|
||||
//
|
||||
|
||||
// http://www.weidai.com/scan-mirror/md.html#SHA-1
|
||||
class SHA1
|
||||
{
|
||||
public:
|
||||
typedef word32 HashWordType;
|
||||
static void InitState(word32 *state);
|
||||
static void Transform(word32 *digest, const word32 *data);
|
||||
static const char * StaticAlgorithmName() {return "SHA-1";}
|
||||
};
|
||||
|
||||
typedef SHA1 SHA; // for backwards compatibility
|
||||
|
||||
// implements the SHA-256 standard
|
||||
class SHA256
|
||||
{
|
||||
public:
|
||||
typedef word32 HashWordType;
|
||||
static void InitState(word32 *state);
|
||||
static void Transform(word32 *digest, const word32 *data);
|
||||
static const char * StaticAlgorithmName() {return "SHA-256";}
|
||||
};
|
||||
|
||||
// implements the SHA-224 standard
|
||||
class SHA224
|
||||
{
|
||||
public:
|
||||
typedef word32 HashWordType;
|
||||
static void InitState(word32 *state);
|
||||
static void Transform(word32 *digest, const word32 *data) {SHA256::Transform(digest, data);}
|
||||
static const char * StaticAlgorithmName() {return "SHA-224";}
|
||||
};
|
||||
|
||||
#ifdef WORD64_AVAILABLE
|
||||
|
||||
// implements the SHA-512 standard
|
||||
class SHA512
|
||||
{
|
||||
public:
|
||||
typedef word64 HashWordType;
|
||||
static void InitState(word64 *state);
|
||||
static void Transform(word64 *digest, const word64 *data);
|
||||
static const char * StaticAlgorithmName() {return "SHA-512";}
|
||||
};
|
||||
|
||||
// implements the SHA-384 standard
|
||||
class SHA384
|
||||
{
|
||||
public:
|
||||
typedef word64 HashWordType;
|
||||
static void InitState(word64 *state);
|
||||
static void Transform(word64 *digest, const word64 *data) {SHA512::Transform(digest, data);}
|
||||
static const char * StaticAlgorithmName() {return "SHA-384";}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 126 B After Width: | Height: | Size: 126 B |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 142 B After Width: | Height: | Size: 142 B |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
BIN
share/pixmaps/bitcoin.ico
Normal file
|
After Width: | Height: | Size: 299 KiB |
|
Before Width: | Height: | Size: 766 B After Width: | Height: | Size: 766 B |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
BIN
share/pixmaps/nsis-header.bmp
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
share/pixmaps/nsis-wizard.bmp
Normal file
|
After Width: | Height: | Size: 151 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 126 B After Width: | Height: | Size: 126 B |
|
Before Width: | Height: | Size: 126 B After Width: | Height: | Size: 126 B |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 142 B After Width: | Height: | Size: 142 B |
@@ -1,156 +1,156 @@
|
||||
# Auto-generated by EclipseNSIS Script Wizard
|
||||
# 3.10.2009 19:00:28
|
||||
|
||||
Name Bitcoin
|
||||
|
||||
RequestExecutionLevel highest
|
||||
|
||||
# General Symbol Definitions
|
||||
!define REGKEY "SOFTWARE\$(^Name)"
|
||||
!define VERSION 0.3.1
|
||||
!define COMPANY "Bitcoin project"
|
||||
!define URL http://www.bitcoin.org/
|
||||
|
||||
# MUI Symbol Definitions
|
||||
!define MUI_ICON "src\rc\bitcoin.ico"
|
||||
!define MUI_FINISHPAGE_NOAUTOCLOSE
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_ROOT HKLM
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_KEY ${REGKEY}
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME StartMenuGroup
|
||||
!define MUI_STARTMENUPAGE_DEFAULTFOLDER Bitcoin
|
||||
!define MUI_FINISHPAGE_RUN $INSTDIR\bitcoin.exe
|
||||
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
|
||||
!define MUI_UNFINISHPAGE_NOAUTOCLOSE
|
||||
|
||||
# Included files
|
||||
!include Sections.nsh
|
||||
!include MUI2.nsh
|
||||
|
||||
# Variables
|
||||
Var StartMenuGroup
|
||||
|
||||
# Installer pages
|
||||
!insertmacro MUI_PAGE_WELCOME
|
||||
!insertmacro MUI_PAGE_DIRECTORY
|
||||
!insertmacro MUI_PAGE_STARTMENU Application $StartMenuGroup
|
||||
!insertmacro MUI_PAGE_INSTFILES
|
||||
!insertmacro MUI_PAGE_FINISH
|
||||
!insertmacro MUI_UNPAGE_CONFIRM
|
||||
!insertmacro MUI_UNPAGE_INSTFILES
|
||||
|
||||
# Installer languages
|
||||
!insertmacro MUI_LANGUAGE English
|
||||
|
||||
# Installer attributes
|
||||
OutFile bitcoin-0.3.1-win32-setup.exe
|
||||
InstallDir $PROGRAMFILES\Bitcoin
|
||||
CRCCheck on
|
||||
XPStyle on
|
||||
ShowInstDetails show
|
||||
VIProductVersion 0.3.1.0
|
||||
VIAddVersionKey ProductName Bitcoin
|
||||
VIAddVersionKey ProductVersion "${VERSION}"
|
||||
VIAddVersionKey CompanyName "${COMPANY}"
|
||||
VIAddVersionKey CompanyWebsite "${URL}"
|
||||
VIAddVersionKey FileVersion "${VERSION}"
|
||||
VIAddVersionKey FileDescription ""
|
||||
VIAddVersionKey LegalCopyright ""
|
||||
InstallDirRegKey HKCU "${REGKEY}" Path
|
||||
ShowUninstDetails show
|
||||
|
||||
# Installer sections
|
||||
Section -Main SEC0000
|
||||
SetOutPath $INSTDIR
|
||||
SetOverwrite on
|
||||
File bitcoin.exe
|
||||
File libeay32.dll
|
||||
File mingwm10.dll
|
||||
File license.txt
|
||||
File readme.txt
|
||||
SetOutPath $INSTDIR\daemon
|
||||
File /r daemon\*.*
|
||||
SetOutPath $INSTDIR\locale
|
||||
File /r locale\*.*
|
||||
SetOutPath $INSTDIR\src
|
||||
File /r src\*.*
|
||||
SetOutPath $INSTDIR
|
||||
WriteRegStr HKCU "${REGKEY}\Components" Main 1
|
||||
SectionEnd
|
||||
|
||||
Section -post SEC0001
|
||||
WriteRegStr HKCU "${REGKEY}" Path $INSTDIR
|
||||
SetOutPath $INSTDIR
|
||||
WriteUninstaller $INSTDIR\uninstall.exe
|
||||
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
|
||||
CreateDirectory $SMPROGRAMS\$StartMenuGroup
|
||||
CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Bitcoin.lnk" $INSTDIR\bitcoin.exe
|
||||
CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall Bitcoin.lnk" $INSTDIR\uninstall.exe
|
||||
!insertmacro MUI_STARTMENU_WRITE_END
|
||||
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayName "$(^Name)"
|
||||
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayVersion "${VERSION}"
|
||||
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" Publisher "${COMPANY}"
|
||||
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" URLInfoAbout "${URL}"
|
||||
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayIcon $INSTDIR\uninstall.exe
|
||||
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" UninstallString $INSTDIR\uninstall.exe
|
||||
WriteRegDWORD HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoModify 1
|
||||
WriteRegDWORD HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoRepair 1
|
||||
SectionEnd
|
||||
|
||||
# Macro for selecting uninstaller sections
|
||||
!macro SELECT_UNSECTION SECTION_NAME UNSECTION_ID
|
||||
Push $R0
|
||||
ReadRegStr $R0 HKCU "${REGKEY}\Components" "${SECTION_NAME}"
|
||||
StrCmp $R0 1 0 next${UNSECTION_ID}
|
||||
!insertmacro SelectSection "${UNSECTION_ID}"
|
||||
GoTo done${UNSECTION_ID}
|
||||
next${UNSECTION_ID}:
|
||||
!insertmacro UnselectSection "${UNSECTION_ID}"
|
||||
done${UNSECTION_ID}:
|
||||
Pop $R0
|
||||
!macroend
|
||||
|
||||
# Uninstaller sections
|
||||
Section /o -un.Main UNSEC0000
|
||||
Delete /REBOOTOK $INSTDIR\bitcoin.exe
|
||||
Delete /REBOOTOK $INSTDIR\libeay32.dll
|
||||
Delete /REBOOTOK $INSTDIR\mingwm10.dll
|
||||
Delete /REBOOTOK $INSTDIR\license.txt
|
||||
Delete /REBOOTOK $INSTDIR\readme.txt
|
||||
RMDir /r /REBOOTOK $INSTDIR\daemon
|
||||
RMDir /r /REBOOTOK $INSTDIR\locale
|
||||
RMDir /r /REBOOTOK $INSTDIR\src
|
||||
DeleteRegValue HKCU "${REGKEY}\Components" Main
|
||||
SectionEnd
|
||||
|
||||
Section -un.post UNSEC0001
|
||||
DeleteRegKey HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)"
|
||||
Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Uninstall Bitcoin.lnk"
|
||||
Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Bitcoin.lnk"
|
||||
Delete /REBOOTOK "$SMSTARTUP\Bitcoin.lnk"
|
||||
Delete /REBOOTOK $INSTDIR\uninstall.exe
|
||||
Delete /REBOOTOK $INSTDIR\debug.log
|
||||
Delete /REBOOTOK $INSTDIR\db.log
|
||||
DeleteRegValue HKCU "${REGKEY}" StartMenuGroup
|
||||
DeleteRegValue HKCU "${REGKEY}" Path
|
||||
DeleteRegKey /IfEmpty HKCU "${REGKEY}\Components"
|
||||
DeleteRegKey /IfEmpty HKCU "${REGKEY}"
|
||||
RmDir /REBOOTOK $SMPROGRAMS\$StartMenuGroup
|
||||
RmDir /REBOOTOK $INSTDIR
|
||||
Push $R0
|
||||
StrCpy $R0 $StartMenuGroup 1
|
||||
StrCmp $R0 ">" no_smgroup
|
||||
no_smgroup:
|
||||
Pop $R0
|
||||
SectionEnd
|
||||
|
||||
# Installer functions
|
||||
Function .onInit
|
||||
InitPluginsDir
|
||||
FunctionEnd
|
||||
|
||||
# Uninstaller functions
|
||||
Function un.onInit
|
||||
ReadRegStr $INSTDIR HKCU "${REGKEY}" Path
|
||||
!insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuGroup
|
||||
!insertmacro SELECT_UNSECTION Main ${UNSEC0000}
|
||||
FunctionEnd
|
||||
Name Bitcoin
|
||||
|
||||
RequestExecutionLevel highest
|
||||
SetCompressor /SOLID lzma
|
||||
|
||||
# General Symbol Definitions
|
||||
!define REGKEY "SOFTWARE\$(^Name)"
|
||||
!define VERSION 0.5.0
|
||||
!define COMPANY "Bitcoin project"
|
||||
!define URL http://www.bitcoin.org/
|
||||
|
||||
# MUI Symbol Definitions
|
||||
!define MUI_ICON "../share/pixmaps/bitcoin.ico"
|
||||
!define MUI_WELCOMEFINISHPAGE_BITMAP "../share/pixmaps/nsis-wizard.bmp"
|
||||
!define MUI_HEADERIMAGE
|
||||
!define MUI_HEADERIMAGE_RIGHT
|
||||
!define MUI_HEADERIMAGE_BITMAP "../share/pixmaps/nsis-header.bmp"
|
||||
!define MUI_FINISHPAGE_NOAUTOCLOSE
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_ROOT HKLM
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_KEY ${REGKEY}
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME StartMenuGroup
|
||||
!define MUI_STARTMENUPAGE_DEFAULTFOLDER Bitcoin
|
||||
!define MUI_FINISHPAGE_RUN $INSTDIR\bitcoin-qt.exe
|
||||
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
|
||||
!define MUI_UNWELCOMEFINISHPAGE_BITMAP "../share/pixmaps/nsis-wizard.bmp"
|
||||
!define MUI_UNFINISHPAGE_NOAUTOCLOSE
|
||||
|
||||
# Included files
|
||||
!include Sections.nsh
|
||||
!include MUI2.nsh
|
||||
|
||||
# Variables
|
||||
Var StartMenuGroup
|
||||
|
||||
# Installer pages
|
||||
!insertmacro MUI_PAGE_WELCOME
|
||||
!insertmacro MUI_PAGE_DIRECTORY
|
||||
!insertmacro MUI_PAGE_STARTMENU Application $StartMenuGroup
|
||||
!insertmacro MUI_PAGE_INSTFILES
|
||||
!insertmacro MUI_PAGE_FINISH
|
||||
!insertmacro MUI_UNPAGE_CONFIRM
|
||||
!insertmacro MUI_UNPAGE_INSTFILES
|
||||
|
||||
# Installer languages
|
||||
!insertmacro MUI_LANGUAGE English
|
||||
|
||||
# Installer attributes
|
||||
OutFile bitcoin-0.5.0-win32-setup.exe
|
||||
InstallDir $PROGRAMFILES\Bitcoin
|
||||
CRCCheck on
|
||||
XPStyle on
|
||||
BrandingText " "
|
||||
ShowInstDetails show
|
||||
VIProductVersion 0.5.0.0
|
||||
VIAddVersionKey ProductName Bitcoin
|
||||
VIAddVersionKey ProductVersion "${VERSION}"
|
||||
VIAddVersionKey CompanyName "${COMPANY}"
|
||||
VIAddVersionKey CompanyWebsite "${URL}"
|
||||
VIAddVersionKey FileVersion "${VERSION}"
|
||||
VIAddVersionKey FileDescription ""
|
||||
VIAddVersionKey LegalCopyright ""
|
||||
InstallDirRegKey HKCU "${REGKEY}" Path
|
||||
ShowUninstDetails show
|
||||
|
||||
# Installer sections
|
||||
Section -Main SEC0000
|
||||
SetOutPath $INSTDIR
|
||||
SetOverwrite on
|
||||
File ../bitcoin-qt.exe
|
||||
File /oname=license.txt ../COPYING
|
||||
File /oname=readme.txt ../doc/README_windows.txt
|
||||
SetOutPath $INSTDIR\daemon
|
||||
File ../src/bitcoind.exe
|
||||
SetOutPath $INSTDIR\locale
|
||||
File /r ../locale/*.*
|
||||
SetOutPath $INSTDIR\src
|
||||
File /r /x *.exe /x *.o ../src\*.*
|
||||
SetOutPath $INSTDIR
|
||||
WriteRegStr HKCU "${REGKEY}\Components" Main 1
|
||||
SectionEnd
|
||||
|
||||
Section -post SEC0001
|
||||
WriteRegStr HKCU "${REGKEY}" Path $INSTDIR
|
||||
SetOutPath $INSTDIR
|
||||
WriteUninstaller $INSTDIR\uninstall.exe
|
||||
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
|
||||
CreateDirectory $SMPROGRAMS\$StartMenuGroup
|
||||
CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Bitcoin.lnk" $INSTDIR\bitcoin-qt.exe
|
||||
CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall Bitcoin.lnk" $INSTDIR\uninstall.exe
|
||||
!insertmacro MUI_STARTMENU_WRITE_END
|
||||
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayName "$(^Name)"
|
||||
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayVersion "${VERSION}"
|
||||
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" Publisher "${COMPANY}"
|
||||
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" URLInfoAbout "${URL}"
|
||||
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayIcon $INSTDIR\uninstall.exe
|
||||
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" UninstallString $INSTDIR\uninstall.exe
|
||||
WriteRegDWORD HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoModify 1
|
||||
WriteRegDWORD HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoRepair 1
|
||||
SectionEnd
|
||||
|
||||
# Macro for selecting uninstaller sections
|
||||
!macro SELECT_UNSECTION SECTION_NAME UNSECTION_ID
|
||||
Push $R0
|
||||
ReadRegStr $R0 HKCU "${REGKEY}\Components" "${SECTION_NAME}"
|
||||
StrCmp $R0 1 0 next${UNSECTION_ID}
|
||||
!insertmacro SelectSection "${UNSECTION_ID}"
|
||||
GoTo done${UNSECTION_ID}
|
||||
next${UNSECTION_ID}:
|
||||
!insertmacro UnselectSection "${UNSECTION_ID}"
|
||||
done${UNSECTION_ID}:
|
||||
Pop $R0
|
||||
!macroend
|
||||
|
||||
# Uninstaller sections
|
||||
Section /o -un.Main UNSEC0000
|
||||
Delete /REBOOTOK $INSTDIR\bitcoin-qt.exe
|
||||
Delete /REBOOTOK $INSTDIR\license.txt
|
||||
Delete /REBOOTOK $INSTDIR\readme.txt
|
||||
RMDir /r /REBOOTOK $INSTDIR\daemon
|
||||
RMDir /r /REBOOTOK $INSTDIR\locale
|
||||
RMDir /r /REBOOTOK $INSTDIR\src
|
||||
DeleteRegValue HKCU "${REGKEY}\Components" Main
|
||||
SectionEnd
|
||||
|
||||
Section -un.post UNSEC0001
|
||||
DeleteRegKey HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)"
|
||||
Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Uninstall Bitcoin.lnk"
|
||||
Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Bitcoin.lnk"
|
||||
Delete /REBOOTOK "$SMSTARTUP\Bitcoin.lnk"
|
||||
Delete /REBOOTOK $INSTDIR\uninstall.exe
|
||||
Delete /REBOOTOK $INSTDIR\debug.log
|
||||
Delete /REBOOTOK $INSTDIR\db.log
|
||||
DeleteRegValue HKCU "${REGKEY}" StartMenuGroup
|
||||
DeleteRegValue HKCU "${REGKEY}" Path
|
||||
DeleteRegKey /IfEmpty HKCU "${REGKEY}\Components"
|
||||
DeleteRegKey /IfEmpty HKCU "${REGKEY}"
|
||||
RmDir /REBOOTOK $SMPROGRAMS\$StartMenuGroup
|
||||
RmDir /REBOOTOK $INSTDIR
|
||||
Push $R0
|
||||
StrCpy $R0 $StartMenuGroup 1
|
||||
StrCmp $R0 ">" no_smgroup
|
||||
no_smgroup:
|
||||
Pop $R0
|
||||
SectionEnd
|
||||
|
||||
# Installer functions
|
||||
Function .onInit
|
||||
InitPluginsDir
|
||||
FunctionEnd
|
||||
|
||||
# Uninstaller functions
|
||||
Function un.onInit
|
||||
ReadRegStr $INSTDIR HKCU "${REGKEY}" Path
|
||||
!insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuGroup
|
||||
!insertmacro SELECT_UNSECTION Main ${UNSEC0000}
|
||||
FunctionEnd
|
||||
15
share/ui.rc
Normal file
@@ -0,0 +1,15 @@
|
||||
bitcoin ICON "pixmaps/bitcoin.ico"
|
||||
|
||||
#include "wx/msw/wx.rc"
|
||||
|
||||
check ICON "pixmaps/check.ico"
|
||||
send16 BITMAP "pixmaps/send16.bmp"
|
||||
send16mask BITMAP "pixmaps/send16mask.bmp"
|
||||
send16masknoshadow BITMAP "pixmaps/send16masknoshadow.bmp"
|
||||
send20 BITMAP "pixmaps/send20.bmp"
|
||||
send20mask BITMAP "pixmaps/send20mask.bmp"
|
||||
addressbook16 BITMAP "pixmaps/addressbook16.bmp"
|
||||
addressbook16mask BITMAP "pixmaps/addressbook16mask.bmp"
|
||||
addressbook20 BITMAP "pixmaps/addressbook20.bmp"
|
||||
addressbook20mask BITMAP "pixmaps/addressbook20mask.bmp"
|
||||
favicon ICON "pixmaps/favicon.ico"
|
||||
308
src/base58.h
Normal file
@@ -0,0 +1,308 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2011 The Bitcoin Developers
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
|
||||
//
|
||||
// Why base-58 instead of standard base-64 encoding?
|
||||
// - Don't want 0OIl characters that look the same in some fonts and
|
||||
// could be used to create visually identical looking account numbers.
|
||||
// - A string with non-alphanumeric characters is not as easily accepted as an account number.
|
||||
// - E-mail usually won't line-break if there's no punctuation to break at.
|
||||
// - Doubleclicking selects the whole number as one word if it's all alphanumeric.
|
||||
//
|
||||
#ifndef BITCOIN_BASE58_H
|
||||
#define BITCOIN_BASE58_H
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "bignum.h"
|
||||
|
||||
static const char* pszBase58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
||||
|
||||
|
||||
inline std::string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend)
|
||||
{
|
||||
CAutoBN_CTX pctx;
|
||||
CBigNum bn58 = 58;
|
||||
CBigNum bn0 = 0;
|
||||
|
||||
// Convert big endian data to little endian
|
||||
// Extra zero at the end make sure bignum will interpret as a positive number
|
||||
std::vector<unsigned char> vchTmp(pend-pbegin+1, 0);
|
||||
reverse_copy(pbegin, pend, vchTmp.begin());
|
||||
|
||||
// Convert little endian data to bignum
|
||||
CBigNum bn;
|
||||
bn.setvch(vchTmp);
|
||||
|
||||
// Convert bignum to std::string
|
||||
std::string str;
|
||||
// Expected size increase from base58 conversion is approximately 137%
|
||||
// use 138% to be safe
|
||||
str.reserve((pend - pbegin) * 138 / 100 + 1);
|
||||
CBigNum dv;
|
||||
CBigNum rem;
|
||||
while (bn > bn0)
|
||||
{
|
||||
if (!BN_div(&dv, &rem, &bn, &bn58, pctx))
|
||||
throw bignum_error("EncodeBase58 : BN_div failed");
|
||||
bn = dv;
|
||||
unsigned int c = rem.getulong();
|
||||
str += pszBase58[c];
|
||||
}
|
||||
|
||||
// Leading zeroes encoded as base58 zeros
|
||||
for (const unsigned char* p = pbegin; p < pend && *p == 0; p++)
|
||||
str += pszBase58[0];
|
||||
|
||||
// Convert little endian std::string to big endian
|
||||
reverse(str.begin(), str.end());
|
||||
return str;
|
||||
}
|
||||
|
||||
inline std::string EncodeBase58(const std::vector<unsigned char>& vch)
|
||||
{
|
||||
return EncodeBase58(&vch[0], &vch[0] + vch.size());
|
||||
}
|
||||
|
||||
inline bool DecodeBase58(const char* psz, std::vector<unsigned char>& vchRet)
|
||||
{
|
||||
CAutoBN_CTX pctx;
|
||||
vchRet.clear();
|
||||
CBigNum bn58 = 58;
|
||||
CBigNum bn = 0;
|
||||
CBigNum bnChar;
|
||||
while (isspace(*psz))
|
||||
psz++;
|
||||
|
||||
// Convert big endian string to bignum
|
||||
for (const char* p = psz; *p; p++)
|
||||
{
|
||||
const char* p1 = strchr(pszBase58, *p);
|
||||
if (p1 == NULL)
|
||||
{
|
||||
while (isspace(*p))
|
||||
p++;
|
||||
if (*p != '\0')
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
bnChar.setulong(p1 - pszBase58);
|
||||
if (!BN_mul(&bn, &bn, &bn58, pctx))
|
||||
throw bignum_error("DecodeBase58 : BN_mul failed");
|
||||
bn += bnChar;
|
||||
}
|
||||
|
||||
// Get bignum as little endian data
|
||||
std::vector<unsigned char> vchTmp = bn.getvch();
|
||||
|
||||
// Trim off sign byte if present
|
||||
if (vchTmp.size() >= 2 && vchTmp.end()[-1] == 0 && vchTmp.end()[-2] >= 0x80)
|
||||
vchTmp.erase(vchTmp.end()-1);
|
||||
|
||||
// Restore leading zeros
|
||||
int nLeadingZeros = 0;
|
||||
for (const char* p = psz; *p == pszBase58[0]; p++)
|
||||
nLeadingZeros++;
|
||||
vchRet.assign(nLeadingZeros + vchTmp.size(), 0);
|
||||
|
||||
// Convert little endian data to big endian
|
||||
reverse_copy(vchTmp.begin(), vchTmp.end(), vchRet.end() - vchTmp.size());
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool DecodeBase58(const std::string& str, std::vector<unsigned char>& vchRet)
|
||||
{
|
||||
return DecodeBase58(str.c_str(), vchRet);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
inline std::string EncodeBase58Check(const std::vector<unsigned char>& vchIn)
|
||||
{
|
||||
// add 4-byte hash check to the end
|
||||
std::vector<unsigned char> vch(vchIn);
|
||||
uint256 hash = Hash(vch.begin(), vch.end());
|
||||
vch.insert(vch.end(), (unsigned char*)&hash, (unsigned char*)&hash + 4);
|
||||
return EncodeBase58(vch);
|
||||
}
|
||||
|
||||
inline bool DecodeBase58Check(const char* psz, std::vector<unsigned char>& vchRet)
|
||||
{
|
||||
if (!DecodeBase58(psz, vchRet))
|
||||
return false;
|
||||
if (vchRet.size() < 4)
|
||||
{
|
||||
vchRet.clear();
|
||||
return false;
|
||||
}
|
||||
uint256 hash = Hash(vchRet.begin(), vchRet.end()-4);
|
||||
if (memcmp(&hash, &vchRet.end()[-4], 4) != 0)
|
||||
{
|
||||
vchRet.clear();
|
||||
return false;
|
||||
}
|
||||
vchRet.resize(vchRet.size()-4);
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool DecodeBase58Check(const std::string& str, std::vector<unsigned char>& vchRet)
|
||||
{
|
||||
return DecodeBase58Check(str.c_str(), vchRet);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class CBase58Data
|
||||
{
|
||||
protected:
|
||||
unsigned char nVersion;
|
||||
std::vector<unsigned char> vchData;
|
||||
|
||||
CBase58Data()
|
||||
{
|
||||
nVersion = 0;
|
||||
vchData.clear();
|
||||
}
|
||||
|
||||
~CBase58Data()
|
||||
{
|
||||
if (!vchData.empty())
|
||||
memset(&vchData[0], 0, vchData.size());
|
||||
}
|
||||
|
||||
void SetData(int nVersionIn, const void* pdata, size_t nSize)
|
||||
{
|
||||
nVersion = nVersionIn;
|
||||
vchData.resize(nSize);
|
||||
if (!vchData.empty())
|
||||
memcpy(&vchData[0], pdata, nSize);
|
||||
}
|
||||
|
||||
void SetData(int nVersionIn, const unsigned char *pbegin, const unsigned char *pend)
|
||||
{
|
||||
SetData(nVersionIn, (void*)pbegin, pend - pbegin);
|
||||
}
|
||||
|
||||
public:
|
||||
bool SetString(const char* psz)
|
||||
{
|
||||
std::vector<unsigned char> vchTemp;
|
||||
DecodeBase58Check(psz, vchTemp);
|
||||
if (vchTemp.empty())
|
||||
{
|
||||
vchData.clear();
|
||||
nVersion = 0;
|
||||
return false;
|
||||
}
|
||||
nVersion = vchTemp[0];
|
||||
vchData.resize(vchTemp.size() - 1);
|
||||
if (!vchData.empty())
|
||||
memcpy(&vchData[0], &vchTemp[1], vchData.size());
|
||||
memset(&vchTemp[0], 0, vchTemp.size());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SetString(const std::string& str)
|
||||
{
|
||||
return SetString(str.c_str());
|
||||
}
|
||||
|
||||
std::string ToString() const
|
||||
{
|
||||
std::vector<unsigned char> vch(1, nVersion);
|
||||
vch.insert(vch.end(), vchData.begin(), vchData.end());
|
||||
return EncodeBase58Check(vch);
|
||||
}
|
||||
|
||||
int CompareTo(const CBase58Data& b58) const
|
||||
{
|
||||
if (nVersion < b58.nVersion) return -1;
|
||||
if (nVersion > b58.nVersion) return 1;
|
||||
if (vchData < b58.vchData) return -1;
|
||||
if (vchData > b58.vchData) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool operator==(const CBase58Data& b58) const { return CompareTo(b58) == 0; }
|
||||
bool operator<=(const CBase58Data& b58) const { return CompareTo(b58) <= 0; }
|
||||
bool operator>=(const CBase58Data& b58) const { return CompareTo(b58) >= 0; }
|
||||
bool operator< (const CBase58Data& b58) const { return CompareTo(b58) < 0; }
|
||||
bool operator> (const CBase58Data& b58) const { return CompareTo(b58) > 0; }
|
||||
};
|
||||
|
||||
|
||||
class CBitcoinAddress : public CBase58Data
|
||||
{
|
||||
public:
|
||||
bool SetHash160(const uint160& hash160)
|
||||
{
|
||||
SetData(fTestNet ? 111 : 0, &hash160, 20);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SetPubKey(const std::vector<unsigned char>& vchPubKey)
|
||||
{
|
||||
return SetHash160(Hash160(vchPubKey));
|
||||
}
|
||||
|
||||
bool IsValid() const
|
||||
{
|
||||
int nExpectedSize = 20;
|
||||
bool fExpectTestNet = false;
|
||||
switch(nVersion)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
|
||||
case 111:
|
||||
fExpectTestNet = true;
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
return fExpectTestNet == fTestNet && vchData.size() == nExpectedSize;
|
||||
}
|
||||
|
||||
CBitcoinAddress()
|
||||
{
|
||||
}
|
||||
|
||||
CBitcoinAddress(uint160 hash160In)
|
||||
{
|
||||
SetHash160(hash160In);
|
||||
}
|
||||
|
||||
CBitcoinAddress(const std::vector<unsigned char>& vchPubKey)
|
||||
{
|
||||
SetPubKey(vchPubKey);
|
||||
}
|
||||
|
||||
CBitcoinAddress(const std::string& strAddress)
|
||||
{
|
||||
SetString(strAddress);
|
||||
}
|
||||
|
||||
CBitcoinAddress(const char* pszAddress)
|
||||
{
|
||||
SetString(pszAddress);
|
||||
}
|
||||
|
||||
uint160 GetHash160() const
|
||||
{
|
||||
assert(vchData.size() == 20);
|
||||
uint160 hash160;
|
||||
memcpy(&hash160, &vchData[0], 20);
|
||||
return hash160;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,14 +1,15 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2011 The Bitcoin developers
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
#ifndef BITCOIN_BIGNUM_H
|
||||
#define BITCOIN_BIGNUM_H
|
||||
|
||||
#include <stdexcept>
|
||||
#include <vector>
|
||||
#include <openssl/bn.h>
|
||||
|
||||
|
||||
|
||||
|
||||
#include "util.h"
|
||||
|
||||
class bignum_error : public std::runtime_error
|
||||
{
|
||||
@@ -228,10 +229,13 @@ public:
|
||||
{
|
||||
std::vector<unsigned char> vch2(vch.size() + 4);
|
||||
unsigned int nSize = vch.size();
|
||||
// BIGNUM's byte stream format expects 4 bytes of
|
||||
// big endian size data info at the front
|
||||
vch2[0] = (nSize >> 24) & 0xff;
|
||||
vch2[1] = (nSize >> 16) & 0xff;
|
||||
vch2[2] = (nSize >> 8) & 0xff;
|
||||
vch2[3] = (nSize >> 0) & 0xff;
|
||||
// swap data to big endian
|
||||
reverse_copy(vch.begin(), vch.end(), vch2.begin() + 4);
|
||||
BN_mpi2bn(&vch2[0], vch2.size(), this);
|
||||
}
|
||||
@@ -308,7 +312,7 @@ public:
|
||||
CAutoBN_CTX pctx;
|
||||
CBigNum bnBase = nBase;
|
||||
CBigNum bn0 = 0;
|
||||
string str;
|
||||
std::string str;
|
||||
CBigNum bn = *this;
|
||||
BN_set_negative(&bn, false);
|
||||
CBigNum dv;
|
||||
@@ -348,7 +352,7 @@ public:
|
||||
template<typename Stream>
|
||||
void Unserialize(Stream& s, int nType=0, int nVersion=VERSION)
|
||||
{
|
||||
vector<unsigned char> vch;
|
||||
std::vector<unsigned char> vch;
|
||||
::Unserialize(s, vch, nType, nVersion);
|
||||
setvch(vch);
|
||||
}
|
||||
@@ -401,7 +405,16 @@ public:
|
||||
|
||||
CBigNum& operator>>=(unsigned int shift)
|
||||
{
|
||||
// Note: BN_rshift segfaults on 64-bit ubuntu 9.10 if 2^shift is greater than the number
|
||||
// Note: BN_rshift segfaults on 64-bit if 2^shift is greater than the number
|
||||
// if built on ubuntu 9.04 or 9.10, probably depends on version of openssl
|
||||
CBigNum a = 1;
|
||||
a <<= shift;
|
||||
if (BN_cmp(&a, this) > 0)
|
||||
{
|
||||
*this = 0;
|
||||
return *this;
|
||||
}
|
||||
|
||||
if (!BN_rshift(this, this, shift))
|
||||
throw bignum_error("CBigNum:operator>>= : BN_rshift failed");
|
||||
return *this;
|
||||
@@ -510,10 +523,8 @@ inline const CBigNum operator<<(const CBigNum& a, unsigned int shift)
|
||||
|
||||
inline const CBigNum operator>>(const CBigNum& a, unsigned int shift)
|
||||
{
|
||||
CBigNum r;
|
||||
// Note: BN_rshift segfaults on 64-bit ubuntu 9.10 if 2^shift is greater than the number
|
||||
if (!BN_rshift(&r, &a, shift))
|
||||
throw bignum_error("CBigNum:operator>> : BN_rshift failed");
|
||||
CBigNum r = a;
|
||||
r >>= shift;
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -523,3 +534,5 @@ inline bool operator<=(const CBigNum& a, const CBigNum& b) { return (BN_cmp(&a,
|
||||
inline bool operator>=(const CBigNum& a, const CBigNum& b) { return (BN_cmp(&a, &b) >= 0); }
|
||||
inline bool operator<(const CBigNum& a, const CBigNum& b) { return (BN_cmp(&a, &b) < 0); }
|
||||
inline bool operator>(const CBigNum& a, const CBigNum& b) { return (BN_cmp(&a, &b) > 0); }
|
||||
|
||||
#endif
|
||||
2564
src/bitcoinrpc.cpp
Normal file
@@ -1,4 +1,5 @@
|
||||
// Copyright (c) 2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2011 The Bitcoin developers
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
132
src/crypter.cpp
Normal file
@@ -0,0 +1,132 @@
|
||||
// Copyright (c) 2011 The Bitcoin Developers
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include <openssl/aes.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include "headers.h"
|
||||
#ifdef WIN32
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#include "crypter.h"
|
||||
#include "main.h"
|
||||
#include "util.h"
|
||||
|
||||
bool CCrypter::SetKeyFromPassphrase(const std::string& strKeyData, const std::vector<unsigned char>& chSalt, const unsigned int nRounds, const unsigned int nDerivationMethod)
|
||||
{
|
||||
if (nRounds < 1 || chSalt.size() != WALLET_CRYPTO_SALT_SIZE)
|
||||
return false;
|
||||
|
||||
// Try to keep the keydata out of swap (and be a bit over-careful to keep the IV that we don't even use out of swap)
|
||||
// Note that this does nothing about suspend-to-disk (which will put all our key data on disk)
|
||||
// Note as well that at no point in this program is any attempt made to prevent stealing of keys by reading the memory of the running process.
|
||||
mlock(&chKey[0], sizeof chKey);
|
||||
mlock(&chIV[0], sizeof chIV);
|
||||
|
||||
int i = 0;
|
||||
if (nDerivationMethod == 0)
|
||||
i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha512(), &chSalt[0],
|
||||
(unsigned char *)&strKeyData[0], strKeyData.size(), nRounds, chKey, chIV);
|
||||
|
||||
if (i != WALLET_CRYPTO_KEY_SIZE)
|
||||
{
|
||||
memset(&chKey, 0, sizeof chKey);
|
||||
memset(&chIV, 0, sizeof chIV);
|
||||
return false;
|
||||
}
|
||||
|
||||
fKeySet = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCrypter::SetKey(const CKeyingMaterial& chNewKey, const std::vector<unsigned char>& chNewIV)
|
||||
{
|
||||
if (chNewKey.size() != WALLET_CRYPTO_KEY_SIZE || chNewIV.size() != WALLET_CRYPTO_KEY_SIZE)
|
||||
return false;
|
||||
|
||||
// Try to keep the keydata out of swap
|
||||
// Note that this does nothing about suspend-to-disk (which will put all our key data on disk)
|
||||
// Note as well that at no point in this program is any attempt made to prevent stealing of keys by reading the memory of the running process.
|
||||
mlock(&chKey[0], sizeof chKey);
|
||||
mlock(&chIV[0], sizeof chIV);
|
||||
|
||||
memcpy(&chKey[0], &chNewKey[0], sizeof chKey);
|
||||
memcpy(&chIV[0], &chNewIV[0], sizeof chIV);
|
||||
|
||||
fKeySet = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCrypter::Encrypt(const CKeyingMaterial& vchPlaintext, std::vector<unsigned char> &vchCiphertext)
|
||||
{
|
||||
if (!fKeySet)
|
||||
return false;
|
||||
|
||||
// max ciphertext len for a n bytes of plaintext is
|
||||
// n + AES_BLOCK_SIZE - 1 bytes
|
||||
int nLen = vchPlaintext.size();
|
||||
int nCLen = nLen + AES_BLOCK_SIZE, nFLen = 0;
|
||||
vchCiphertext = std::vector<unsigned char> (nCLen);
|
||||
|
||||
EVP_CIPHER_CTX ctx;
|
||||
|
||||
EVP_CIPHER_CTX_init(&ctx);
|
||||
EVP_EncryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV);
|
||||
|
||||
EVP_EncryptUpdate(&ctx, &vchCiphertext[0], &nCLen, &vchPlaintext[0], nLen);
|
||||
EVP_EncryptFinal_ex(&ctx, (&vchCiphertext[0])+nCLen, &nFLen);
|
||||
|
||||
EVP_CIPHER_CTX_cleanup(&ctx);
|
||||
|
||||
vchCiphertext.resize(nCLen + nFLen);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCrypter::Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingMaterial& vchPlaintext)
|
||||
{
|
||||
if (!fKeySet)
|
||||
return false;
|
||||
|
||||
// plaintext will always be equal to or lesser than length of ciphertext
|
||||
int nLen = vchCiphertext.size();
|
||||
int nPLen = nLen, nFLen = 0;
|
||||
|
||||
vchPlaintext = CKeyingMaterial(nPLen);
|
||||
|
||||
EVP_CIPHER_CTX ctx;
|
||||
|
||||
EVP_CIPHER_CTX_init(&ctx);
|
||||
EVP_DecryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV);
|
||||
|
||||
EVP_DecryptUpdate(&ctx, &vchPlaintext[0], &nPLen, &vchCiphertext[0], nLen);
|
||||
EVP_DecryptFinal_ex(&ctx, (&vchPlaintext[0])+nPLen, &nFLen);
|
||||
|
||||
EVP_CIPHER_CTX_cleanup(&ctx);
|
||||
|
||||
vchPlaintext.resize(nPLen + nFLen);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool EncryptSecret(CKeyingMaterial& vMasterKey, const CSecret &vchPlaintext, const uint256& nIV, std::vector<unsigned char> &vchCiphertext)
|
||||
{
|
||||
CCrypter cKeyCrypter;
|
||||
std::vector<unsigned char> chIV(WALLET_CRYPTO_KEY_SIZE);
|
||||
memcpy(&chIV[0], &nIV, WALLET_CRYPTO_KEY_SIZE);
|
||||
if(!cKeyCrypter.SetKey(vMasterKey, chIV))
|
||||
return false;
|
||||
return cKeyCrypter.Encrypt((CKeyingMaterial)vchPlaintext, vchCiphertext);
|
||||
}
|
||||
|
||||
bool DecryptSecret(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCiphertext, const uint256& nIV, CSecret& vchPlaintext)
|
||||
{
|
||||
CCrypter cKeyCrypter;
|
||||
std::vector<unsigned char> chIV(WALLET_CRYPTO_KEY_SIZE);
|
||||
memcpy(&chIV[0], &nIV, WALLET_CRYPTO_KEY_SIZE);
|
||||
if(!cKeyCrypter.SetKey(vMasterKey, chIV))
|
||||
return false;
|
||||
return cKeyCrypter.Decrypt(vchCiphertext, *((CKeyingMaterial*)&vchPlaintext));
|
||||
}
|
||||
96
src/crypter.h
Normal file
@@ -0,0 +1,96 @@
|
||||
// Copyright (c) 2011 The Bitcoin Developers
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
#ifndef __CRYPTER_H__
|
||||
#define __CRYPTER_H__
|
||||
|
||||
#include "key.h"
|
||||
|
||||
const unsigned int WALLET_CRYPTO_KEY_SIZE = 32;
|
||||
const unsigned int WALLET_CRYPTO_SALT_SIZE = 8;
|
||||
|
||||
/*
|
||||
Private key encryption is done based on a CMasterKey,
|
||||
which holds a salt and random encryption key.
|
||||
|
||||
CMasterKeys is encrypted using AES-256-CBC using a key
|
||||
derived using derivation method nDerivationMethod
|
||||
(0 == EVP_sha512()) and derivation iterations nDeriveIterations.
|
||||
vchOtherDerivationParameters is provided for alternative algorithms
|
||||
which may require more parameters (such as scrypt).
|
||||
|
||||
Wallet Private Keys are then encrypted using AES-256-CBC
|
||||
with the double-sha256 of the private key as the IV, and the
|
||||
master key's key as the encryption key.
|
||||
*/
|
||||
|
||||
class CMasterKey
|
||||
{
|
||||
public:
|
||||
std::vector<unsigned char> vchCryptedKey;
|
||||
std::vector<unsigned char> vchSalt;
|
||||
// 0 = EVP_sha512()
|
||||
// 1 = scrypt()
|
||||
unsigned int nDerivationMethod;
|
||||
unsigned int nDeriveIterations;
|
||||
// Use this for more parameters to key derivation,
|
||||
// such as the various parameters to scrypt
|
||||
std::vector<unsigned char> vchOtherDerivationParameters;
|
||||
|
||||
IMPLEMENT_SERIALIZE
|
||||
(
|
||||
READWRITE(vchCryptedKey);
|
||||
READWRITE(vchSalt);
|
||||
READWRITE(nDerivationMethod);
|
||||
READWRITE(nDeriveIterations);
|
||||
READWRITE(vchOtherDerivationParameters);
|
||||
)
|
||||
CMasterKey()
|
||||
{
|
||||
// 25000 rounds is just under 0.1 seconds on a 1.86 GHz Pentium M
|
||||
// ie slightly lower than the lowest hardware we need bother supporting
|
||||
nDeriveIterations = 25000;
|
||||
nDerivationMethod = 0;
|
||||
vchOtherDerivationParameters = std::vector<unsigned char>(0);
|
||||
}
|
||||
};
|
||||
|
||||
typedef std::vector<unsigned char, secure_allocator<unsigned char> > CKeyingMaterial;
|
||||
|
||||
class CCrypter
|
||||
{
|
||||
private:
|
||||
unsigned char chKey[WALLET_CRYPTO_KEY_SIZE];
|
||||
unsigned char chIV[WALLET_CRYPTO_KEY_SIZE];
|
||||
bool fKeySet;
|
||||
|
||||
public:
|
||||
bool SetKeyFromPassphrase(const std::string &strKeyData, const std::vector<unsigned char>& chSalt, const unsigned int nRounds, const unsigned int nDerivationMethod);
|
||||
bool Encrypt(const CKeyingMaterial& vchPlaintext, std::vector<unsigned char> &vchCiphertext);
|
||||
bool Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingMaterial& vchPlaintext);
|
||||
bool SetKey(const CKeyingMaterial& chNewKey, const std::vector<unsigned char>& chNewIV);
|
||||
|
||||
void CleanKey()
|
||||
{
|
||||
memset(&chKey, 0, sizeof chKey);
|
||||
memset(&chIV, 0, sizeof chIV);
|
||||
munlock(&chKey, sizeof chKey);
|
||||
munlock(&chIV, sizeof chIV);
|
||||
fKeySet = false;
|
||||
}
|
||||
|
||||
CCrypter()
|
||||
{
|
||||
fKeySet = false;
|
||||
}
|
||||
|
||||
~CCrypter()
|
||||
{
|
||||
CleanKey();
|
||||
}
|
||||
};
|
||||
|
||||
bool EncryptSecret(CKeyingMaterial& vMasterKey, const CSecret &vchPlaintext, const uint256& nIV, std::vector<unsigned char> &vchCiphertext);
|
||||
bool DecryptSecret(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char> &vchCiphertext, const uint256& nIV, CSecret &vchPlaintext);
|
||||
|
||||
#endif
|
||||
@@ -1,14 +1,20 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2011 The Bitcoin developers
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include "headers.h"
|
||||
#include "db.h"
|
||||
#include "net.h"
|
||||
#include <boost/filesystem.hpp>
|
||||
#include <boost/filesystem/fstream.hpp>
|
||||
|
||||
void ThreadFlushWalletDB(void* parg);
|
||||
using namespace std;
|
||||
using namespace boost;
|
||||
|
||||
|
||||
unsigned int nWalletDBUpdated;
|
||||
|
||||
uint64 nAccountingEntryNumber = 0;
|
||||
|
||||
|
||||
|
||||
@@ -60,7 +66,7 @@ CDB::CDB(const char* pszFile, const char* pszMode) : pdb(NULL)
|
||||
return;
|
||||
string strDataDir = GetDataDir();
|
||||
string strLogDir = strDataDir + "/database";
|
||||
_mkdir(strLogDir.c_str());
|
||||
filesystem::create_directory(strLogDir.c_str());
|
||||
string strErrorFile = strDataDir + "/db.log";
|
||||
printf("dbenv.open strLogDir=%s strErrorFile=%s\n", strLogDir.c_str(), strErrorFile.c_str());
|
||||
|
||||
@@ -77,11 +83,10 @@ CDB::CDB(const char* pszFile, const char* pszMode) : pdb(NULL)
|
||||
DB_INIT_MPOOL |
|
||||
DB_INIT_TXN |
|
||||
DB_THREAD |
|
||||
DB_PRIVATE |
|
||||
DB_RECOVER,
|
||||
S_IRUSR | S_IWUSR);
|
||||
if (ret > 0)
|
||||
throw runtime_error(strprintf("CDB() : error %d opening database environment\n", ret));
|
||||
throw runtime_error(strprintf("CDB() : error %d opening database environment", ret));
|
||||
fDbEnvInit = true;
|
||||
}
|
||||
|
||||
@@ -106,7 +111,7 @@ CDB::CDB(const char* pszFile, const char* pszMode) : pdb(NULL)
|
||||
CRITICAL_BLOCK(cs_db)
|
||||
--mapFileUseCount[strFile];
|
||||
strFile = "";
|
||||
throw runtime_error(strprintf("CDB() : can't open database file %s, error %d\n", pszFile, ret));
|
||||
throw runtime_error(strprintf("CDB() : can't open database file %s, error %d", pszFile, ret));
|
||||
}
|
||||
|
||||
if (fCreate && !Exists(string("version")))
|
||||
@@ -130,13 +135,22 @@ void CDB::Close()
|
||||
vTxn.front()->abort();
|
||||
vTxn.clear();
|
||||
pdb = NULL;
|
||||
dbenv.txn_checkpoint(0, 0, 0);
|
||||
|
||||
// Flush database activity from memory pool to disk log
|
||||
unsigned int nMinutes = 0;
|
||||
if (fReadOnly)
|
||||
nMinutes = 1;
|
||||
if (strFile == "addr.dat")
|
||||
nMinutes = 2;
|
||||
if (strFile == "blkindex.dat" && IsInitialBlockDownload() && nBestHeight % 500 != 0)
|
||||
nMinutes = 1;
|
||||
dbenv.txn_checkpoint(0, nMinutes, 0);
|
||||
|
||||
CRITICAL_BLOCK(cs_db)
|
||||
--mapFileUseCount[strFile];
|
||||
}
|
||||
|
||||
void CloseDb(const string& strFile)
|
||||
void static CloseDb(const string& strFile)
|
||||
{
|
||||
CRITICAL_BLOCK(cs_db)
|
||||
{
|
||||
@@ -335,7 +349,17 @@ bool CTxDB::WriteHashBestChain(uint256 hashBestChain)
|
||||
return Write(string("hashBestChain"), hashBestChain);
|
||||
}
|
||||
|
||||
CBlockIndex* InsertBlockIndex(uint256 hash)
|
||||
bool CTxDB::ReadBestInvalidWork(CBigNum& bnBestInvalidWork)
|
||||
{
|
||||
return Read(string("bnBestInvalidWork"), bnBestInvalidWork);
|
||||
}
|
||||
|
||||
bool CTxDB::WriteBestInvalidWork(CBigNum bnBestInvalidWork)
|
||||
{
|
||||
return Write(string("bnBestInvalidWork"), bnBestInvalidWork);
|
||||
}
|
||||
|
||||
CBlockIndex static * InsertBlockIndex(uint256 hash)
|
||||
{
|
||||
if (hash == 0)
|
||||
return NULL;
|
||||
@@ -357,11 +381,12 @@ CBlockIndex* InsertBlockIndex(uint256 hash)
|
||||
|
||||
bool CTxDB::LoadBlockIndex()
|
||||
{
|
||||
// Get cursor
|
||||
// Get database cursor
|
||||
Dbc* pcursor = GetCursor();
|
||||
if (!pcursor)
|
||||
return false;
|
||||
|
||||
// Load mapBlockIndex
|
||||
unsigned int fFlags = DB_SET_RANGE;
|
||||
loop
|
||||
{
|
||||
@@ -398,9 +423,12 @@ bool CTxDB::LoadBlockIndex()
|
||||
pindexNew->nBits = diskindex.nBits;
|
||||
pindexNew->nNonce = diskindex.nNonce;
|
||||
|
||||
// Watch for genesis block and best block
|
||||
// Watch for genesis block
|
||||
if (pindexGenesisBlock == NULL && diskindex.GetBlockHash() == hashGenesisBlock)
|
||||
pindexGenesisBlock = pindexNew;
|
||||
|
||||
if (!pindexNew->CheckIndex())
|
||||
return error("LoadBlockIndex() : CheckIndex failed at %d", pindexNew->nHeight);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -409,18 +437,63 @@ bool CTxDB::LoadBlockIndex()
|
||||
}
|
||||
pcursor->close();
|
||||
|
||||
// Calculate bnChainWork
|
||||
vector<pair<int, CBlockIndex*> > vSortedByHeight;
|
||||
vSortedByHeight.reserve(mapBlockIndex.size());
|
||||
BOOST_FOREACH(const PAIRTYPE(uint256, CBlockIndex*)& item, mapBlockIndex)
|
||||
{
|
||||
CBlockIndex* pindex = item.second;
|
||||
vSortedByHeight.push_back(make_pair(pindex->nHeight, pindex));
|
||||
}
|
||||
sort(vSortedByHeight.begin(), vSortedByHeight.end());
|
||||
BOOST_FOREACH(const PAIRTYPE(int, CBlockIndex*)& item, vSortedByHeight)
|
||||
{
|
||||
CBlockIndex* pindex = item.second;
|
||||
pindex->bnChainWork = (pindex->pprev ? pindex->pprev->bnChainWork : 0) + pindex->GetBlockWork();
|
||||
}
|
||||
|
||||
// Load hashBestChain pointer to end of best chain
|
||||
if (!ReadHashBestChain(hashBestChain))
|
||||
{
|
||||
if (pindexGenesisBlock == NULL)
|
||||
return true;
|
||||
return error("CTxDB::LoadBlockIndex() : hashBestChain not found");
|
||||
return error("CTxDB::LoadBlockIndex() : hashBestChain not loaded");
|
||||
}
|
||||
|
||||
if (!mapBlockIndex.count(hashBestChain))
|
||||
return error("CTxDB::LoadBlockIndex() : blockindex for hashBestChain not found");
|
||||
return error("CTxDB::LoadBlockIndex() : hashBestChain not found in the block index");
|
||||
pindexBest = mapBlockIndex[hashBestChain];
|
||||
nBestHeight = pindexBest->nHeight;
|
||||
printf("LoadBlockIndex(): hashBestChain=%s height=%d\n", hashBestChain.ToString().substr(0,16).c_str(), nBestHeight);
|
||||
bnBestChainWork = pindexBest->bnChainWork;
|
||||
printf("LoadBlockIndex(): hashBestChain=%s height=%d\n", hashBestChain.ToString().substr(0,20).c_str(), nBestHeight);
|
||||
|
||||
// Load bnBestInvalidWork, OK if it doesn't exist
|
||||
ReadBestInvalidWork(bnBestInvalidWork);
|
||||
|
||||
// Verify blocks in the best chain
|
||||
CBlockIndex* pindexFork = NULL;
|
||||
for (CBlockIndex* pindex = pindexBest; pindex && pindex->pprev; pindex = pindex->pprev)
|
||||
{
|
||||
if (pindex->nHeight < nBestHeight-2500 && !mapArgs.count("-checkblocks"))
|
||||
break;
|
||||
CBlock block;
|
||||
if (!block.ReadFromDisk(pindex))
|
||||
return error("LoadBlockIndex() : block.ReadFromDisk failed");
|
||||
if (!block.CheckBlock())
|
||||
{
|
||||
printf("LoadBlockIndex() : *** found bad block at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString().c_str());
|
||||
pindexFork = pindex->pprev;
|
||||
}
|
||||
}
|
||||
if (pindexFork)
|
||||
{
|
||||
// Reorg back to the fork
|
||||
printf("LoadBlockIndex() : *** moving best chain pointer back to block %d\n", pindexFork->nHeight);
|
||||
CBlock block;
|
||||
if (!block.ReadFromDisk(pindexFork))
|
||||
return error("LoadBlockIndex() : block.ReadFromDisk failed");
|
||||
CTxDB txdb;
|
||||
block.SetBestChain(txdb, pindexFork);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -438,28 +511,15 @@ bool CAddrDB::WriteAddress(const CAddress& addr)
|
||||
return Write(make_pair(string("addr"), addr.GetKey()), addr);
|
||||
}
|
||||
|
||||
bool CAddrDB::EraseAddress(const CAddress& addr)
|
||||
{
|
||||
return Erase(make_pair(string("addr"), addr.GetKey()));
|
||||
}
|
||||
|
||||
bool CAddrDB::LoadAddresses()
|
||||
{
|
||||
CRITICAL_BLOCK(cs_mapAddresses)
|
||||
{
|
||||
// Load user provided addresses
|
||||
CAutoFile filein = fopen((GetDataDir() + "/addr.txt").c_str(), "rt");
|
||||
if (filein)
|
||||
{
|
||||
try
|
||||
{
|
||||
char psz[1000];
|
||||
while (fgets(psz, sizeof(psz), filein))
|
||||
{
|
||||
CAddress addr(psz, NODE_NETWORK);
|
||||
addr.nTime = 0; // so it won't relay unless successfully connected
|
||||
if (addr.IsValid())
|
||||
AddAddress(addr);
|
||||
}
|
||||
}
|
||||
catch (...) { }
|
||||
}
|
||||
|
||||
// Get cursor
|
||||
Dbc* pcursor = GetCursor();
|
||||
if (!pcursor)
|
||||
@@ -489,11 +549,6 @@ bool CAddrDB::LoadAddresses()
|
||||
pcursor->close();
|
||||
|
||||
printf("Loaded %d addresses\n", mapAddresses.size());
|
||||
|
||||
// Fix for possible bug that manifests in mapAddresses.count in irc.cpp,
|
||||
// just need to call count here and it doesn't happen there. The bug was the
|
||||
// pack pragma in irc.cpp and has been fixed, but I'm not in a hurry to delete this.
|
||||
mapAddresses.count(vector<unsigned char>(18));
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -511,26 +566,111 @@ bool LoadAddresses()
|
||||
// CWalletDB
|
||||
//
|
||||
|
||||
bool CWalletDB::LoadWallet()
|
||||
bool CWalletDB::WriteName(const string& strAddress, const string& strName)
|
||||
{
|
||||
vchDefaultKey.clear();
|
||||
nWalletDBUpdated++;
|
||||
return Write(make_pair(string("name"), strAddress), strName);
|
||||
}
|
||||
|
||||
bool CWalletDB::EraseName(const string& strAddress)
|
||||
{
|
||||
// This should only be used for sending addresses, never for receiving addresses,
|
||||
// receiving addresses must always have an address book entry if they're not change return.
|
||||
nWalletDBUpdated++;
|
||||
return Erase(make_pair(string("name"), strAddress));
|
||||
}
|
||||
|
||||
bool CWalletDB::ReadAccount(const string& strAccount, CAccount& account)
|
||||
{
|
||||
account.SetNull();
|
||||
return Read(make_pair(string("acc"), strAccount), account);
|
||||
}
|
||||
|
||||
bool CWalletDB::WriteAccount(const string& strAccount, const CAccount& account)
|
||||
{
|
||||
return Write(make_pair(string("acc"), strAccount), account);
|
||||
}
|
||||
|
||||
bool CWalletDB::WriteAccountingEntry(const CAccountingEntry& acentry)
|
||||
{
|
||||
return Write(boost::make_tuple(string("acentry"), acentry.strAccount, ++nAccountingEntryNumber), acentry);
|
||||
}
|
||||
|
||||
int64 CWalletDB::GetAccountCreditDebit(const string& strAccount)
|
||||
{
|
||||
list<CAccountingEntry> entries;
|
||||
ListAccountCreditDebit(strAccount, entries);
|
||||
|
||||
int64 nCreditDebit = 0;
|
||||
BOOST_FOREACH (const CAccountingEntry& entry, entries)
|
||||
nCreditDebit += entry.nCreditDebit;
|
||||
|
||||
return nCreditDebit;
|
||||
}
|
||||
|
||||
void CWalletDB::ListAccountCreditDebit(const string& strAccount, list<CAccountingEntry>& entries)
|
||||
{
|
||||
bool fAllAccounts = (strAccount == "*");
|
||||
|
||||
Dbc* pcursor = GetCursor();
|
||||
if (!pcursor)
|
||||
throw runtime_error("CWalletDB::ListAccountCreditDebit() : cannot create DB cursor");
|
||||
unsigned int fFlags = DB_SET_RANGE;
|
||||
loop
|
||||
{
|
||||
// Read next record
|
||||
CDataStream ssKey;
|
||||
if (fFlags == DB_SET_RANGE)
|
||||
ssKey << boost::make_tuple(string("acentry"), (fAllAccounts? string("") : strAccount), uint64(0));
|
||||
CDataStream ssValue;
|
||||
int ret = ReadAtCursor(pcursor, ssKey, ssValue, fFlags);
|
||||
fFlags = DB_NEXT;
|
||||
if (ret == DB_NOTFOUND)
|
||||
break;
|
||||
else if (ret != 0)
|
||||
{
|
||||
pcursor->close();
|
||||
throw runtime_error("CWalletDB::ListAccountCreditDebit() : error scanning DB");
|
||||
}
|
||||
|
||||
// Unserialize
|
||||
string strType;
|
||||
ssKey >> strType;
|
||||
if (strType != "acentry")
|
||||
break;
|
||||
CAccountingEntry acentry;
|
||||
ssKey >> acentry.strAccount;
|
||||
if (!fAllAccounts && acentry.strAccount != strAccount)
|
||||
break;
|
||||
|
||||
ssValue >> acentry;
|
||||
entries.push_back(acentry);
|
||||
}
|
||||
|
||||
pcursor->close();
|
||||
}
|
||||
|
||||
|
||||
int CWalletDB::LoadWallet(CWallet* pwallet)
|
||||
{
|
||||
pwallet->vchDefaultKey.clear();
|
||||
int nFileVersion = 0;
|
||||
vector<uint256> vWalletUpgrade;
|
||||
|
||||
// Modify defaults
|
||||
#ifndef __WXMSW__
|
||||
#ifndef WIN32
|
||||
// Tray icon sometimes disappears on 9.10 karmic koala 64-bit, leaving no way to access the program
|
||||
fMinimizeToTray = false;
|
||||
fMinimizeOnClose = false;
|
||||
#endif
|
||||
|
||||
//// todo: shouldn't we catch exceptions and try to recover and continue?
|
||||
CRITICAL_BLOCK(cs_mapKeys)
|
||||
CRITICAL_BLOCK(cs_mapWallet)
|
||||
CRITICAL_BLOCK(pwallet->cs_wallet)
|
||||
{
|
||||
// Get cursor
|
||||
Dbc* pcursor = GetCursor();
|
||||
if (!pcursor)
|
||||
return false;
|
||||
return DB_CORRUPT;
|
||||
|
||||
loop
|
||||
{
|
||||
@@ -541,7 +681,7 @@ bool CWalletDB::LoadWallet()
|
||||
if (ret == DB_NOTFOUND)
|
||||
break;
|
||||
else if (ret != 0)
|
||||
return false;
|
||||
return DB_CORRUPT;
|
||||
|
||||
// Unserialize
|
||||
// Taking advantage of the fact that pair serialization
|
||||
@@ -552,42 +692,105 @@ bool CWalletDB::LoadWallet()
|
||||
{
|
||||
string strAddress;
|
||||
ssKey >> strAddress;
|
||||
ssValue >> mapAddressBook[strAddress];
|
||||
ssValue >> pwallet->mapAddressBook[strAddress];
|
||||
}
|
||||
else if (strType == "tx")
|
||||
{
|
||||
uint256 hash;
|
||||
ssKey >> hash;
|
||||
CWalletTx& wtx = mapWallet[hash];
|
||||
CWalletTx& wtx = pwallet->mapWallet[hash];
|
||||
ssValue >> wtx;
|
||||
wtx.pwallet = pwallet;
|
||||
|
||||
if (wtx.GetHash() != hash)
|
||||
printf("Error in wallet.dat, hash mismatch\n");
|
||||
|
||||
// Undo serialize changes in 31600
|
||||
if (31404 <= wtx.fTimeReceivedIsTxTime && wtx.fTimeReceivedIsTxTime <= 31703)
|
||||
{
|
||||
if (!ssValue.empty())
|
||||
{
|
||||
char fTmp;
|
||||
char fUnused;
|
||||
ssValue >> fTmp >> fUnused >> wtx.strFromAccount;
|
||||
printf("LoadWallet() upgrading tx ver=%d %d '%s' %s\n", wtx.fTimeReceivedIsTxTime, fTmp, wtx.strFromAccount.c_str(), hash.ToString().c_str());
|
||||
wtx.fTimeReceivedIsTxTime = fTmp;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("LoadWallet() repairing tx ver=%d %s\n", wtx.fTimeReceivedIsTxTime, hash.ToString().c_str());
|
||||
wtx.fTimeReceivedIsTxTime = 0;
|
||||
}
|
||||
vWalletUpgrade.push_back(hash);
|
||||
}
|
||||
|
||||
//// debug print
|
||||
//printf("LoadWallet %s\n", wtx.GetHash().ToString().c_str());
|
||||
//printf(" %12I64d %s %s %s\n",
|
||||
// wtx.vout[0].nValue,
|
||||
// DateTimeStrFormat("%x %H:%M:%S", wtx.nTime).c_str(),
|
||||
// wtx.hashBlock.ToString().substr(0,16).c_str(),
|
||||
// DateTimeStrFormat("%x %H:%M:%S", wtx.GetBlockTime()).c_str(),
|
||||
// wtx.hashBlock.ToString().substr(0,20).c_str(),
|
||||
// wtx.mapValue["message"].c_str());
|
||||
}
|
||||
else if (strType == "acentry")
|
||||
{
|
||||
string strAccount;
|
||||
ssKey >> strAccount;
|
||||
uint64 nNumber;
|
||||
ssKey >> nNumber;
|
||||
if (nNumber > nAccountingEntryNumber)
|
||||
nAccountingEntryNumber = nNumber;
|
||||
}
|
||||
else if (strType == "key" || strType == "wkey")
|
||||
{
|
||||
vector<unsigned char> vchPubKey;
|
||||
ssKey >> vchPubKey;
|
||||
CWalletKey wkey;
|
||||
CKey key;
|
||||
if (strType == "key")
|
||||
ssValue >> wkey.vchPrivKey;
|
||||
{
|
||||
CPrivKey pkey;
|
||||
ssValue >> pkey;
|
||||
key.SetPrivKey(pkey);
|
||||
}
|
||||
else
|
||||
{
|
||||
CWalletKey wkey;
|
||||
ssValue >> wkey;
|
||||
|
||||
mapKeys[vchPubKey] = wkey.vchPrivKey;
|
||||
mapPubKeys[Hash160(vchPubKey)] = vchPubKey;
|
||||
key.SetPrivKey(wkey.vchPrivKey);
|
||||
}
|
||||
if (!pwallet->LoadKey(key))
|
||||
return DB_CORRUPT;
|
||||
}
|
||||
else if (strType == "mkey")
|
||||
{
|
||||
unsigned int nID;
|
||||
ssKey >> nID;
|
||||
CMasterKey kMasterKey;
|
||||
ssValue >> kMasterKey;
|
||||
if(pwallet->mapMasterKeys.count(nID) != 0)
|
||||
return DB_CORRUPT;
|
||||
pwallet->mapMasterKeys[nID] = kMasterKey;
|
||||
if (pwallet->nMasterKeyMaxID < nID)
|
||||
pwallet->nMasterKeyMaxID = nID;
|
||||
}
|
||||
else if (strType == "ckey")
|
||||
{
|
||||
vector<unsigned char> vchPubKey;
|
||||
ssKey >> vchPubKey;
|
||||
vector<unsigned char> vchPrivKey;
|
||||
ssValue >> vchPrivKey;
|
||||
if (!pwallet->LoadCryptedKey(vchPubKey, vchPrivKey))
|
||||
return DB_CORRUPT;
|
||||
}
|
||||
else if (strType == "defaultkey")
|
||||
{
|
||||
ssValue >> vchDefaultKey;
|
||||
ssValue >> pwallet->vchDefaultKey;
|
||||
}
|
||||
else if (strType == "pool")
|
||||
{
|
||||
int64 nIndex;
|
||||
ssKey >> nIndex;
|
||||
pwallet->setKeyPool.insert(nIndex);
|
||||
}
|
||||
else if (strType == "version")
|
||||
{
|
||||
@@ -600,42 +803,44 @@ bool CWalletDB::LoadWallet()
|
||||
string strKey;
|
||||
ssKey >> strKey;
|
||||
|
||||
// Menu state
|
||||
if (strKey == "fGenerateBitcoins") ssValue >> fGenerateBitcoins;
|
||||
|
||||
// Options
|
||||
#ifndef QT_GUI
|
||||
if (strKey == "fGenerateBitcoins") ssValue >> fGenerateBitcoins;
|
||||
#endif
|
||||
if (strKey == "nTransactionFee") ssValue >> nTransactionFee;
|
||||
if (strKey == "addrIncoming") ssValue >> addrIncoming;
|
||||
if (strKey == "fLimitProcessors") ssValue >> fLimitProcessors;
|
||||
if (strKey == "nLimitProcessors") ssValue >> nLimitProcessors;
|
||||
if (strKey == "fMinimizeToTray") ssValue >> fMinimizeToTray;
|
||||
if (strKey == "fMinimizeOnClose") ssValue >> fMinimizeOnClose;
|
||||
if (strKey == "fUseProxy") ssValue >> fUseProxy;
|
||||
if (strKey == "addrProxy") ssValue >> addrProxy;
|
||||
|
||||
if (fHaveUPnP && strKey == "fUseUPnP") ssValue >> fUseUPnP;
|
||||
}
|
||||
else if (strType == "minversion")
|
||||
{
|
||||
int nMinVersion = 0;
|
||||
ssValue >> nMinVersion;
|
||||
if (nMinVersion > VERSION)
|
||||
return DB_TOO_NEW;
|
||||
}
|
||||
}
|
||||
pcursor->close();
|
||||
}
|
||||
|
||||
BOOST_FOREACH(uint256 hash, vWalletUpgrade)
|
||||
WriteTx(hash, pwallet->mapWallet[hash]);
|
||||
|
||||
printf("nFileVersion = %d\n", nFileVersion);
|
||||
printf("fGenerateBitcoins = %d\n", fGenerateBitcoins);
|
||||
printf("nTransactionFee = %"PRI64d"\n", nTransactionFee);
|
||||
printf("addrIncoming = %s\n", addrIncoming.ToString().c_str());
|
||||
printf("fMinimizeToTray = %d\n", fMinimizeToTray);
|
||||
printf("fMinimizeOnClose = %d\n", fMinimizeOnClose);
|
||||
printf("fUseProxy = %d\n", fUseProxy);
|
||||
printf("addrProxy = %s\n", addrProxy.ToString().c_str());
|
||||
if (fHaveUPnP)
|
||||
printf("fUseUPnP = %d\n", fUseUPnP);
|
||||
|
||||
|
||||
// The transaction fee setting won't be needed for many years to come.
|
||||
// Setting it to zero here in case they set it to something in an earlier version.
|
||||
if (nTransactionFee != 0)
|
||||
{
|
||||
nTransactionFee = 0;
|
||||
WriteSetting("nTransactionFee", nTransactionFee);
|
||||
}
|
||||
|
||||
// Upgrade
|
||||
if (nFileVersion < VERSION)
|
||||
{
|
||||
@@ -646,40 +851,13 @@ bool CWalletDB::LoadWallet()
|
||||
WriteVersion(VERSION);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool LoadWallet(bool& fFirstRunRet)
|
||||
{
|
||||
fFirstRunRet = false;
|
||||
if (!CWalletDB("cr+").LoadWallet())
|
||||
return false;
|
||||
fFirstRunRet = vchDefaultKey.empty();
|
||||
|
||||
if (mapKeys.count(vchDefaultKey))
|
||||
{
|
||||
// Set keyUser
|
||||
keyUser.SetPubKey(vchDefaultKey);
|
||||
keyUser.SetPrivKey(mapKeys[vchDefaultKey]);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Create new keyUser and set as default key
|
||||
RandAddSeedPerfmon();
|
||||
keyUser.MakeNewKey();
|
||||
if (!AddKey(keyUser))
|
||||
return false;
|
||||
if (!SetAddressBookName(PubKeyToAddress(keyUser.GetPubKey()), "Your Address"))
|
||||
return false;
|
||||
CWalletDB().WriteDefaultKey(keyUser.GetPubKey());
|
||||
}
|
||||
|
||||
CreateThread(ThreadFlushWalletDB, NULL);
|
||||
return true;
|
||||
return DB_LOAD_OK;
|
||||
}
|
||||
|
||||
void ThreadFlushWalletDB(void* parg)
|
||||
{
|
||||
const string& strFile = ((const string*)parg)[0];
|
||||
static bool fOneThread;
|
||||
if (fOneThread)
|
||||
return;
|
||||
@@ -715,7 +893,6 @@ void ThreadFlushWalletDB(void* parg)
|
||||
|
||||
if (nRefCount == 0 && !fShutdown)
|
||||
{
|
||||
string strFile = "wallet.dat";
|
||||
map<string, int>::iterator mi = mapFileUseCount.find(strFile);
|
||||
if (mi != mapFileUseCount.end())
|
||||
{
|
||||
@@ -737,3 +914,39 @@ void ThreadFlushWalletDB(void* parg)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool BackupWallet(const CWallet& wallet, const string& strDest)
|
||||
{
|
||||
if (!wallet.fFileBacked)
|
||||
return false;
|
||||
while (!fShutdown)
|
||||
{
|
||||
CRITICAL_BLOCK(cs_db)
|
||||
{
|
||||
if (!mapFileUseCount.count(wallet.strWalletFile) || mapFileUseCount[wallet.strWalletFile] == 0)
|
||||
{
|
||||
// Flush log data to the dat file
|
||||
CloseDb(wallet.strWalletFile);
|
||||
dbenv.txn_checkpoint(0, 0, 0);
|
||||
dbenv.lsn_reset(wallet.strWalletFile.c_str(), 0);
|
||||
mapFileUseCount.erase(wallet.strWalletFile);
|
||||
|
||||
// Copy wallet.dat
|
||||
filesystem::path pathSrc(GetDataDir() + "/" + wallet.strWalletFile);
|
||||
filesystem::path pathDest(strDest);
|
||||
if (filesystem::is_directory(pathDest))
|
||||
pathDest = pathDest / wallet.strWalletFile;
|
||||
#if BOOST_VERSION >= 104000
|
||||
filesystem::copy_file(pathSrc, pathDest, filesystem::copy_option::overwrite_if_exists);
|
||||
#else
|
||||
filesystem::copy_file(pathSrc, pathDest);
|
||||
#endif
|
||||
printf("copied wallet.dat to %s\n", pathDest.string().c_str());
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Sleep(100);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
200
db.h → src/db.h
@@ -1,22 +1,28 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2011 The Bitcoin developers
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
#ifndef BITCOIN_DB_H
|
||||
#define BITCOIN_DB_H
|
||||
|
||||
#include "key.h"
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <db_cxx.h>
|
||||
|
||||
class CTransaction;
|
||||
class CTxIndex;
|
||||
class CDiskBlockIndex;
|
||||
class CDiskTxPos;
|
||||
class COutPoint;
|
||||
class CUser;
|
||||
class CReview;
|
||||
class CAddress;
|
||||
class CWalletTx;
|
||||
|
||||
extern map<string, string> mapAddressBook;
|
||||
extern CCriticalSection cs_mapAddressBook;
|
||||
extern vector<unsigned char> vchDefaultKey;
|
||||
extern bool fClient;
|
||||
|
||||
class CWallet;
|
||||
class CAccount;
|
||||
class CAccountingEntry;
|
||||
class CBlockLocator;
|
||||
|
||||
|
||||
extern unsigned int nWalletDBUpdated;
|
||||
@@ -24,6 +30,8 @@ extern DbEnv dbenv;
|
||||
|
||||
|
||||
extern void DBFlush(bool fShutdown);
|
||||
void ThreadFlushWalletDB(void* parg);
|
||||
bool BackupWallet(const CWallet& wallet, const std::string& strDest);
|
||||
|
||||
|
||||
|
||||
@@ -32,8 +40,8 @@ class CDB
|
||||
{
|
||||
protected:
|
||||
Db* pdb;
|
||||
string strFile;
|
||||
vector<DbTxn*> vTxn;
|
||||
std::string strFile;
|
||||
std::vector<DbTxn*> vTxn;
|
||||
bool fReadOnly;
|
||||
|
||||
explicit CDB(const char* pszFile, const char* pszMode="r+");
|
||||
@@ -81,7 +89,7 @@ protected:
|
||||
if (!pdb)
|
||||
return false;
|
||||
if (fReadOnly)
|
||||
assert(("Write called on database in read-only mode", false));
|
||||
assert(!"Write called on database in read-only mode");
|
||||
|
||||
// Key
|
||||
CDataStream ssKey(SER_DISK);
|
||||
@@ -110,7 +118,7 @@ protected:
|
||||
if (!pdb)
|
||||
return false;
|
||||
if (fReadOnly)
|
||||
assert(("Erase called on database in read-only mode", false));
|
||||
assert(!"Erase called on database in read-only mode");
|
||||
|
||||
// Key
|
||||
CDataStream ssKey(SER_DISK);
|
||||
@@ -210,7 +218,7 @@ public:
|
||||
if (!pdb)
|
||||
return false;
|
||||
DbTxn* ptxn = NULL;
|
||||
int ret = dbenv.txn_begin(GetTxn(), &ptxn, 0);
|
||||
int ret = dbenv.txn_begin(GetTxn(), &ptxn, DB_TXN_NOSYNC);
|
||||
if (!ptxn || ret != 0)
|
||||
return false;
|
||||
vTxn.push_back(ptxn);
|
||||
@@ -242,12 +250,12 @@ public:
|
||||
bool ReadVersion(int& nVersion)
|
||||
{
|
||||
nVersion = 0;
|
||||
return Read(string("version"), nVersion);
|
||||
return Read(std::string("version"), nVersion);
|
||||
}
|
||||
|
||||
bool WriteVersion(int nVersion)
|
||||
{
|
||||
return Write(string("version"), nVersion);
|
||||
return Write(std::string("version"), nVersion);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -261,7 +269,7 @@ public:
|
||||
class CTxDB : public CDB
|
||||
{
|
||||
public:
|
||||
CTxDB(const char* pszMode="r+") : CDB(!fClient ? "blkindex.dat" : NULL, pszMode) { }
|
||||
CTxDB(const char* pszMode="r+") : CDB("blkindex.dat", pszMode) { }
|
||||
private:
|
||||
CTxDB(const CTxDB&);
|
||||
void operator=(const CTxDB&);
|
||||
@@ -271,7 +279,7 @@ public:
|
||||
bool AddTxIndex(const CTransaction& tx, const CDiskTxPos& pos, int nHeight);
|
||||
bool EraseTxIndex(const CTransaction& tx);
|
||||
bool ContainsTx(uint256 hash);
|
||||
bool ReadOwnerTxes(uint160 hash160, int nHeight, vector<CTransaction>& vtx);
|
||||
bool ReadOwnerTxes(uint160 hash160, int nHeight, std::vector<CTransaction>& vtx);
|
||||
bool ReadDiskTx(uint256 hash, CTransaction& tx, CTxIndex& txindex);
|
||||
bool ReadDiskTx(uint256 hash, CTransaction& tx);
|
||||
bool ReadDiskTx(COutPoint outpoint, CTransaction& tx, CTxIndex& txindex);
|
||||
@@ -280,6 +288,8 @@ public:
|
||||
bool EraseBlockIndex(uint256 hash);
|
||||
bool ReadHashBestChain(uint256& hashBestChain);
|
||||
bool WriteHashBestChain(uint256 hashBestChain);
|
||||
bool ReadBestInvalidWork(CBigNum& bnBestInvalidWork);
|
||||
bool WriteBestInvalidWork(CBigNum bnBestInvalidWork);
|
||||
bool LoadBlockIndex();
|
||||
};
|
||||
|
||||
@@ -296,6 +306,7 @@ private:
|
||||
void operator=(const CAddrDB&);
|
||||
public:
|
||||
bool WriteAddress(const CAddress& addr);
|
||||
bool EraseAddress(const CAddress& addr);
|
||||
bool LoadAddresses();
|
||||
};
|
||||
|
||||
@@ -303,102 +314,171 @@ bool LoadAddresses();
|
||||
|
||||
|
||||
|
||||
class CKeyPool
|
||||
{
|
||||
public:
|
||||
int64 nTime;
|
||||
std::vector<unsigned char> vchPubKey;
|
||||
|
||||
CKeyPool()
|
||||
{
|
||||
nTime = GetTime();
|
||||
}
|
||||
|
||||
CKeyPool(const std::vector<unsigned char>& vchPubKeyIn)
|
||||
{
|
||||
nTime = GetTime();
|
||||
vchPubKey = vchPubKeyIn;
|
||||
}
|
||||
|
||||
IMPLEMENT_SERIALIZE
|
||||
(
|
||||
if (!(nType & SER_GETHASH))
|
||||
READWRITE(nVersion);
|
||||
READWRITE(nTime);
|
||||
READWRITE(vchPubKey);
|
||||
)
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
enum DBErrors
|
||||
{
|
||||
DB_LOAD_OK,
|
||||
DB_CORRUPT,
|
||||
DB_TOO_NEW,
|
||||
DB_LOAD_FAIL,
|
||||
};
|
||||
|
||||
class CWalletDB : public CDB
|
||||
{
|
||||
public:
|
||||
CWalletDB(const char* pszMode="r+") : CDB("wallet.dat", pszMode) { }
|
||||
CWalletDB(std::string strFilename, const char* pszMode="r+") : CDB(strFilename.c_str(), pszMode)
|
||||
{
|
||||
}
|
||||
private:
|
||||
CWalletDB(const CWalletDB&);
|
||||
void operator=(const CWalletDB&);
|
||||
public:
|
||||
bool ReadName(const string& strAddress, string& strName)
|
||||
bool ReadName(const std::string& strAddress, std::string& strName)
|
||||
{
|
||||
strName = "";
|
||||
return Read(make_pair(string("name"), strAddress), strName);
|
||||
return Read(std::make_pair(std::string("name"), strAddress), strName);
|
||||
}
|
||||
|
||||
bool WriteName(const string& strAddress, const string& strName)
|
||||
{
|
||||
CRITICAL_BLOCK(cs_mapAddressBook)
|
||||
mapAddressBook[strAddress] = strName;
|
||||
nWalletDBUpdated++;
|
||||
return Write(make_pair(string("name"), strAddress), strName);
|
||||
}
|
||||
bool WriteName(const std::string& strAddress, const std::string& strName);
|
||||
|
||||
bool EraseName(const string& strAddress)
|
||||
{
|
||||
// This should only be used for sending addresses, never for receiving addresses,
|
||||
// receiving addresses must always have an address book entry if they're not change return.
|
||||
CRITICAL_BLOCK(cs_mapAddressBook)
|
||||
mapAddressBook.erase(strAddress);
|
||||
nWalletDBUpdated++;
|
||||
return Erase(make_pair(string("name"), strAddress));
|
||||
}
|
||||
bool EraseName(const std::string& strAddress);
|
||||
|
||||
bool ReadTx(uint256 hash, CWalletTx& wtx)
|
||||
{
|
||||
return Read(make_pair(string("tx"), hash), wtx);
|
||||
return Read(std::make_pair(std::string("tx"), hash), wtx);
|
||||
}
|
||||
|
||||
bool WriteTx(uint256 hash, const CWalletTx& wtx)
|
||||
{
|
||||
nWalletDBUpdated++;
|
||||
return Write(make_pair(string("tx"), hash), wtx);
|
||||
return Write(std::make_pair(std::string("tx"), hash), wtx);
|
||||
}
|
||||
|
||||
bool EraseTx(uint256 hash)
|
||||
{
|
||||
nWalletDBUpdated++;
|
||||
return Erase(make_pair(string("tx"), hash));
|
||||
return Erase(std::make_pair(std::string("tx"), hash));
|
||||
}
|
||||
|
||||
bool ReadKey(const vector<unsigned char>& vchPubKey, CPrivKey& vchPrivKey)
|
||||
bool ReadKey(const std::vector<unsigned char>& vchPubKey, CPrivKey& vchPrivKey)
|
||||
{
|
||||
vchPrivKey.clear();
|
||||
return Read(make_pair(string("key"), vchPubKey), vchPrivKey);
|
||||
return Read(std::make_pair(std::string("key"), vchPubKey), vchPrivKey);
|
||||
}
|
||||
|
||||
bool WriteKey(const vector<unsigned char>& vchPubKey, const CPrivKey& vchPrivKey)
|
||||
bool WriteKey(const std::vector<unsigned char>& vchPubKey, const CPrivKey& vchPrivKey)
|
||||
{
|
||||
nWalletDBUpdated++;
|
||||
return Write(make_pair(string("key"), vchPubKey), vchPrivKey, false);
|
||||
return Write(std::make_pair(std::string("key"), vchPubKey), vchPrivKey, false);
|
||||
}
|
||||
|
||||
bool ReadDefaultKey(vector<unsigned char>& vchPubKey)
|
||||
bool WriteCryptedKey(const std::vector<unsigned char>& vchPubKey, const std::vector<unsigned char>& vchCryptedSecret, bool fEraseUnencryptedKey = true)
|
||||
{
|
||||
nWalletDBUpdated++;
|
||||
if (!Write(std::make_pair(std::string("ckey"), vchPubKey), vchCryptedSecret, false))
|
||||
return false;
|
||||
if (fEraseUnencryptedKey)
|
||||
{
|
||||
Erase(std::make_pair(std::string("key"), vchPubKey));
|
||||
Erase(std::make_pair(std::string("wkey"), vchPubKey));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WriteMasterKey(unsigned int nID, const CMasterKey& kMasterKey)
|
||||
{
|
||||
nWalletDBUpdated++;
|
||||
return Write(std::make_pair(std::string("mkey"), nID), kMasterKey, true);
|
||||
}
|
||||
|
||||
bool WriteBestBlock(const CBlockLocator& locator)
|
||||
{
|
||||
nWalletDBUpdated++;
|
||||
return Write(std::string("bestblock"), locator);
|
||||
}
|
||||
|
||||
bool ReadBestBlock(CBlockLocator& locator)
|
||||
{
|
||||
return Read(std::string("bestblock"), locator);
|
||||
}
|
||||
|
||||
bool ReadDefaultKey(std::vector<unsigned char>& vchPubKey)
|
||||
{
|
||||
vchPubKey.clear();
|
||||
return Read(string("defaultkey"), vchPubKey);
|
||||
return Read(std::string("defaultkey"), vchPubKey);
|
||||
}
|
||||
|
||||
bool WriteDefaultKey(const vector<unsigned char>& vchPubKey)
|
||||
bool WriteDefaultKey(const std::vector<unsigned char>& vchPubKey)
|
||||
{
|
||||
vchDefaultKey = vchPubKey;
|
||||
nWalletDBUpdated++;
|
||||
return Write(string("defaultkey"), vchPubKey);
|
||||
return Write(std::string("defaultkey"), vchPubKey);
|
||||
}
|
||||
|
||||
bool ReadPool(int64 nPool, CKeyPool& keypool)
|
||||
{
|
||||
return Read(std::make_pair(std::string("pool"), nPool), keypool);
|
||||
}
|
||||
|
||||
bool WritePool(int64 nPool, const CKeyPool& keypool)
|
||||
{
|
||||
nWalletDBUpdated++;
|
||||
return Write(std::make_pair(std::string("pool"), nPool), keypool);
|
||||
}
|
||||
|
||||
bool ErasePool(int64 nPool)
|
||||
{
|
||||
nWalletDBUpdated++;
|
||||
return Erase(std::make_pair(std::string("pool"), nPool));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
bool ReadSetting(const string& strKey, T& value)
|
||||
bool ReadSetting(const std::string& strKey, T& value)
|
||||
{
|
||||
return Read(make_pair(string("setting"), strKey), value);
|
||||
return Read(std::make_pair(std::string("setting"), strKey), value);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
bool WriteSetting(const string& strKey, const T& value)
|
||||
bool WriteSetting(const std::string& strKey, const T& value)
|
||||
{
|
||||
nWalletDBUpdated++;
|
||||
return Write(make_pair(string("setting"), strKey), value);
|
||||
return Write(std::make_pair(std::string("setting"), strKey), value);
|
||||
}
|
||||
|
||||
bool LoadWallet();
|
||||
bool ReadAccount(const std::string& strAccount, CAccount& account);
|
||||
bool WriteAccount(const std::string& strAccount, const CAccount& account);
|
||||
bool WriteAccountingEntry(const CAccountingEntry& acentry);
|
||||
int64 GetAccountCreditDebit(const std::string& strAccount);
|
||||
void ListAccountCreditDebit(const std::string& strAccount, std::list<CAccountingEntry>& acentries);
|
||||
|
||||
int LoadWallet(CWallet* pwallet);
|
||||
};
|
||||
|
||||
bool LoadWallet(bool& fFirstRunRet);
|
||||
|
||||
inline bool SetAddressBookName(const string& strAddress, const string& strName)
|
||||
{
|
||||
return CWalletDB().WriteName(strAddress, strName);
|
||||
}
|
||||
#endif
|
||||
@@ -1,4 +1,5 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2011 The Bitcoin developers
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
@@ -11,21 +12,22 @@
|
||||
#ifdef _WIN32_WINNT
|
||||
#undef _WIN32_WINNT
|
||||
#endif
|
||||
#define _WIN32_WINNT 0x0400
|
||||
#define _WIN32_WINNT 0x0500
|
||||
#ifdef _WIN32_IE
|
||||
#undef _WIN32_IE
|
||||
#endif
|
||||
#define _WIN32_IE 0x0400
|
||||
#define WIN32_LEAN_AND_MEAN 1
|
||||
#define __STDC_LIMIT_MACROS // to enable UINT64_MAX from stdint.h
|
||||
#include <wx/wx.h>
|
||||
#include <wx/stdpaths.h>
|
||||
#include <wx/snglinst.h>
|
||||
#if wxUSE_GUI
|
||||
#include <wx/utils.h>
|
||||
#include <wx/clipbrd.h>
|
||||
#include <wx/taskbar.h>
|
||||
#if (defined(__unix__) || defined(unix)) && !defined(USG)
|
||||
#include <sys/param.h> // to get BSD define
|
||||
#endif
|
||||
#ifdef MAC_OSX
|
||||
#ifndef BSD
|
||||
#define BSD 1
|
||||
#endif
|
||||
#endif
|
||||
#include <openssl/buffer.h>
|
||||
#include <openssl/ecdsa.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/rand.h>
|
||||
@@ -34,11 +36,11 @@
|
||||
#include <db_cxx.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <limits.h>
|
||||
#include <float.h>
|
||||
#include <assert.h>
|
||||
#include <memory>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
@@ -46,26 +48,10 @@
|
||||
#include <list>
|
||||
#include <deque>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <algorithm>
|
||||
#include <numeric>
|
||||
#include <boost/foreach.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <boost/tuple/tuple.hpp>
|
||||
#include <boost/tuple/tuple_comparison.hpp>
|
||||
#include <boost/tuple/tuple_io.hpp>
|
||||
#include <boost/array.hpp>
|
||||
#include <boost/bind.hpp>
|
||||
#include <boost/function.hpp>
|
||||
#include <boost/filesystem.hpp>
|
||||
#include <boost/filesystem/fstream.hpp>
|
||||
#include <boost/algorithm/string.hpp>
|
||||
#include <boost/interprocess/sync/interprocess_mutex.hpp>
|
||||
#include <boost/interprocess/sync/interprocess_recursive_mutex.hpp>
|
||||
#include <boost/date_time/gregorian/gregorian_types.hpp>
|
||||
#include <boost/date_time/posix_time/posix_time_types.hpp>
|
||||
|
||||
#ifdef __WXMSW__
|
||||
#include <boost/foreach.hpp>
|
||||
|
||||
#ifdef WIN32
|
||||
#include <windows.h>
|
||||
#include <winsock2.h>
|
||||
#include <mswsock.h>
|
||||
@@ -78,50 +64,31 @@
|
||||
#include <sys/time.h>
|
||||
#include <sys/resource.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/stat.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <net/if.h>
|
||||
#include <ifaddrs.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#endif
|
||||
#ifdef __BSD__
|
||||
#ifdef BSD
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
|
||||
|
||||
#pragma hdrstop
|
||||
using namespace std;
|
||||
using namespace boost;
|
||||
|
||||
#include "strlcpy.h"
|
||||
#include "serialize.h"
|
||||
#include "uint256.h"
|
||||
#include "util.h"
|
||||
#include "key.h"
|
||||
#include "bignum.h"
|
||||
#include "base58.h"
|
||||
#include "script.h"
|
||||
#include "db.h"
|
||||
#include "net.h"
|
||||
#include "irc.h"
|
||||
#include "main.h"
|
||||
#include "rpc.h"
|
||||
#if wxUSE_GUI
|
||||
#include "uibase.h"
|
||||
#ifdef QT_GUI
|
||||
#include "qtui.h"
|
||||
#else
|
||||
#include "noui.h"
|
||||
#endif
|
||||
#include "ui.h"
|
||||
#include "init.h"
|
||||
|
||||
#include "xpm/addressbook16.xpm"
|
||||
#include "xpm/addressbook20.xpm"
|
||||
#include "xpm/bitcoin16.xpm"
|
||||
#include "xpm/bitcoin20.xpm"
|
||||
#include "xpm/bitcoin32.xpm"
|
||||
#include "xpm/bitcoin48.xpm"
|
||||
#include "xpm/bitcoin80.xpm"
|
||||
#include "xpm/check.xpm"
|
||||
#include "xpm/send16.xpm"
|
||||
#include "xpm/send16noshadow.xpm"
|
||||
#include "xpm/send20.xpm"
|
||||
#include "xpm/about.xpm"
|
||||
510
src/init.cpp
Normal file
@@ -0,0 +1,510 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2011 The Bitcoin developers
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
#include "headers.h"
|
||||
#include "db.h"
|
||||
#include "bitcoinrpc.h"
|
||||
#include "net.h"
|
||||
#include "init.h"
|
||||
#include "strlcpy.h"
|
||||
#include <boost/filesystem.hpp>
|
||||
#include <boost/filesystem/fstream.hpp>
|
||||
#include <boost/interprocess/sync/file_lock.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace boost;
|
||||
|
||||
CWallet* pwalletMain;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Shutdown
|
||||
//
|
||||
|
||||
void ExitTimeout(void* parg)
|
||||
{
|
||||
#ifdef WIN32
|
||||
Sleep(5000);
|
||||
ExitProcess(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Shutdown(void* parg)
|
||||
{
|
||||
static CCriticalSection cs_Shutdown;
|
||||
static bool fTaken;
|
||||
bool fFirstThread;
|
||||
CRITICAL_BLOCK(cs_Shutdown)
|
||||
{
|
||||
fFirstThread = !fTaken;
|
||||
fTaken = true;
|
||||
}
|
||||
static bool fExit;
|
||||
if (fFirstThread)
|
||||
{
|
||||
fShutdown = true;
|
||||
nTransactionsUpdated++;
|
||||
DBFlush(false);
|
||||
StopNode();
|
||||
DBFlush(true);
|
||||
boost::filesystem::remove(GetPidFile());
|
||||
UnregisterWallet(pwalletMain);
|
||||
delete pwalletMain;
|
||||
CreateThread(ExitTimeout, NULL);
|
||||
Sleep(50);
|
||||
printf("Bitcoin exiting\n\n");
|
||||
fExit = true;
|
||||
exit(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
while (!fExit)
|
||||
Sleep(500);
|
||||
Sleep(100);
|
||||
ExitThread(0);
|
||||
}
|
||||
}
|
||||
|
||||
void HandleSIGTERM(int)
|
||||
{
|
||||
fRequestShutdown = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Start
|
||||
//
|
||||
#if !defined(QT_GUI)
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
bool fRet = false;
|
||||
fRet = AppInit(argc, argv);
|
||||
|
||||
if (fRet && fDaemon)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
bool AppInit(int argc, char* argv[])
|
||||
{
|
||||
bool fRet = false;
|
||||
try
|
||||
{
|
||||
fRet = AppInit2(argc, argv);
|
||||
}
|
||||
catch (std::exception& e) {
|
||||
PrintException(&e, "AppInit()");
|
||||
} catch (...) {
|
||||
PrintException(NULL, "AppInit()");
|
||||
}
|
||||
if (!fRet)
|
||||
Shutdown(NULL);
|
||||
return fRet;
|
||||
}
|
||||
|
||||
bool AppInit2(int argc, char* argv[])
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
// Turn off microsoft heap dump noise
|
||||
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
|
||||
_CrtSetReportFile(_CRT_WARN, CreateFileA("NUL", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0));
|
||||
#endif
|
||||
#if _MSC_VER >= 1400
|
||||
// Disable confusing "helpful" text message on abort, ctrl-c
|
||||
_set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
|
||||
#endif
|
||||
#ifndef WIN32
|
||||
umask(077);
|
||||
#endif
|
||||
#ifndef WIN32
|
||||
// Clean shutdown on SIGTERM
|
||||
struct sigaction sa;
|
||||
sa.sa_handler = HandleSIGTERM;
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sa.sa_flags = 0;
|
||||
sigaction(SIGTERM, &sa, NULL);
|
||||
sigaction(SIGINT, &sa, NULL);
|
||||
sigaction(SIGHUP, &sa, NULL);
|
||||
#endif
|
||||
|
||||
//
|
||||
// Parameters
|
||||
//
|
||||
ParseParameters(argc, argv);
|
||||
|
||||
if (mapArgs.count("-datadir"))
|
||||
{
|
||||
if (filesystem::is_directory(filesystem::system_complete(mapArgs["-datadir"])))
|
||||
{
|
||||
filesystem::path pathDataDir = filesystem::system_complete(mapArgs["-datadir"]);
|
||||
strlcpy(pszSetDataDir, pathDataDir.string().c_str(), sizeof(pszSetDataDir));
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "Error: Specified directory does not exist\n");
|
||||
Shutdown(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ReadConfigFile(mapArgs, mapMultiArgs); // Must be done after processing datadir
|
||||
|
||||
if (mapArgs.count("-?") || mapArgs.count("--help"))
|
||||
{
|
||||
string strUsage = string() +
|
||||
_("Bitcoin version") + " " + FormatFullVersion() + "\n\n" +
|
||||
_("Usage:") + "\t\t\t\t\t\t\t\t\t\t\n" +
|
||||
" bitcoin [options] \t " + "\n" +
|
||||
" bitcoin [options] <command> [params]\t " + _("Send command to -server or bitcoind\n") +
|
||||
" bitcoin [options] help \t\t " + _("List commands\n") +
|
||||
" bitcoin [options] help <command> \t\t " + _("Get help for a command\n") +
|
||||
_("Options:\n") +
|
||||
" -conf=<file> \t\t " + _("Specify configuration file (default: bitcoin.conf)\n") +
|
||||
" -pid=<file> \t\t " + _("Specify pid file (default: bitcoind.pid)\n") +
|
||||
" -gen \t\t " + _("Generate coins\n") +
|
||||
" -gen=0 \t\t " + _("Don't generate coins\n") +
|
||||
" -min \t\t " + _("Start minimized\n") +
|
||||
" -datadir=<dir> \t\t " + _("Specify data directory\n") +
|
||||
" -timeout=<n> \t " + _("Specify connection timeout (in milliseconds)\n") +
|
||||
" -proxy=<ip:port> \t " + _("Connect through socks4 proxy\n") +
|
||||
" -dns \t " + _("Allow DNS lookups for addnode and connect\n") +
|
||||
" -addnode=<ip> \t " + _("Add a node to connect to\n") +
|
||||
" -connect=<ip> \t\t " + _("Connect only to the specified node\n") +
|
||||
" -nolisten \t " + _("Don't accept connections from outside\n") +
|
||||
" -banscore=<n> \t " + _("Threshold for disconnecting misbehaving peers (default: 100)\n") +
|
||||
" -bantime=<n> \t " + _("Number of seconds to keep misbehaving peers from reconnecting (default: 86400)\n") +
|
||||
#ifdef USE_UPNP
|
||||
#if USE_UPNP
|
||||
" -noupnp \t " + _("Don't attempt to use UPnP to map the listening port\n") +
|
||||
#else
|
||||
" -upnp \t " + _("Attempt to use UPnP to map the listening port\n") +
|
||||
#endif
|
||||
#endif
|
||||
" -paytxfee=<amt> \t " + _("Fee per KB to add to transactions you send\n") +
|
||||
#ifdef GUI
|
||||
" -server \t\t " + _("Accept command line and JSON-RPC commands\n") +
|
||||
#endif
|
||||
#ifndef WIN32
|
||||
" -daemon \t\t " + _("Run in the background as a daemon and accept commands\n") +
|
||||
#endif
|
||||
" -testnet \t\t " + _("Use the test network\n") +
|
||||
" -rpcuser=<user> \t " + _("Username for JSON-RPC connections\n") +
|
||||
" -rpcpassword=<pw>\t " + _("Password for JSON-RPC connections\n") +
|
||||
" -rpcport=<port> \t\t " + _("Listen for JSON-RPC connections on <port> (default: 8332)\n") +
|
||||
" -rpcallowip=<ip> \t\t " + _("Allow JSON-RPC connections from specified IP address\n") +
|
||||
" -rpcconnect=<ip> \t " + _("Send commands to node running on <ip> (default: 127.0.0.1)\n") +
|
||||
" -keypool=<n> \t " + _("Set key pool size to <n> (default: 100)\n") +
|
||||
" -rescan \t " + _("Rescan the block chain for missing wallet transactions\n");
|
||||
|
||||
#ifdef USE_SSL
|
||||
strUsage += string() +
|
||||
_("\nSSL options: (see the Bitcoin Wiki for SSL setup instructions)\n") +
|
||||
" -rpcssl \t " + _("Use OpenSSL (https) for JSON-RPC connections\n") +
|
||||
" -rpcsslcertificatechainfile=<file.cert>\t " + _("Server certificate file (default: server.cert)\n") +
|
||||
" -rpcsslprivatekeyfile=<file.pem> \t " + _("Server private key (default: server.pem)\n") +
|
||||
" -rpcsslciphers=<ciphers> \t " + _("Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH)\n");
|
||||
#endif
|
||||
|
||||
strUsage += string() +
|
||||
" -? \t\t " + _("This help message\n");
|
||||
|
||||
// Remove tabs
|
||||
strUsage.erase(std::remove(strUsage.begin(), strUsage.end(), '\t'), strUsage.end());
|
||||
fprintf(stderr, "%s", strUsage.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
fDebug = GetBoolArg("-debug");
|
||||
fAllowDNS = GetBoolArg("-dns");
|
||||
|
||||
#ifndef WIN32
|
||||
fDaemon = GetBoolArg("-daemon");
|
||||
#else
|
||||
fDaemon = false;
|
||||
#endif
|
||||
|
||||
if (fDaemon)
|
||||
fServer = true;
|
||||
else
|
||||
fServer = GetBoolArg("-server");
|
||||
|
||||
/* force fServer when running without GUI */
|
||||
#if !defined(QT_GUI)
|
||||
fServer = true;
|
||||
#endif
|
||||
fPrintToConsole = GetBoolArg("-printtoconsole");
|
||||
fPrintToDebugger = GetBoolArg("-printtodebugger");
|
||||
|
||||
fTestNet = GetBoolArg("-testnet");
|
||||
bool fTOR = (fUseProxy && addrProxy.port == htons(9050));
|
||||
fNoListen = GetBoolArg("-nolisten") || fTOR;
|
||||
fLogTimestamps = GetBoolArg("-logtimestamps");
|
||||
|
||||
#ifndef QT_GUI
|
||||
for (int i = 1; i < argc; i++)
|
||||
if (!IsSwitchChar(argv[i][0]))
|
||||
fCommandLine = true;
|
||||
|
||||
if (fCommandLine)
|
||||
{
|
||||
int ret = CommandLineRPC(argc, argv);
|
||||
exit(ret);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef WIN32
|
||||
if (fDaemon)
|
||||
{
|
||||
// Daemonize
|
||||
pid_t pid = fork();
|
||||
if (pid < 0)
|
||||
{
|
||||
fprintf(stderr, "Error: fork() returned %d errno %d\n", pid, errno);
|
||||
return false;
|
||||
}
|
||||
if (pid > 0)
|
||||
{
|
||||
CreatePidFile(GetPidFile(), pid);
|
||||
return true;
|
||||
}
|
||||
|
||||
pid_t sid = setsid();
|
||||
if (sid < 0)
|
||||
fprintf(stderr, "Error: setsid() returned %d errno %d\n", sid, errno);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!fDebug && !pszSetDataDir[0])
|
||||
ShrinkDebugFile();
|
||||
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
|
||||
printf("Bitcoin version %s\n", FormatFullVersion().c_str());
|
||||
printf("Default data directory %s\n", GetDefaultDataDir().c_str());
|
||||
|
||||
if (GetBoolArg("-loadblockindextest"))
|
||||
{
|
||||
CTxDB txdb("r");
|
||||
txdb.LoadBlockIndex();
|
||||
PrintBlockTree();
|
||||
return false;
|
||||
}
|
||||
|
||||
// Make sure only a single bitcoin process is using the data directory.
|
||||
string strLockFile = GetDataDir() + "/.lock";
|
||||
FILE* file = fopen(strLockFile.c_str(), "a"); // empty lock file; created if it doesn't exist.
|
||||
if (file) fclose(file);
|
||||
static boost::interprocess::file_lock lock(strLockFile.c_str());
|
||||
if (!lock.try_lock())
|
||||
{
|
||||
wxMessageBox(strprintf(_("Cannot obtain a lock on data directory %s. Bitcoin is probably already running."), GetDataDir().c_str()), "Bitcoin");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Bind to the port early so we can tell if another instance is already running.
|
||||
string strErrors;
|
||||
if (!fNoListen)
|
||||
{
|
||||
if (!BindListenPort(strErrors))
|
||||
{
|
||||
wxMessageBox(strErrors, "Bitcoin");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Load data files
|
||||
//
|
||||
if (fDaemon)
|
||||
fprintf(stdout, "bitcoin server starting\n");
|
||||
strErrors = "";
|
||||
int64 nStart;
|
||||
|
||||
InitMessage(_("Loading addresses..."));
|
||||
printf("Loading addresses...\n");
|
||||
nStart = GetTimeMillis();
|
||||
if (!LoadAddresses())
|
||||
strErrors += _("Error loading addr.dat \n");
|
||||
printf(" addresses %15"PRI64d"ms\n", GetTimeMillis() - nStart);
|
||||
|
||||
InitMessage(_("Loading block index..."));
|
||||
printf("Loading block index...\n");
|
||||
nStart = GetTimeMillis();
|
||||
if (!LoadBlockIndex())
|
||||
strErrors += _("Error loading blkindex.dat \n");
|
||||
printf(" block index %15"PRI64d"ms\n", GetTimeMillis() - nStart);
|
||||
|
||||
InitMessage(_("Loading wallet..."));
|
||||
printf("Loading wallet...\n");
|
||||
nStart = GetTimeMillis();
|
||||
bool fFirstRun;
|
||||
pwalletMain = new CWallet("wallet.dat");
|
||||
int nLoadWalletRet = pwalletMain->LoadWallet(fFirstRun);
|
||||
if (nLoadWalletRet != DB_LOAD_OK)
|
||||
{
|
||||
if (nLoadWalletRet == DB_CORRUPT)
|
||||
strErrors += _("Error loading wallet.dat: Wallet corrupted \n");
|
||||
else if (nLoadWalletRet == DB_TOO_NEW)
|
||||
strErrors += _("Error loading wallet.dat: Wallet requires newer version of Bitcoin \n");
|
||||
else
|
||||
strErrors += _("Error loading wallet.dat \n");
|
||||
}
|
||||
printf(" wallet %15"PRI64d"ms\n", GetTimeMillis() - nStart);
|
||||
|
||||
RegisterWallet(pwalletMain);
|
||||
|
||||
CBlockIndex *pindexRescan = pindexBest;
|
||||
if (GetBoolArg("-rescan"))
|
||||
pindexRescan = pindexGenesisBlock;
|
||||
else
|
||||
{
|
||||
CWalletDB walletdb("wallet.dat");
|
||||
CBlockLocator locator;
|
||||
if (walletdb.ReadBestBlock(locator))
|
||||
pindexRescan = locator.GetBlockIndex();
|
||||
}
|
||||
if (pindexBest != pindexRescan)
|
||||
{
|
||||
InitMessage(_("Rescanning..."));
|
||||
printf("Rescanning last %i blocks (from block %i)...\n", pindexBest->nHeight - pindexRescan->nHeight, pindexRescan->nHeight);
|
||||
nStart = GetTimeMillis();
|
||||
pwalletMain->ScanForWalletTransactions(pindexRescan, true);
|
||||
printf(" rescan %15"PRI64d"ms\n", GetTimeMillis() - nStart);
|
||||
}
|
||||
|
||||
InitMessage(_("Done loading"));
|
||||
printf("Done loading\n");
|
||||
|
||||
//// debug print
|
||||
printf("mapBlockIndex.size() = %d\n", mapBlockIndex.size());
|
||||
printf("nBestHeight = %d\n", nBestHeight);
|
||||
printf("setKeyPool.size() = %d\n", pwalletMain->setKeyPool.size());
|
||||
printf("mapWallet.size() = %d\n", pwalletMain->mapWallet.size());
|
||||
printf("mapAddressBook.size() = %d\n", pwalletMain->mapAddressBook.size());
|
||||
|
||||
if (!strErrors.empty())
|
||||
{
|
||||
wxMessageBox(strErrors, "Bitcoin", wxOK | wxICON_ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Add wallet transactions that aren't already in a block to mapTransactions
|
||||
pwalletMain->ReacceptWalletTransactions();
|
||||
|
||||
//
|
||||
// Parameters
|
||||
//
|
||||
if (GetBoolArg("-printblockindex") || GetBoolArg("-printblocktree"))
|
||||
{
|
||||
PrintBlockTree();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mapArgs.count("-timeout"))
|
||||
{
|
||||
int nNewTimeout = GetArg("-timeout", 5000);
|
||||
if (nNewTimeout > 0 && nNewTimeout < 600000)
|
||||
nConnectTimeout = nNewTimeout;
|
||||
}
|
||||
|
||||
if (mapArgs.count("-printblock"))
|
||||
{
|
||||
string strMatch = mapArgs["-printblock"];
|
||||
int nFound = 0;
|
||||
for (map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.begin(); mi != mapBlockIndex.end(); ++mi)
|
||||
{
|
||||
uint256 hash = (*mi).first;
|
||||
if (strncmp(hash.ToString().c_str(), strMatch.c_str(), strMatch.size()) == 0)
|
||||
{
|
||||
CBlockIndex* pindex = (*mi).second;
|
||||
CBlock block;
|
||||
block.ReadFromDisk(pindex);
|
||||
block.BuildMerkleTree();
|
||||
block.print();
|
||||
printf("\n");
|
||||
nFound++;
|
||||
}
|
||||
}
|
||||
if (nFound == 0)
|
||||
printf("No blocks matching %s were found\n", strMatch.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
fGenerateBitcoins = GetBoolArg("-gen");
|
||||
|
||||
if (mapArgs.count("-proxy"))
|
||||
{
|
||||
fUseProxy = true;
|
||||
addrProxy = CAddress(mapArgs["-proxy"]);
|
||||
if (!addrProxy.IsValid())
|
||||
{
|
||||
wxMessageBox(_("Invalid -proxy address"), "Bitcoin");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (mapArgs.count("-addnode"))
|
||||
{
|
||||
BOOST_FOREACH(string strAddr, mapMultiArgs["-addnode"])
|
||||
{
|
||||
CAddress addr(strAddr, fAllowDNS);
|
||||
addr.nTime = 0; // so it won't relay unless successfully connected
|
||||
if (addr.IsValid())
|
||||
AddAddress(addr);
|
||||
}
|
||||
}
|
||||
|
||||
if (GetBoolArg("-nodnsseed"))
|
||||
printf("DNS seeding disabled\n");
|
||||
else
|
||||
DNSAddressSeed();
|
||||
|
||||
if (mapArgs.count("-paytxfee"))
|
||||
{
|
||||
if (!ParseMoney(mapArgs["-paytxfee"], nTransactionFee))
|
||||
{
|
||||
wxMessageBox(_("Invalid amount for -paytxfee=<amount>"), "Bitcoin");
|
||||
return false;
|
||||
}
|
||||
if (nTransactionFee > 0.25 * COIN)
|
||||
wxMessageBox(_("Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction."), "Bitcoin", wxOK | wxICON_EXCLAMATION);
|
||||
}
|
||||
|
||||
if (fHaveUPnP)
|
||||
{
|
||||
#if USE_UPNP
|
||||
if (GetBoolArg("-noupnp"))
|
||||
fUseUPnP = false;
|
||||
#else
|
||||
if (GetBoolArg("-upnp"))
|
||||
fUseUPnP = true;
|
||||
#endif
|
||||
}
|
||||
|
||||
//
|
||||
// Start the node
|
||||
//
|
||||
if (!CheckDiskSpace())
|
||||
return false;
|
||||
|
||||
RandAddSeedPerfmon();
|
||||
|
||||
if (!CreateThread(StartNode, NULL))
|
||||
wxMessageBox(_("Error: CreateThread(StartNode) failed"), "Bitcoin");
|
||||
|
||||
if (fServer)
|
||||
CreateThread(ThreadRPCServer, NULL);
|
||||
|
||||
#if !defined(QT_GUI)
|
||||
while (1)
|
||||
Sleep(5000);
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1,7 +1,14 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2011 The Bitcoin developers
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
#ifndef BITCOIN_INIT_H
|
||||
#define BITCOIN_INIT_H
|
||||
|
||||
extern CWallet* pwalletMain;
|
||||
|
||||
void Shutdown(void* parg);
|
||||
bool GetStartOnSystemStartup();
|
||||
void SetStartOnSystemStartup(bool fAutoStart);
|
||||
bool AppInit(int argc, char* argv[]);
|
||||
bool AppInit2(int argc, char* argv[]);
|
||||
|
||||
#endif
|
||||
@@ -1,10 +1,21 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2011 The Bitcoin developers
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include "headers.h"
|
||||
#include "irc.h"
|
||||
#include "net.h"
|
||||
#include "strlcpy.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace boost;
|
||||
|
||||
int nGotIRCAddresses = 0;
|
||||
bool fGotExternalIP = false;
|
||||
|
||||
void ThreadIRCSeed2(void* parg);
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -37,7 +48,7 @@ bool DecodeAddress(string str, CAddress& addr)
|
||||
return false;
|
||||
memcpy(&tmp, &vch[0], sizeof(tmp));
|
||||
|
||||
addr = CAddress(tmp.ip, tmp.port, NODE_NETWORK);
|
||||
addr = CAddress(tmp.ip, ntohs(tmp.port), NODE_NETWORK);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -81,18 +92,31 @@ bool RecvLine(SOCKET hSocket, string& strLine)
|
||||
}
|
||||
else if (nBytes <= 0)
|
||||
{
|
||||
if (fShutdown)
|
||||
return false;
|
||||
if (nBytes < 0)
|
||||
{
|
||||
int nErr = WSAGetLastError();
|
||||
if (nErr == WSAEMSGSIZE)
|
||||
continue;
|
||||
if (nErr == WSAEWOULDBLOCK || nErr == WSAEINTR || nErr == WSAEINPROGRESS)
|
||||
{
|
||||
Sleep(10);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (!strLine.empty())
|
||||
return true;
|
||||
// socket closed
|
||||
printf("IRC socket closed\n");
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// socket error
|
||||
int nErr = WSAGetLastError();
|
||||
if (nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS)
|
||||
if (nBytes == 0)
|
||||
{
|
||||
// socket closed
|
||||
printf("IRC socket closed\n");
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// socket error
|
||||
int nErr = WSAGetLastError();
|
||||
printf("IRC recv failed: %d\n", nErr);
|
||||
return false;
|
||||
}
|
||||
@@ -123,11 +147,12 @@ bool RecvLineIRC(SOCKET hSocket, string& strLine)
|
||||
}
|
||||
}
|
||||
|
||||
int RecvUntil(SOCKET hSocket, const char* psz1, const char* psz2=NULL, const char* psz3=NULL)
|
||||
int RecvUntil(SOCKET hSocket, const char* psz1, const char* psz2=NULL, const char* psz3=NULL, const char* psz4=NULL)
|
||||
{
|
||||
loop
|
||||
{
|
||||
string strLine;
|
||||
strLine.reserve(10000);
|
||||
if (!RecvLineIRC(hSocket, strLine))
|
||||
return 0;
|
||||
printf("IRC %s\n", strLine.c_str());
|
||||
@@ -137,6 +162,8 @@ int RecvUntil(SOCKET hSocket, const char* psz1, const char* psz2=NULL, const cha
|
||||
return 2;
|
||||
if (psz3 && strLine.find(psz3) != -1)
|
||||
return 3;
|
||||
if (psz4 && strLine.find(psz4) != -1)
|
||||
return 4;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -154,13 +181,84 @@ bool Wait(int nSeconds)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool RecvCodeLine(SOCKET hSocket, const char* psz1, string& strRet)
|
||||
{
|
||||
strRet.clear();
|
||||
loop
|
||||
{
|
||||
string strLine;
|
||||
if (!RecvLineIRC(hSocket, strLine))
|
||||
return false;
|
||||
|
||||
vector<string> vWords;
|
||||
ParseString(strLine, ' ', vWords);
|
||||
if (vWords.size() < 2)
|
||||
continue;
|
||||
|
||||
if (vWords[1] == psz1)
|
||||
{
|
||||
printf("IRC %s\n", strLine.c_str());
|
||||
strRet = strLine;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool GetIPFromIRC(SOCKET hSocket, string strMyName, unsigned int& ipRet)
|
||||
{
|
||||
Send(hSocket, strprintf("USERHOST %s\r", strMyName.c_str()).c_str());
|
||||
|
||||
string strLine;
|
||||
if (!RecvCodeLine(hSocket, "302", strLine))
|
||||
return false;
|
||||
|
||||
vector<string> vWords;
|
||||
ParseString(strLine, ' ', vWords);
|
||||
if (vWords.size() < 4)
|
||||
return false;
|
||||
|
||||
string str = vWords[3];
|
||||
if (str.rfind("@") == string::npos)
|
||||
return false;
|
||||
string strHost = str.substr(str.rfind("@")+1);
|
||||
|
||||
// Hybrid IRC used by lfnet always returns IP when you userhost yourself,
|
||||
// but in case another IRC is ever used this should work.
|
||||
printf("GetIPFromIRC() got userhost %s\n", strHost.c_str());
|
||||
if (fUseProxy)
|
||||
return false;
|
||||
CAddress addr(strHost, 0, true);
|
||||
if (!addr.IsValid())
|
||||
return false;
|
||||
ipRet = addr.ip;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void ThreadIRCSeed(void* parg)
|
||||
{
|
||||
if (mapArgs.count("-connect"))
|
||||
IMPLEMENT_RANDOMIZE_STACK(ThreadIRCSeed(parg));
|
||||
try
|
||||
{
|
||||
ThreadIRCSeed2(parg);
|
||||
}
|
||||
catch (std::exception& e) {
|
||||
PrintExceptionContinue(&e, "ThreadIRCSeed()");
|
||||
} catch (...) {
|
||||
PrintExceptionContinue(NULL, "ThreadIRCSeed()");
|
||||
}
|
||||
printf("ThreadIRCSeed exiting\n");
|
||||
}
|
||||
|
||||
void ThreadIRCSeed2(void* parg)
|
||||
{
|
||||
/* Dont advertise on IRC if we don't allow incoming connections */
|
||||
if (mapArgs.count("-connect") || fNoListen)
|
||||
return;
|
||||
if (mapArgs.count("-noirc"))
|
||||
|
||||
if (GetBoolArg("-noirc"))
|
||||
return;
|
||||
printf("ThreadIRCSeed started\n");
|
||||
int nErrorWait = 10;
|
||||
@@ -171,13 +269,13 @@ void ThreadIRCSeed(void* parg)
|
||||
while (!fShutdown)
|
||||
{
|
||||
//CAddress addrConnect("216.155.130.130:6667"); // chat.freenode.net
|
||||
CAddress addrConnect("92.243.23.21:6667"); // irc.lfnet.org
|
||||
CAddress addrConnect("92.243.23.21", 6667); // irc.lfnet.org
|
||||
if (!fTOR)
|
||||
{
|
||||
//struct hostent* phostent = gethostbyname("chat.freenode.net");
|
||||
struct hostent* phostent = gethostbyname("irc.lfnet.org");
|
||||
if (phostent && phostent->h_addr_list && phostent->h_addr_list[0])
|
||||
addrConnect = CAddress(*(u_long*)phostent->h_addr_list[0], htons(6667));
|
||||
CAddress addrIRC("irc.lfnet.org", 6667, true);
|
||||
if (addrIRC.IsValid())
|
||||
addrConnect = addrIRC;
|
||||
}
|
||||
|
||||
SOCKET hSocket;
|
||||
@@ -191,7 +289,7 @@ void ThreadIRCSeed(void* parg)
|
||||
return;
|
||||
}
|
||||
|
||||
if (!RecvUntil(hSocket, "Found your hostname", "using your IP address instead", "Couldn't look up your hostname"))
|
||||
if (!RecvUntil(hSocket, "Found your hostname", "using your IP address instead", "Couldn't look up your hostname", "ignoring hostname"))
|
||||
{
|
||||
closesocket(hSocket);
|
||||
hSocket = INVALID_SOCKET;
|
||||
@@ -231,11 +329,34 @@ void ThreadIRCSeed(void* parg)
|
||||
}
|
||||
Sleep(500);
|
||||
|
||||
Send(hSocket, "JOIN #bitcoin\r");
|
||||
Send(hSocket, "WHO #bitcoin\r");
|
||||
// Get our external IP from the IRC server and re-nick before joining the channel
|
||||
CAddress addrFromIRC;
|
||||
if (GetIPFromIRC(hSocket, strMyName, addrFromIRC.ip))
|
||||
{
|
||||
printf("GetIPFromIRC() returned %s\n", addrFromIRC.ToStringIP().c_str());
|
||||
if (!fUseProxy && addrFromIRC.IsRoutable())
|
||||
{
|
||||
// IRC lets you to re-nick
|
||||
fGotExternalIP = true;
|
||||
addrLocalHost.ip = addrFromIRC.ip;
|
||||
strMyName = EncodeAddress(addrLocalHost);
|
||||
Send(hSocket, strprintf("NICK %s\r", strMyName.c_str()).c_str());
|
||||
}
|
||||
}
|
||||
|
||||
if (fTestNet) {
|
||||
Send(hSocket, "JOIN #bitcoinTEST\r");
|
||||
Send(hSocket, "WHO #bitcoinTEST\r");
|
||||
} else {
|
||||
// randomly join #bitcoin00-#bitcoin99
|
||||
int channel_number = GetRandInt(100);
|
||||
Send(hSocket, strprintf("JOIN #bitcoin%02d\r", channel_number).c_str());
|
||||
Send(hSocket, strprintf("WHO #bitcoin%02d\r", channel_number).c_str());
|
||||
}
|
||||
|
||||
int64 nStart = GetTime();
|
||||
string strLine;
|
||||
strLine.reserve(10000);
|
||||
while (!fShutdown && RecvLineIRC(hSocket, strLine))
|
||||
{
|
||||
if (strLine.empty() || strLine.size() > 900 || strLine[0] != ':')
|
||||
@@ -271,9 +392,9 @@ void ThreadIRCSeed(void* parg)
|
||||
CAddress addr;
|
||||
if (DecodeAddress(pszName, addr))
|
||||
{
|
||||
addr.nTime = GetAdjustedTime() - 51 * 60;
|
||||
if (AddAddress(addr))
|
||||
printf("IRC got new address\n");
|
||||
addr.nTime = GetAdjustedTime();
|
||||
if (AddAddress(addr, 51 * 60))
|
||||
printf("IRC got new address: %s\n", addr.ToString().c_str());
|
||||
nGotIRCAddresses++;
|
||||
}
|
||||
else
|
||||
@@ -1,8 +1,14 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2011 The Bitcoin developers
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||
#ifndef BITCOIN_IRC_H
|
||||
#define BITCOIN_IRC_H
|
||||
|
||||
bool RecvLine(SOCKET hSocket, string& strLine);
|
||||
bool RecvLine(SOCKET hSocket, std::string& strLine);
|
||||
void ThreadIRCSeed(void* parg);
|
||||
|
||||
extern int nGotIRCAddresses;
|
||||
extern bool fGotExternalIP;
|
||||
|
||||
#endif
|
||||