Skip to content

Commit

Permalink
feat: calculate transaction size
Browse files Browse the repository at this point in the history
  • Loading branch information
classicalliu committed Oct 16, 2019
1 parent 8a9779b commit df1f304
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 0 deletions.
2 changes: 2 additions & 0 deletions lib/ckb/serializers/serializers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
require_relative "out_point_serializer"
require_relative "output_data_serializer"
require_relative "raw_transaction_serializer"
require_relative "witness_serializer"
require_relative "transaction_serializer"

module CKB
module Serializers
Expand Down
43 changes: 43 additions & 0 deletions lib/ckb/serializers/transaction_serializer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# frozen_string_literal: true

module CKB
module Serializers
class TransactionSerializer
include TableSerializer

# @param transaction [CKB::Types::Transaction]
def initialize(transaction)
@raw_serializer = RawTransactionSerializer.new(transaction)
@witnesses_serializer = DynVecSerializer.new(transaction.witnesses, WitnessSerializer)
@items_count = 2
end

private

attr_reader :raw_serializer, :witnesses_serializer, :items_count

def body
raw_layout + witnesses_layout
end

def offsets
offset0 = (items_count + 1) * UINT32_CAPACITY
offset1 = offset0 + raw_capacity

[offset0, offset1]
end

def raw_layout
raw_serializer.serialize[2..-1]
end

def raw_capacity
raw_serializer.capacity
end

def witnesses_layout
witnesses_serializer.serialize[2..-1]
end
end
end
end
25 changes: 25 additions & 0 deletions lib/ckb/serializers/witness_serializer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# frozen_string_literal: true

module CKB
module Serializers
class WitnessSerializer
include BaseSerializer

# @param witness [String]
def initialize(witness)
witness ||= ""
witness = witness.start_with?("0x") ? witness[2..-1] : witness
items = witness.scan(/../)
@bytes_serializer = FixVecSerializer.new(items, ByteSerializer)
end

private

attr_reader :bytes_serializer

def layout
bytes_serializer.serialize[2..-1]
end
end
end
end
5 changes: 5 additions & 0 deletions lib/ckb/types/transaction.rb
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,11 @@ def compute_hash
blake2b.hexdigest
end

def size
transaction_serializer = CKB::Serializers::TransactionSerializer.new(self)
Utils.hex_to_bin(transaction_serializer.serialize).bytesize + 4
end

def self.from_h(hash)
return if hash.nil?

Expand Down

0 comments on commit df1f304

Please sign in to comment.