lib/nanook/block.rb in nanook-1.0.0 vs lib/nanook/block.rb in nanook-1.0.1
- old
+ new
@@ -1,54 +1,134 @@
class Nanook
# The <tt>Nanook::Block</tt> class contains methods to discover
# publicly-available information about blocks on the nano network.
#
- # A block is represented by a unique hash
+ # A block is represented by a unique id like this:
#
+ # "FBF8B0E6623A31AB528EBD839EEAA91CAFD25C12294C46754E45FD017F7939EB"
+ #
# Initialize this class through the convenient Nanook#block method:
#
# nanook = Nanook.new
- # account = nanook.block("991CF19...")
+ # account = nanook.block("FBF8B0E...")
#
# Or compose the longhand way like this:
#
# rpc_conn = Nanook::Rpc.new
- # block = Nanook::Block.new(rpc_conn, "991CF19...")
+ # block = Nanook::Block.new(rpc_conn, "FBF8B0E...")
class Block
def initialize(rpc, block)
@rpc = rpc
@block = block
block_required! # All methods expect a block
end
+ # Returns a String of the account id of the block.
+ #
+ # ==== Example
+ #
+ # block.account # => "xrb_3x7c..."
def account
rpc(:block_account, :hash)[:account]
end
+ # Stop generating work for a block.
+ #
+ # Returns boolean signalling if the action was successful.
+ #
+ # ==== Example
+ #
+ # block.cancel_work # => true
def cancel_work
rpc(:work_cancel, :hash).empty?
end
+ # Returns an Array of block hashes in the account chain starting at
+ # this block.
+ #
+ # See also #successors.
+ #
+ # ==== Arguments
+ #
+ # [+limit:+] Maximum number of block hashes to return (default is 1000)
+ #
+ # ==== Example
+ #
+ # block.chain(limit: 2)
+ #
+ # ==== Example reponse
+ #
+ # [
+ # "36A0FB717368BA8CF8D255B63DC207771EABC6C6FFC22A7F455EC2209464897E",
+ # "FBF8B0E6623A31AB528EBD839EEAA91CAFD25C12294C46754E45FD017F7939EB"
+ # ]
def chain(limit: 1000)
response = rpc(:chain, :block, count: limit)[:blocks]
Nanook::Util.coerce_empty_string_to_type(response, Array)
end
+ # Generate work for a block.
+ #
+ # Returns the work id of the work completed.
+ #
+ # block.generate_work # => "2bf29ef00786a6bc"
def generate_work
rpc(:work_generate, :hash)[:work]
end
+ # Returns Array of Hashes containing information about a chain of
+ # send/receive blocks, starting from this block.
+ #
+ # ==== Arguments
+ #
+ # [+limit:+] Maximum number of send/receive block hashes to return
+ # in the chain (default is 1000)
+ #
+ # ==== Example
+ #
+ # block.history(limit: 1)
+ #
+ # ==== Example response
+ #
+ # [
+ # {
+ # :account=>"xrb_3x7cjioqahgs5ppheys6prpqtb4rdknked83chf97bot1unrbdkaux37t31b",
+ # :amount=>539834279601145558517940224,
+ # :hash=>"36A0FB717368BA8CF8D255B63DC207771EABC6C6FFC22A7F455EC2209464897E",
+ # :type=>"send"
+ # }
+ # ]
def history(limit: 1000)
rpc(:history, :hash, count: limit)[:history]
end
+ # Returns the block hash
+ #
+ # block.id #=> "FBF8B0E..."
def id
@block
end
+ # Returns a Hash of information about the block.
+ #
+ # ==== Arguments
+ #
+ # [+allow_unchecked:+] Boolean (default is +false+). If +true+,
+ # information can be returned about blocks that
+ # are unchecked (unverified).
+ # ==== Example response
+ #
+ # {
+ # :type=>"send",
+ # :previous=>"FBF8B0E6623A31AB528EBD839EEAA91CAFD25C12294C46754E45FD017F7939EB",
+ # :destination=>"xrb_3x7cjioqahgs5ppheys6prpqtb4rdknked83chf97bot1unrbdkaux37t31b",
+ # :balance=>"00000000000000000000000000000000",
+ # :work=>"44cc24b60705083a",
+ # :signature=>"42ADFEFE7C3FFF188AE92A202F8A5734DE91779C454613E446EEC93D001D6C953E9FD16730AF32C891791BA8EDAECEB059A213E2FE1EEB7ADF9D5D0815464D06"
+ # }
def info(allow_unchecked: false)
if allow_unchecked
# TODO not actually sure what this response looks like when it's not an unchecked block, assuming its blank
response = rpc(:unchecked_get, :hash)
if response[:error] != "Block not found"
@@ -59,15 +139,29 @@
response = rpc(:block, :hash)
_parse_info_response(response)
end
+ # Returns boolean signalling if work is valid for the block.
+ #
+ # block.is_valid_work?("2bf29ef00786a6bc") # => true
def is_valid_work?(work)
response = rpc(:work_validate, :hash, work: work)
!response.empty? && response[:valid] == 1
end
+ # Republish blocks starting at this block up the account chain
+ # back to the nano network.
+ #
+ # Returns an Array of block hashes that were republished.
+ #
+ # ==== Example
+ #
+ # block.republish
+ #
+ # ==== Example response
+ # ["36A0FB717368BA8CF8D255B63DC207771EABC6C6FFC22A7F455EC2209464897E"]
def republish(destinations:nil, sources:nil)
if !destinations.nil? && !sources.nil?
raise ArgumentError.new("You must provide either destinations or sources but not both")
end
@@ -78,18 +172,47 @@
params[:count] = 1 unless params.empty?
rpc(:republish, :hash, params)[:blocks]
end
+ # Returns boolean +true+ if the block is a pending block.
+ #
+ # block.pending? #=> false
def pending?
response = rpc(:pending_exists, :hash)
!response.empty? && response[:exists] == 1
end
- def process
+ # Publish the block to the nano network.
+ #
+ # Note, if block has previously been published, use #republish instead.
+ #
+ # Returns the block hash, or false.
+ #
+ # block.publish # => "FBF8B0E..."
+ def publish
+ # TODO I think this can return false or error or something?
rpc(:process, :block)[:hash]
end
+ alias_method :process, :publish
+ # Returns an Array of block hashes in the account chain ending at
+ # this block.
+ #
+ # See also #chain.
+ #
+ # ==== Arguments
+ #
+ # [+limit:+] Maximum number of send/receive block hashes to return
+ # in the chain (default is 1000)
+ #
+ # ==== Example
+ #
+ # block.successors
+ #
+ # ==== Example response
+ #
+ # ["36A0FB717368BA8CF8D255B63DC207771EABC6C6FFC22A7F455EC2209464897E"]
def successors(limit: 1000)
response = rpc(:successors, :block, count: limit)[:blocks]
Nanook::Util.coerce_empty_string_to_type(response, Array)
end