From 460caab39483a823ae52ca86f9ba2e2dd5df747c Mon Sep 17 00:00:00 2001 From: classicalliu Date: Mon, 8 Apr 2019 20:17:41 +0800 Subject: [PATCH] fix: fix segwit logic --- lib/ckb/utils.rb | 10 +++++++--- lib/ckb/wallet.rb | 13 +++++++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/lib/ckb/utils.rb b/lib/ckb/utils.rb index 3814c8e6..5fdbbc88 100644 --- a/lib/ckb/utils.rb +++ b/lib/ckb/utils.rb @@ -31,10 +31,11 @@ def self.json_script_to_type_hash(script) bin_to_prefix_hex(blake2b.digest) end - def self.sign_sighash_all_inputs(inputs, outputs, privkey) + def self.sign_sighash_all_inputs(inputs, outputs, privkey, pubkeys) blake2b = CKB::Blake2b.new sighash_type = 0x1.to_s blake2b.update(sighash_type) + witnesses = [] inputs.each do |input| previous_output = input[:previous_output] blake2b.update(hex_to_bin(previous_output[:hash])) @@ -57,10 +58,13 @@ def self.sign_sighash_all_inputs(inputs, outputs, privkey) ) signature_hex = bin_to_hex(signature_bin) - inputs.map do |input| - args = input[:args] + [signature_hex, sighash_type] + inputs = inputs.zip(pubkeys).map do |input, pubkey| + witnesses << [pubkey, signature_hex] + args = input[:args] + [sighash_type] input.merge(args: args) end + + [inputs, witnesses] end # In Ruby, bytes are represented using String, diff --git a/lib/ckb/wallet.rb b/lib/ckb/wallet.rb index 26e789e0..8a7508ef 100644 --- a/lib/ckb/wallet.rb +++ b/lib/ckb/wallet.rb @@ -64,12 +64,15 @@ def generate_tx(target_lock, capacity) lock: lock } end + + inputs, witnesses = CKB::Utils.sign_sighash_all_inputs(i.inputs, outputs, privkey, i.pubkeys) + { version: 0, deps: [api.system_script_out_point], - inputs: CKB::Utils.sign_sighash_all_inputs(i.inputs, outputs, privkey), + inputs: inputs, outputs: outputs, - witnesses: [] + witnesses: witnesses } end @@ -118,11 +121,13 @@ def gather_inputs(capacity, min_capacity) input_capacities = 0 inputs = [] + pubkeys = [] get_unspent_cells.each do |cell| input = { previous_output: cell[:out_point], - args: [pubkey] + args: [] } + pubkeys << pubkey inputs << input input_capacities += cell[:capacity] @@ -131,7 +136,7 @@ def gather_inputs(capacity, min_capacity) raise "Not enough capacity!" if input_capacities < capacity - OpenStruct.new(inputs: inputs, capacities: input_capacities) + OpenStruct.new(inputs: inputs, capacities: input_capacities, pubkeys: pubkeys) end def pubkey