class Zold::Txn
A single transaction
Constants
- ISO8601
- PTN
Pattern to match the transaction from text
- REGEX_DETAILS
To validate details
- REGEX_PREFIX
To validate the prefix
- RE_DETAILS
Regular expression for details
- RE_PREFIX
Regular expression for prefix
Attributes
amount[RW]
bnf[RW]
date[R]
details[R]
id[R]
prefix[R]
sign[RW]
Public Class Methods
new(id, date, amount, prefix, bnf, details)
click to toggle source
Make a new object of this class (you must read the White Paper in order to understand this class).
id
-
is the ID of the transaction, an integer
date
-
is the date/time of the transaction
amount
-
is the amount, an instance of class
Amount
prefix
-
is the prefix from the
Invoice
(read the WP) bnf
-
is the wallet ID of the paying or receiving wallet
details
-
is the details, in plain text
# File lib/zold/txn.rb, line 68 def initialize(id, date, amount, prefix, bnf, details) raise 'The ID can\'t be NIL' if id.nil? raise "ID of transaction can't be negative: #{id}" if id < 1 @id = id raise 'The time can\'t be NIL' if date.nil? raise 'Time have to be of type Time' unless date.is_a?(Time) raise "Time can't be in the future: #{date.utc.iso8601}" if date > Time.now @date = date raise 'The amount can\'t be NIL' if amount.nil? raise 'The amount has to be of type Amount' unless amount.is_a?(Amount) raise 'The amount can\'t be zero' if amount.zero? @amount = amount raise 'The bnf can\'t be NIL' if bnf.nil? raise 'The bnf has to be of type Id' unless bnf.is_a?(Id) @bnf = bnf raise 'Prefix can\'t be NIL' if prefix.nil? raise "Prefix is too short: #{prefix.inspect}" if prefix.length < 8 raise "Prefix is too long: #{prefix.inspect}" if prefix.length > 32 raise "Prefix is wrong: #{prefix.inspect} (#{RE_PREFIX})" unless REGEX_PREFIX.match?(prefix) @prefix = prefix raise 'Details can\'t be NIL' if details.nil? raise 'Details can\'t be empty' if details.empty? raise "Details are too long: #{details.inspect}" if details.length > 512 raise "Wrong details #{details.inspect} (#{RE_DETAILS})" unless REGEX_DETAILS.match?(details) @details = details end
parse(line, idx = 0)
click to toggle source
# File lib/zold/txn.rb, line 167 def self.parse(line, idx = 0) clean = line.strip parts = PTN.match(clean) raise CantParse, "Invalid line ##{idx}: #{line.inspect} (doesn't match #{PTN})" unless parts txn = Txn.new( Hexnum.parse(parts[:id]).to_i, parse_time(parts[:date]), Amount.new(zents: Hexnum.parse(parts[:amount]).to_i), parts[:prefix], Id.new(parts[:bnf]), parts[:details] ) txn.sign = parts[:sign] txn end
parse_time(iso)
click to toggle source
# File lib/zold/txn.rb, line 198 def self.parse_time(iso) parts = ISO8601.match(iso) raise CantParseTime, "Invalid ISO 8601 date \"#{iso}\"" if parts.nil? Time.gm( parts[:year].to_i, parts[:month].to_i, parts[:day].to_i, parts[:hours].to_i, parts[:minutes].to_i, parts[:seconds].to_i ) end
Public Instance Methods
<=>(other)
click to toggle source
# File lib/zold/txn.rb, line 101 def <=>(other) raise 'Can only compare with Txn' unless other.is_a?(Txn) [date, amount * -1, id, bnf] <=> [other.date, other.amount * -1, other.id, other.bnf] end
==(other)
click to toggle source
# File lib/zold/txn.rb, line 95 def ==(other) id == other.id && date == other.date && amount == other.amount && prefix == other.prefix && bnf == other.bnf && details == other.details && sign == other.sign end
inverse(bnf)
click to toggle source
# File lib/zold/txn.rb, line 135 def inverse(bnf) raise 'You can\'t reverse a positive transaction' unless amount.negative? t = clone t.amount = amount * -1 t.bnf = bnf t.sign = '' t end
signed(pvt, id)
click to toggle source
Sign the transaction and add RSA signature to it
pvt
-
The private RSA key of the paying wallet
id
-
Paying wallet ID
# File lib/zold/txn.rb, line 147 def signed(pvt, id) t = clone t.sign = Signature.new.sign(pvt, id, self) t end
to_json()
click to toggle source
# File lib/zold/txn.rb, line 118 def to_json { id: @id, date: @date.utc.iso8601, amount: @amount.to_i, prefix: @prefix, bnf: @bnf.to_s, details: @details, sign: @sign } end
to_s()
click to toggle source
# File lib/zold/txn.rb, line 106 def to_s [ Hexnum.new(@id, 4).to_s, @date.utc.iso8601, Hexnum.new(@amount.to_i, 16), @prefix, @bnf, @details, @sign ].join(';') end
to_text()
click to toggle source
# File lib/zold/txn.rb, line 130 def to_text start = @amount.negative? ? "##{@id}" : "(#{@id})" "#{start} #{@date.utc.iso8601} #{@amount} #{@bnf} #{@details}" end