Skip to content

Commit

Permalink
feat: add composite data serializers
Browse files Browse the repository at this point in the history
  • Loading branch information
shaojunda committed Sep 2, 2019
1 parent bee2c81 commit 7783444
Show file tree
Hide file tree
Showing 32 changed files with 234 additions and 610 deletions.
12 changes: 3 additions & 9 deletions lib/ckb/serializers/arg_serializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,13 @@
module CKB
module Serializers
class ArgSerializer
include BaseSerializer

# @param arg [String]
def initialize(arg)
@bytes_serializer = BytesSerializer.new(arg)
end

def serialize
layout
end

def capacity
[layout].pack("H*").bytesize
end

private

attr_reader :bytes_serializer
Expand All @@ -25,4 +19,4 @@ def layout
end
end
end
end
end
46 changes: 5 additions & 41 deletions lib/ckb/serializers/args_serializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,43 +3,20 @@
module CKB
module Serializers
class ArgsSerializer
include DynVecSerializer

# @param args [String[]]
def initialize(args)
@args = args
@items_count = args.count
end

def serialize
layout
end

def capacity
[layout].pack("H*").bytesize
end

private

attr_reader :args, :items_count

def layout
if items_count == 0
[uint32_capacity].pack("V").unpack1("H*")
else
header + body
end
end

def header
offsets_hex = offsets.map {|offset| [offset].pack("V").unpack1("H*")}.join("")
full_length_hex + offsets_hex
end

def body
arg_layouts
end

def offsets
offset0 = (items_count + 1) * uint32_capacity
offset0 = (items_count + 1) * UINT32_CAPACITY
offsets = [offset0]
args.each.with_index(1) do |_arg, index|
break if args[index].nil?
Expand All @@ -50,24 +27,11 @@ def offsets
offsets
end

def full_length_hex
full_length = (items_count + 1) * uint32_capacity + body_capacity
[full_length].pack("V").unpack1("H*")
end

def body_capacity
[arg_layouts].pack("H*").bytesize
end

def arg_layouts
def item_layouts
return "" if items_count == 0

args.map { |arg| ArgSerializer.new(arg).serialize }.join("")
end

def uint32_capacity
4
end
end
end
end
end
13 changes: 13 additions & 0 deletions lib/ckb/serializers/base_serializer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module CKB
module Serializers
module BaseSerializer
def serialize
layout
end

def capacity
[layout].pack("H*").bytesize
end
end
end
end
12 changes: 3 additions & 9 deletions lib/ckb/serializers/byte32_serializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,13 @@
module CKB
module Serializers
class Byte32Serializer
include BaseSerializer

# @param value [String]
def initialize(value)
@value = value.delete_prefix("0x")
end

def serialize
layout
end

def capacity
[layout].pack("H*").bytesize
end

private

attr_reader :value
Expand All @@ -29,4 +23,4 @@ def body
end
end
end
end
end
26 changes: 6 additions & 20 deletions lib/ckb/serializers/bytes_serializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,37 +3,23 @@
module CKB
module Serializers
class BytesSerializer
include FixVecSerializer

# @param value [String]
def initialize(value)
@value = value.delete_prefix("0x")
end

def serialize
layout
end

def capacity
[layout].pack("H*").bytesize
@items_count = [body].pack("H*").bytesize
end

private

attr_reader :value
attr_reader :value, :items_count

def layout
def item_layouts
return "" if value.nil?

header + body
end

def header
items_count = [body].pack("H*").bytesize
[items_count].pack("V").unpack1("H*")
end

def body
value
end
end
end
end
end
12 changes: 3 additions & 9 deletions lib/ckb/serializers/capacity_serializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,13 @@
module CKB
module Serializers
class CapacitySerializer
include BaseSerializer

# @param capacity [String]
def initialize(capacity)
@uint64_serializer = Uint64Serializer.new(capacity)
end

def serialize
layout
end

def capacity
[layout].pack("H*").bytesize
end

private

attr_reader :uint64_serializer
Expand All @@ -29,4 +23,4 @@ def body
end
end
end
end
end
40 changes: 6 additions & 34 deletions lib/ckb/serializers/cell_dep_serializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,65 +3,37 @@
module CKB
module Serializers
class CellDepSerializer
include TableSerializer

# @param cell_dep [CKB::Types::CellDep]
def initialize(cell_dep)
@out_point_serializer = OutPointSerializer.new(cell_dep.out_point)
@dep_type_serializer = DepTypeSerializer.new(cell_dep.dep_type)
@items_count = 2
end

def serialize
layout
end

def capacity
[layout].pack("H*").bytesize
end

private

attr_reader :out_point_serializer, :dep_type_serializer, :items_count

def layout
header + body
end

def header
offsets_hex = offsets.map {|offset| [offset].pack("V").unpack1("H*")}.join("")
full_length_hex + offsets_hex
end

def body
out_point_layout + dep_type_layout
end

def out_point_layout
out_point_serializer.serialize
end

def offsets
offset0 = (items_count + 1) * uint32_capacity
offset0 = (items_count + 1) * UINT32_CAPACITY
offset1 = offset0 + out_point_serializer.capacity

[offset0, offset1]
end

def full_length_hex
full_length = (items_count + 1) * uint32_capacity + body_capacity
[full_length].pack("V").unpack1("H*")
end

def body_capacity
[body].pack("H*").bytesize
def out_point_layout
out_point_serializer.serialize
end

def dep_type_layout
dep_type_serializer.serialize
end

def uint32_capacity
4
end
end
end
end
end
49 changes: 5 additions & 44 deletions lib/ckb/serializers/cell_deps_serializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,42 +3,20 @@
module CKB
module Serializers
class CellDepsSerializer
include DynVecSerializer

# @param cell_deps [CKB::Types::CellDep[]]
def initialize(cell_deps)
@cell_deps = cell_deps
@items_count = cell_deps.count
end

def serialize
layout
end

def capacity
[layout].pack("H*").bytesize
end

private

attr_reader :cell_deps, :items_count

def layout
if items_count == 0
[uint32_capacity].pack("V").unpack1("H*")
else
header + body
end
end

def header
full_length_hex + offsets_hex
end

def body
cell_dep_layouts
end

def offsets
offset0 = (items_count + 1) * uint32_capacity
offset0 = (items_count + 1) * UINT32_CAPACITY
offsets = [offset0]
cell_deps.each.with_index(1) do |_cell_dep, index|
break if cell_deps[index].nil?
Expand All @@ -50,28 +28,11 @@ def offsets
offsets
end

def full_length_hex
full_length = (items_count + 1) * uint32_capacity + body_capacity
[full_length].pack("V").unpack1("H*")
end

def offsets_hex
offsets.map {|offset| [offset].pack("V").unpack1("H*")}.join("")
end

def body_capacity
[cell_dep_layouts].pack("H*").bytesize
end

def cell_dep_layouts
def item_layouts
return "" if items_count == 0

cell_deps.map { |cell_dep| CellDepSerializer.new(cell_dep).serialize }.join("")
end

def uint32_capacity
4
end
end
end
end
end
Loading

0 comments on commit 7783444

Please sign in to comment.