Skip to content

Commit

Permalink
Merge pull request #162 from nervosnetwork/remove-data-from-output
Browse files Browse the repository at this point in the history
refactor: remove data from output
  • Loading branch information
classicalliu authored Sep 2, 2019
2 parents be97ecb + 6e61586 commit 89ca46d
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 26 deletions.
17 changes: 8 additions & 9 deletions lib/ckb/types/output.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,35 +3,34 @@
module CKB
module Types
class Output
attr_accessor :lock, :type, :out_point, :data
attr_accessor :lock, :type, :out_point
attr_reader :capacity

# @param capacity [String]
# @param data: [String] 0x...
# @param lock [CKB::Types::Script]
# @param type [CKB::Types::Script | nil]
# @param out_point [CKB::Types::OutPoint | nil]
def initialize(capacity:, lock:, type: nil, out_point: nil, data: "0x")
def initialize(capacity:, lock:, type: nil, out_point: nil)
@capacity = capacity.to_s
@lock = lock
@type = type
@data = data
@out_point = out_point
end

def capacity=(value)
@capacity = value.to_s
end

def calculate_bytesize
raise "Don't know data" if @data.nil?
bytesize = 8 + Utils.hex_to_bin(@data).bytesize + @lock.calculate_bytesize
# @param data [String] 0x...
def calculate_bytesize(data)
raise "Please provide a valid data" if data.nil?
bytesize = 8 + Utils.hex_to_bin(data).bytesize + @lock.calculate_bytesize
bytesize += @type.calculate_bytesize if @type
bytesize
end

def calculate_min_capacity
Utils.byte_to_shannon(calculate_bytesize)
def calculate_min_capacity(data)
Utils.byte_to_shannon(calculate_bytesize(data))
end

def to_h
Expand Down
38 changes: 26 additions & 12 deletions lib/ckb/wallet.rb
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,10 @@ def get_unspent_cells
cells = api.get_cells_by_lock_hash(lock_hash, current_from.to_s, current_to.to_s)
if skip_data_and_type
cells.each do |cell|
output = api.get_live_cell(cell.out_point).cell
results << cell if (output.data.nil? || output.data == "0x") && output.type.nil?
tx = api.get_transaction(cell.out_point.tx_hash).transaction
output = tx.outputs[cell.out_point.index.to_i]
output_data = tx.outputs_data[cell.out_point.index.to_i]
results << cell if (output_data.nil? || output_data == "0x") && output.type.nil?
end
else
results.concat(cells)
Expand All @@ -77,30 +79,35 @@ def generate_tx(target_address, capacity, data = "0x", key: nil, fee: 0)

output = Types::Output.new(
capacity: capacity,
data: data,
lock: Types::Script.generate_lock(
addr.parse(target_address),
api.secp_cell_type_hash,
"type"
)
)
output_data = data

change_output = Types::Output.new(
capacity: 0,
lock: lock
)
change_output_data = "0x"

i = gather_inputs(
capacity,
output.calculate_min_capacity,
change_output.calculate_min_capacity,
output.calculate_min_capacity(output_data),
change_output.calculate_min_capacity(change_output_data),
fee
)
input_capacities = i.capacities

outputs = [output]
outputs_data = [output_data]
change_output.capacity = input_capacities - (capacity + fee)
outputs << change_output if change_output.capacity.to_i > 0
if change_output.capacity.to_i > 0
outputs << change_output
outputs_data << change_output_data
end

tx = Types::Transaction.new(
version: 0,
Expand All @@ -109,7 +116,7 @@ def generate_tx(target_address, capacity, data = "0x", key: nil, fee: 0)
],
inputs: i.inputs,
outputs: outputs,
outputs_data: outputs.map(&:data),
outputs_data: outputs_data,
witnesses: i.witnesses
)

Expand Down Expand Up @@ -143,23 +150,29 @@ def deposit_to_dao(capacity, key: nil)
args: []
)
)
output_data = "0x"

change_output = Types::Output.new(
capacity: 0,
lock: lock
)
change_output_data = "0x"

i = gather_inputs(
capacity,
output.calculate_min_capacity,
change_output.calculate_min_capacity,
output.calculate_min_capacity(output_data),
change_output.calculate_min_capacity(change_output_data),
0
)
input_capacities = i.capacities

outputs = [output]
outputs_data = [output_data]
change_output.capacity = input_capacities - capacity
outputs << change_output if change_output.capacity.to_i > 0
if change_output.capacity.to_i > 0
outputs << change_output
outputs_data << change_output_data
end

tx = Types::Transaction.new(
version: 0,
Expand All @@ -169,7 +182,7 @@ def deposit_to_dao(capacity, key: nil)
],
inputs: i.inputs,
outputs: outputs,
outputs_data: outputs.map(&:data),
outputs_data: outputs_data,
witnesses: i.witnesses
)

Expand Down Expand Up @@ -218,6 +231,7 @@ def generate_withdraw_from_dao_transaction(out_point, key: nil)
outputs = [
Types::Output.new(capacity: output_capacity, lock: lock)
]
outputs_data = ["0x"]
tx = Types::Transaction.new(
version: 0,
cell_deps: [
Expand All @@ -232,7 +246,7 @@ def generate_withdraw_from_dao_transaction(out_point, key: nil)
Types::Input.new(previous_output: new_out_point, since: since)
],
outputs: outputs,
outputs_data: outputs.map(&:data),
outputs_data: outputs_data,
witnesses: [
Types::Witness.new(data: ["0x0000000000000000"])
]
Expand Down
9 changes: 4 additions & 5 deletions spec/ckb/types/output_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,13 @@
context "calculate bytesize" do
it "default" do
expect(
output.calculate_bytesize
output.calculate_bytesize("0x")
).to eq 61
end

it "with data" do
output.instance_variable_set(:@data, "0x1234")
expect(
output.calculate_bytesize
output.calculate_bytesize("0x1234")
).to eq 63
end

Expand All @@ -31,14 +30,14 @@
output.instance_variable_set(:@type, type_script)

expect(
output.calculate_bytesize
output.calculate_bytesize("0x")
).to eq (61 + 33)
end
end

it "calculate min capacity" do
expect(
output.calculate_min_capacity
output.calculate_min_capacity("0x")
).to eq CKB::Utils.byte_to_shannon(61)
end
end

0 comments on commit 89ca46d

Please sign in to comment.