RecordsKeeperRubyLib 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,182 @@
1
+ # Library to work with RecordsKeeper transactions.
2
+
3
+ # You can send transaction, create raw transaction, sign raw transaction, send raw transaction, send signed transaction,
4
+ # retrieve transaction information and calculate transaction's fees by using transaction class. You just have to pass
5
+ # parameters to invoke the pre-defined functions.
6
+
7
+ require 'rubygems'
8
+ require 'httparty'
9
+ require 'json'
10
+ require 'binary_parser'
11
+ require 'yaml'
12
+ require 'hex_string'
13
+
14
+ module RecordsKeeperRuby
15
+
16
+ class Transaction
17
+
18
+ # Entry point for accessing Block class resources.
19
+ # Import values from config file.
20
+ cfg = YAML::load(File.open('config.yaml','r'))
21
+ @network = cfg['testnet'] # Network variable to store the networrk that you want to access
22
+ if @network==cfg['testnet']
23
+ @url = cfg['testnet']['url']
24
+ @user = cfg['testnet']['rkuser']
25
+ @password = cfg['testnet']['passwd']
26
+ @chain = cfg['testnet']['chain']
27
+ else
28
+ @url = cfg['mainnet']['url']
29
+ @user = cfg['mainnet']['rkuser']
30
+ @password = cfg['mainnet']['passwd']
31
+ @chain = cfg['mainnet']['chain']
32
+ end
33
+
34
+ def self.variable
35
+ net = @network
36
+ return net
37
+ end
38
+
39
+ # Function to send transaction on RecordsKeeper Blockchain
40
+ def self.sendTransaction sender_address, receiveraddress, data, amount
41
+ data_hex = data.to_hex_string
42
+ datahex = data_hex.delete(' ')
43
+ auth = {:username => @user, :password => @password}
44
+ options = {
45
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
46
+ :basic_auth => auth,
47
+ :body => [ {"method":"createrawsendfrom","params":[sender_address, { receiveraddress => amount }, [datahex], "send"],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
48
+ }
49
+ response = HTTParty.get(@url, options)
50
+ out = response.parsed_response
51
+ txid = out[0]['result']
52
+ return txid;
53
+ end
54
+
55
+ # Function to create transaction hex on RecordsKeeper Blockchain
56
+ def self.createRawTransaction sender_address, receiveraddress, amount, data
57
+ data_hex = data.to_hex_string
58
+ datahex = data_hex.delete(' ')
59
+ auth = {:username => @user, :password => @password}
60
+ options = {
61
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
62
+ :basic_auth => auth,
63
+ :body => [ {"method":"createrawsendfrom","params":[sender_address, {receiveraddress => amount}, [datahex], ''],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
64
+ }
65
+ response = HTTParty.get(@url, options)
66
+ out = response.parsed_response
67
+ txhex = out[0]['result']
68
+ return txhex;
69
+ end
70
+
71
+ # Function to sign transaction on RecordsKeeper Blockchain
72
+ def self.signRawTransaction txHex, private_key
73
+ priv_key = []
74
+ priv_key.push(private_key)
75
+ auth = {:username => @user, :password => @password}
76
+ options = {
77
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
78
+ :basic_auth => auth,
79
+ :body => [ {"method":"signrawtransaction","params":[txHex, [], priv_key],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
80
+ }
81
+ response = HTTParty.get(@url, options)
82
+ out = response.parsed_response
83
+ signedHex = out[0]['result']['hex']
84
+ return signedHex;
85
+ end
86
+
87
+ # Function to send raw transaction on RecordsKeeper Blockchain
88
+ def self.sendRawTransaction signed_txHex
89
+ auth = {:username => @user, :password => @password}
90
+ options = {
91
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
92
+ :basic_auth => auth,
93
+ :body => [ {"method":"sendrawtransaction","params":[signed_txHex],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
94
+ }
95
+ response = HTTParty.get(@url, options)
96
+ out = response.parsed_response
97
+ txn = out[0]['result']
98
+ if txn.nil?
99
+ txid = out[0]['error']['message']
100
+ else
101
+ txid = txn
102
+ end
103
+ return txid;
104
+ end
105
+
106
+ # Function to send signed transaction on RecordsKeeper Blockchain
107
+ def self.sendSignedTransaction sender_address, receiveraddress, amount, private_key, data
108
+ data_hex = data.to_hex_string
109
+ datahex = data_hex.delete(' ')
110
+ def self.createRawTransaction sender_address, receiveraddress, amount, datahex
111
+ auth = {:username => @user, :password => @password}
112
+ options = {
113
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
114
+ :basic_auth => auth,
115
+ :body => [ {"method":"createrawsendfrom","params":[sender_address, {receiveraddress => amount}, [datahex], ""],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
116
+ }
117
+ response = HTTParty.get(@url, options)
118
+ out = response.parsed_response
119
+ return out[0]['result']
120
+ end
121
+ txHex = createRawTransaction sender_address, receiveraddress, Float(amount), datahex
122
+ def self.signRawTransaction txHex, private_key
123
+ auth = {:username => @user, :password => @password}
124
+ options = {
125
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
126
+ :basic_auth => auth,
127
+ :body => [ {"method":"signrawtransaction","params":[txHex, [], [private_key]],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
128
+ }
129
+ response = HTTParty.get(@url, options)
130
+ out = response.parsed_response
131
+ return out[0]['result']['hex']
132
+ end
133
+ signed_tx_hex = signRawTransaction txHex, private_key
134
+ def self.sendRawTransaction signed_tx_hex
135
+ auth = {:username => @user, :password => @password}
136
+ options = {
137
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
138
+ :basic_auth => auth,
139
+ :body => [ {"method":"sendrawtransaction","params":[signed_tx_hex],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
140
+ }
141
+ response = HTTParty.get(@url, options)
142
+ out = response.parsed_response
143
+ return out[0]['result']
144
+ end
145
+ tx_id = sendRawTransaction signed_tx_hex
146
+ return tx_id;
147
+ end
148
+
149
+ # Function to retrieve transaction on RecordsKeeper Blockchain
150
+ def self.retrieveTransaction tx_id
151
+ auth = {:username => @user, :password => @password}
152
+ options = {
153
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
154
+ :basic_auth => auth,
155
+ :body => [ {"method":"getrawtransaction","params":[tx_id, 1],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
156
+ }
157
+ response = HTTParty.get(@url, options)
158
+ out = response.parsed_response
159
+ sent_hex_data = out[0]['result']['data'][0]
160
+ sent_data = sent_hex_data.to_byte_string
161
+ sent_amount = out[0]['result']['vout'][0]['value']
162
+ return sent_data, sent_amount; #returns data from retrieved transaction
163
+ end
164
+
165
+ # Function to calculate transaction's fee on RecordsKeeper Blockchain
166
+ def self.getFee address, tx_id
167
+ auth = {:username => @user, :password => @password}
168
+ options = {
169
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
170
+ :basic_auth => auth,
171
+ :body => [ {"method":"getaddresstransaction","params":[address, tx_id, true],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
172
+ }
173
+ response = HTTParty.get(@url, options)
174
+ out = response.parsed_response
175
+ sent_amount = out[0]['result']['vout'][0]['amount']
176
+ balance_amount = out[0]['result']['balance']['amount']
177
+ fees = balance_amount.abs - sent_amount
178
+ return fees; #returns fees
179
+ end
180
+ end
181
+
182
+ end
@@ -0,0 +1,3 @@
1
+ module RecordsKeeperRuby
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,252 @@
1
+ # Library to work with RecordsKeeper wallet.
2
+
3
+ # You can create wallet, create multisignature wallet, retrieve wallet's information, retrieve private key of a particular
4
+ # wallet address, sign message verify message, dump wallet file, backup wallet file, import wallet file, encrypt wallet by
5
+ # using wallet class. You just have to pass parameters to invoke the pre-defined functions.
6
+
7
+ require 'rubygems'
8
+ require 'httparty'
9
+ require 'json'
10
+ require 'binary_parser'
11
+ require 'yaml'
12
+ require 'hex_string'
13
+
14
+ module RecordsKeeperRuby
15
+ class Wallet
16
+
17
+ # Entry point for accessing Block class resources.
18
+ # Import values from config file.
19
+ cfg = YAML::load(File.open('config.yaml','r'))
20
+ @network = cfg['testnet'] # Network variable to store the networrk that you want to access
21
+ if @network==cfg['testnet']
22
+ @url = cfg['testnet']['url']
23
+ @user = cfg['testnet']['rkuser']
24
+ @password = cfg['testnet']['passwd']
25
+ @chain = cfg['testnet']['chain']
26
+ else
27
+ @url = cfg['mainnet']['url']
28
+ @user = cfg['mainnet']['rkuser']
29
+ @password = cfg['mainnet']['passwd']
30
+ @chain = cfg['mainnet']['chain']
31
+ end
32
+
33
+ def self.variable
34
+ net = @network
35
+ return net
36
+ end
37
+
38
+ # Function to create wallet on RecordsKeeper Blockchain
39
+ def self.createWallet
40
+ auth = {:username => @user, :password => @password}
41
+ options = {
42
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
43
+ :basic_auth => auth,
44
+ :body => [ {"method":"createkeypairs","params":[],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
45
+ }
46
+ response = HTTParty.get(@url, options)
47
+ out = response.parsed_response
48
+ public_address = out[0]['result'][0]['address'] # returns public address of the wallet
49
+ private_key = out[0]['result'][0]['privkey'] # returns private key of the wallet
50
+ public_key = out[0]['result'][0]['pubkey'] # returns public key of the wallet
51
+
52
+ def self.importAddress public_address
53
+ auth = {:username => @user, :password => @password}
54
+ options = {
55
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
56
+ :basic_auth => auth,
57
+ :body => [ {"method":"importaddress","params":[public_address, " ", false],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
58
+ }
59
+ response = HTTParty.get(@url, options)
60
+ out = response.parsed_response
61
+ result = out[0]['result']
62
+ return result;
63
+ end
64
+ import_address = importAddress public_address
65
+
66
+ return public_address, private_key, public_key; #returns public and private key
67
+ end
68
+
69
+ # Function to retrieve private key of a wallet on RecordsKeeper Blockchain
70
+ def self.getPrivateKey public_address
71
+ auth = {:username => @user, :password => @password}
72
+ options = {
73
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
74
+ :basic_auth => auth,
75
+ :body => [ {"method":"dumpprivkey","params":[public_address],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
76
+ }
77
+ response = HTTParty.get(@url, options)
78
+ out = response.parsed_response
79
+ result = out[0]['result']
80
+ if result.nil?
81
+ private_key = out[0]['error']['message']
82
+ else
83
+ private_key = out[0]['result']
84
+ end
85
+ return private_key; #returns private key
86
+ end
87
+
88
+ # Function to retrieve wallet's information on RecordsKeeper Blockchain
89
+ def self.retrieveWalletinfo
90
+ auth = {:username => @user, :password => @password}
91
+ options = {
92
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
93
+ :basic_auth => auth,
94
+ :body => [ {"method":"getwalletinfo","params":[],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
95
+ }
96
+ response = HTTParty.get(@url, options)
97
+ out = response.parsed_response
98
+ balance = out[0]['result']['balance']
99
+ tx_count = out[0]['result']['txcount']
100
+ unspent_tx = out[0]['result']['utxocount']
101
+ return balance, tx_count, unspent_tx; #returns balance, tx count, unspent tx
102
+ end
103
+
104
+ # Function to create wallet's backup on RecordsKeeper Blockchain
105
+ def self.backupWallet filename
106
+ auth = {:username => @user, :password => @password}
107
+ options = {
108
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
109
+ :basic_auth => auth,
110
+ :body => [ {"method":"backupwallet","params":[filename],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
111
+ }
112
+ response = HTTParty.get(@url, options)
113
+ out = response.parsed_response
114
+ result = out[0]['result']
115
+ if result.nil?
116
+ res = "Backup successful!"
117
+ else
118
+ res = out[0]['error']['message']
119
+ end
120
+ return res; #returns result
121
+ end
122
+
123
+ # Function to import wallet's backup on RecordsKeeper Blockchain
124
+ def self.importWallet filename
125
+ auth = {:username => @user, :password => @password}
126
+ options = {
127
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
128
+ :basic_auth => auth,
129
+ :body => [ {"method":"importwallet","params":[filename],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
130
+ }
131
+ response = HTTParty.get(@url, options)
132
+ out = response.parsed_response
133
+ result = out[0]['result']
134
+ if result.nil?
135
+ res = "Wallet is successfully imported"
136
+ else
137
+ res = out[0]['error']['message']
138
+ end
139
+ return res; #returns result
140
+ end
141
+
142
+ # Function to dump wallet on RecordsKeeper Blockchain
143
+ def self.dumpWallet filename
144
+ auth = {:username => @user, :password => @password}
145
+ options = {
146
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
147
+ :basic_auth => auth,
148
+ :body => [ {"method":"dumpwallet","params":[filename],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
149
+ }
150
+ response = HTTParty.get(@url, options)
151
+ out = response.parsed_response
152
+ result = out[0]['result']
153
+ if result.nil?
154
+ res = "Wallet is successfully dumped"
155
+ else
156
+ res = out[0]['error']['message']
157
+ end
158
+ return res; #returns result
159
+ end
160
+
161
+ # Function to lock wallet on RecordsKeeper Blockchain
162
+ def self.lockWallet password
163
+ auth = {:username => @user, :password => @password}
164
+ options = {
165
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
166
+ :basic_auth => auth,
167
+ :body => [ {"method":"encryptwallet","params":[password],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
168
+ }
169
+ response = HTTParty.get(@url, options)
170
+ out = response.parsed_response
171
+ result = out[0]['result']
172
+ if result.nil?
173
+ res = "Wallet is successfully encrypted."
174
+ else
175
+ res = out[0]['error']['message']
176
+ end
177
+ return res; #returns result
178
+ end
179
+
180
+ # Function to unlock wallet on RecordsKeeper Blockchain
181
+ def self.unlockWallet password, unlocktime
182
+ auth = {:username => @user, :password => @password}
183
+ options = {
184
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
185
+ :basic_auth => auth,
186
+ :body => [ {"method":"walletpassphrase","params":[password, unlocktime],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
187
+ }
188
+ response = HTTParty.get(@url, options)
189
+ out = response.parsed_response
190
+ result = out[0]['result']
191
+ if result.nil?
192
+ res = "Wallet is successfully unlocked."
193
+ else
194
+ res = out[0]['error']['message']
195
+ end
196
+ return res; #returns result
197
+ end
198
+
199
+ # Function to change password for wallet on RecordsKeeper Blockchain
200
+ def self.changeWalletPassword old_password, new_password
201
+ auth = {:username => @user, :password => @password}
202
+ options = {
203
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
204
+ :basic_auth => auth,
205
+ :body => [ {"method":"walletpassphrasechange","params":[old_password, new_password],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
206
+ }
207
+ response = HTTParty.get(@url, options)
208
+ out = response.parsed_response
209
+ result = out[0]['result']
210
+ if result.nil?
211
+ res = "Password successfully changed!"
212
+ else
213
+ res = out[0]['error']['message']
214
+ end
215
+ return res; #returns result
216
+ end
217
+
218
+ # Function to sign message on RecordsKeeper Blockchain
219
+ def self.signMessage private_key, message
220
+ auth = {:username => @user, :password => @password}
221
+ options = {
222
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
223
+ :basic_auth => auth,
224
+ :body => [ {"method":"signmessage","params":[private_key, message],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
225
+ }
226
+ response = HTTParty.get(@url, options)
227
+ out = response.parsed_response
228
+ signedMessage = out[0]['result']
229
+ return signedMessage; #returns private key
230
+ end
231
+
232
+ # Function to verify message on RecordsKeeper Blockchain
233
+ def self.verifyMessage address, signedMessage, message
234
+ auth = {:username => @user, :password => @password}
235
+ options = {
236
+ :headers => headers= {"Content-Type"=> "application/json","Cache-Control" => "no-cache"},
237
+ :basic_auth => auth,
238
+ :body => [ {"method":"verifymessage","params":[address, signedMessage, message],"jsonrpc":2.0,"id":"curltext","chain_name":@chain}].to_json
239
+ }
240
+ response = HTTParty.get(@url, options)
241
+ out = response.parsed_response
242
+ verifiedMessage = out[0]['result']
243
+ if verifiedMessage
244
+ validity = "Yes, message is verified"
245
+ else
246
+ validity = "No, signedMessage is not correct"
247
+ end
248
+ return validity; #returns validity
249
+ end
250
+ end
251
+
252
+ end
@@ -0,0 +1,9 @@
1
+ require "RecordsKeeperRuby/version"
2
+ require_relative ('RecordsKeeperRuby/address')
3
+ require_relative ('RecordsKeeperRuby/assets')
4
+ require_relative ('RecordsKeeperRuby/block')
5
+ require_relative ('RecordsKeeperRuby/blockchain')
6
+ require_relative ('RecordsKeeperRuby/permissions')
7
+ require_relative ('RecordsKeeperRuby/stream')
8
+ require_relative ('RecordsKeeperRuby/transaction')
9
+ require_relative ('RecordsKeeperRuby/wallet')
@@ -0,0 +1,60 @@
1
+ # config.yaml
2
+ testnet:
3
+ url: testurl
4
+ rkuser: rkuser
5
+ passwd: rkpwd
6
+ chain: test-chain
7
+ port: testport
8
+ stream: streamname
9
+ testdata: test_data
10
+ amount: test_amount
11
+ dumptxid: test_txid
12
+ privatekey: test_privkey
13
+ validaddress: valid_address
14
+ invalidaddress: invalid_address
15
+ miningaddress: mining_address
16
+ nonminingaddress: nonmining_address
17
+ multisigaddress: multisig_address
18
+ wrongimportaddress: wrongimport_address
19
+ mainaddress: main_address
20
+ permissionaddress: permission_address
21
+ dumptxhex: dump_txhex
22
+ dumpsignedtxhex: dump_signedtxhex
23
+ samplegetmultisigaddress: sample_multisigaddress
24
+ samplemerkleroot: sample_merkleroot
25
+ sampleblockhash: sample_blockhash
26
+ sampledata: sample_data
27
+ sampletransac: sample_transaction_id
28
+ transactionid: transaction_id
29
+ sampletxid: sample_txid
30
+
31
+
32
+
33
+ mainnet:
34
+ url: mainurl
35
+ rkuser: rkuser
36
+ passwd: rkpwd
37
+ chain: main-chain
38
+ port: mainport
39
+ stream: streamname
40
+ testdata: main_data
41
+ amount: main_amount
42
+ dumptxid: main_txid
43
+ privatekey: main_privkey
44
+ validaddress: valid_address
45
+ invalidaddress: invalid_address
46
+ miningaddress: mining_address
47
+ nonminingaddress: nonmining_address
48
+ multisigaddress: multisig_address
49
+ wrongimportaddress: wrongimport_address
50
+ mainaddress: main_address
51
+ permissionaddress: permission_address
52
+ dumptxhex: dump_txhex
53
+ dumpsignedtxhex: dump_signedtxhex
54
+ samplegetmultisigaddress: sample_multisigaddress
55
+ samplemerkleroot: sample_merkleroot
56
+ sampleblockhash: sample_blockhash
57
+ sampledata: sample_data
58
+ sampletransac: sample_transaction_id
59
+ transactionid: transaction_id
60
+ sampletxid: sample_txid
@@ -0,0 +1,60 @@
1
+ # config.yaml
2
+ testnet:
3
+ url: testurl
4
+ rkuser: rkuser
5
+ passwd: rkpwd
6
+ chain: test-chain
7
+ port: testport
8
+ stream: streamname
9
+ testdata: test_data
10
+ amount: test_amount
11
+ dumptxid: test_txid
12
+ privatekey: test_privkey
13
+ validaddress: valid_address
14
+ invalidaddress: invalid_address
15
+ miningaddress: mining_address
16
+ nonminingaddress: nonmining_address
17
+ multisigaddress: multisig_address
18
+ wrongimportaddress: wrongimport_address
19
+ mainaddress: main_address
20
+ permissionaddress: permission_address
21
+ dumptxhex: dump_txhex
22
+ dumpsignedtxhex: dump_signedtxhex
23
+ samplegetmultisigaddress: sample_multisigaddress
24
+ samplemerkleroot: sample_merkleroot
25
+ sampleblockhash: sample_blockhash
26
+ sampledata: sample_data
27
+ sampletransac: sample_transaction_id
28
+ transactionid: transaction_id
29
+ sampletxid: sample_txid
30
+
31
+
32
+
33
+ mainnet:
34
+ url: mainurl
35
+ rkuser: rkuser
36
+ passwd: rkpwd
37
+ chain: main-chain
38
+ port: mainport
39
+ stream: streamname
40
+ testdata: main_data
41
+ amount: main_amount
42
+ dumptxid: main_txid
43
+ privatekey: main_privkey
44
+ validaddress: valid_address
45
+ invalidaddress: invalid_address
46
+ miningaddress: mining_address
47
+ nonminingaddress: nonmining_address
48
+ multisigaddress: multisig_address
49
+ wrongimportaddress: wrongimport_address
50
+ mainaddress: main_address
51
+ permissionaddress: permission_address
52
+ dumptxhex: dump_txhex
53
+ dumpsignedtxhex: dump_signedtxhex
54
+ samplegetmultisigaddress: sample_multisigaddress
55
+ samplemerkleroot: sample_merkleroot
56
+ sampleblockhash: sample_blockhash
57
+ sampledata: sample_data
58
+ sampletransac: sample_transaction_id
59
+ transactionid: transaction_id
60
+ sampletxid: sample_txid