ADDED build/nano.man.in Index: build/nano.man.in ================================================================== --- /dev/null +++ build/nano.man.in @@ -0,0 +1,727 @@ +.de XI +\\$1 +.BI \\$2 \\$3 +\\$4 +.. +.de HB +The +.B -hex +and +.B -binary +options determine the formatting of the result. +.. +.de XN +The +.B -xrb +option causes all parsed addresses to be prefixed with the old-style "xrb_" address prefix, while the +.B -nano +option causes them to be prefixed with the new-style "nano_prefix". +.. +.de JB +If the optional +.B -json +argument is used and specified as true the result is a JSON representation, +otherwise a Tcl dict representation is used. +.. +.PU +.TH NANO N "8 Jul 2018" "nano @@VERS@@" +.SH NAME +nano \- Tcl bindings for Nano +.SH SYNOPSIS + +.B nano:: +.in +2m +.B address:: +.in +2m +.B toPublicKey +.I address +.RB ? -hex | -binary ? +.RB ? -verify | -no-verify ? +.br +.B fromPublicKey +.I pubKey +.RB ? -xrb | -nano ? +.br +.B fromPrivateKey +.I privateKey +.RB ? -xrb | -nano ? + +.in -2m +.B key:: +.in +2m +.B newSeed +.RB ? -hex | -binary ? +.br +.B newKey +.RB ? -hex | -binary ? +.br +.B fromSeed +.I seed +.RI ? index ? +.RB ? -hex | -binary ? +.br +.B publicKeyFromPrivateKey +.I privateKey +.RB ? -hex | -binary ? + +.in -2m +.B block:: +.in +2m +.B json::toBlock +.I blockJSON +.br +.B json::fromDict +.I blockDict +.br +.B json::fromBlock +.I blockData +.RB ? -xrb | -nano ? +.XI ? -type= blockType ? +.XI ? -signKey= privateKey ? +.br +.B json::sign +.I blockJSON +.I privateKey +.RB ? -update | -signature " ?" -hex | binary ?? +.br +.B json::verifySignature +.I blockJSON +.br +.B json::work +.I blockJSON +.RB ? -update | -work " ?" -hex | -binary ?? +.br +.B json::validateWork +.I blockJSON + +.B dict::toBlock +.I blockDict +.br +.B dict::fromJSON +.I blockJSON +.br +.B dict::fromBlock +.I blockData +.RB ? -xrb | -nano ? +.XI ? -type= blockType ? +.XI ? -signKey= privateKey ? +.br +.B dict::sign +.I blockDict +.I privateKey +.RB ? -update | -signature " ?" -hex | binary ?? +.br +.B dict::verifySignature +.I blockDict +.br +.B dict::work +.I blockDict +.RB ? -update | -work " ?" -hex | -binary ?? +.br +.B dict::validateWork +.I blockDict + +.B hash +.I blockData +.RB ? -hex | -binary ? +.br +.B signBlockHash +.I blockHash +.I privateKey +.RB ? -hex | -binary ? +.br +.B sign +.I blockData +.I privateKey +.RB ? -hex | -binary ? +.br +.B verifyBlockHash +.I blockHash +.I signature +.I publicKey +.br +.B verify +.I blockData +.I signature +.I publicKey + +.B create::send +.I args +.br +.B create::receive +.I args +.br +.B create::setRepresentative +.I args + +.in -2m +.B work:: +.in +2m +.B fromWorkData +.I blockHashOrPublicKey +.br +.B fromBlock +.I blockData +.br +.B validate +.I workData +.I work + +.in -2m +.B account:: +.in +2m +.B setFrontier +.I account +.I frontierHash +.I balance +.I representative +.br +.B getFrontier +.I account +.br +.B getFrontier +.I account +.RB ? frontierHash | balance | representative ? +.br +.B addPending +.I account +.I blockHash +.I amount +.br +.B getPending +.I account +.RI ? blockHash ? +.br +.B clearPending +.I account +.RI ? blockHash ? + +.B receive +.I account +.I blockHash +.I privateKey +.br +.B receiveAllPending +.I account +.I privateKey +.br +.B send +.I fromAccount +.I toAccount +.I amount +.I privateKey +.br +.B setRepresentative +.I account +.I representative +.I privateKey + +.in -2m +.in -2m + +.SH DESCRIPTION +.I Nano +is a low-latency payment platform that requires minimal resources. This +package provides bindings for interacting with the Nano network from +.IR Tcl . +It uses Ed25519 with Blake2b as the cryptographic hashing primitive (rather +than the normal construction of Ed25519 with the SHA3-512 cryptographic +hashing function) for digital signatures. + +.SH PROCEDURES +.SS Addresses +.TP +.B ::nano::address::toPublicKey +.I address +.RB ? -hex | -binary ? +.RB ? -verify | -no-verify ? +.BI " -> " publicKey + +Converts a Nano address to a public key. The +.B -hex +option indicates that the public key should be returned in hexidecimal form. +The +.-B -binary +option indicates that the public key should be returned in binary form. +The +.B -verify +option verifies the checksum embedded in the Nano address before returning. +The +.B -no-verify +option inhibits verifying the checksum embedded in the Nano address. + +.TP +.B ::nano::address::fromPublicKey +.I pubKey +.RB ? -xrb | -nano ? +.BI " -> " address + +Converts a public key to a Nano address. The +.-B -xrb +option specifies that the returned address should be prefixed with the +old-style "xrb_" prefix, where the +.B -nano +option specifies that the returned address should be prefixed with the +new-style "nano_" prefix. + +.TP +.B ::nano::address::fromPrivateKey +.I privateKey +.RB ? -xrb | -nano ? +.BI " -> " address + +Converts a private key to a Nano address. It accepts the same arguments as +.BR fromPublicKey . + +.SS Key Management +.TP +.B ::nano::key::newSeed +.RB ? -hex | -binary ? +.RI "-> " seed + +Generates a new seed. A seed is a 256-bit bitfield which, along with a 32-bit +index, is used to derive enumerated keys from a single point of entropy. See +the +.B fromSeed +procedure. +.HB + +.TP +.B ::nano::key::newKey +.RB ? -hex | -binary ? +.RI " -> " privateKey + +Generates a new private key. A private key can be used to sign transactions, +which can then be verified with its cooresponding public key (see +.BR publicKeyFromPrivateKey ). +This procedure is normally not used, but rather private keys are derived +from a +.I seed +and +.I index +pair using the +.B fromSeed +procedure. +.HB + +.TP +.B ::nano::key::fromSeed +.I seed +.RI ? index ? +.RB ? -hex | -binary ? +.RI " -> " privateKey + +Derive a private key from the seed specified as +.I seed +and the +.I index +indicated. This procedure is deterministic (i.e., the same +.I seed +and +.I index +will always give you the same private key). This procedure is used to derive +many keypairs from a single user-managed piece of data, so the user does not +have to manage multiple private keys. If the +.I index +is not specified it defaults to +.BR 0 . +.HB + +.TP +.B ::nano::key::publicKeyFromPrivateKey +.I privateKey +.RB ? -hex | -binary ? +.RI " -> " publicKey + +Converts a private key into its corresponding public key. Normally Ed25519 +private keys are a concatencation of the private and public keys, however in +this package they are each treated separately. +.HB + +.SS Low-level Block +.TP +.BI ::nano::block:: representation ::toBlock +.I blockRepresentation +.RI " -> " blockData + +Converts from one of the internal representations (either Tcl dictionary or JSON) to a Nano block. + +.TP +.B ::nano::block::json::fromDict +.I blockDict +.RI " -> " blockJSON + +Converts from a Tcl dictionary representation to a JSON representation of a block. + +.TP +.B ::nano::block::dict::fromJSON +.I blockJSON +.RI " -> " blockDict + +Converts from a JSON object representation to a Tcl dictionary representation of a block. + +.TP +.BI ::nano::block:: representation ::fromBlock +.I blockData +.RB ? -xrb | -nano ? +.XI ? -type= blockType ? +.XI ? -signKey= privateKey ? +.RI " -> " blockRepresentation + +Parses a Nano block and returns either a Tcl dictionary or a JSON object. +.XN + +.TP +.BI ::nano::block:: representation ::sign +.I blockRepresentation +.I privateKey +.RB ? -update | -signature " ?" -hex | binary ?? +.RI " -> " signature | blockJSON + +Sign a block, in either Tcl dictionary or JSON representation, with the specified +.IR privateKey . +If the +.B -update +option is used, return the object with the updated attribute. +If the +.B -signature +option is used, return just the signature. +.HB + +.TP +.BI ::nano::block:: representation ::verifySignature +.I blockRepresentation +.RI " -> " boolean + +Verify the signature on a block, in either Tcl dictionary or JSON +representation, matches the public key specified in the +.B account +attribute of that object. This may not work correctly for old-style blocks +unless you manually add the +.B account +attribute. + +.TP +.BI ::nano::block:: representation ::work +.I blockRepresentation +.RB ? -update | -work " ?" -hex | binary ?? +.RI " -> " work | blockRepresentation + +Generate proof-of-work (PoW) required to submit a given block to the network. +Nano uses PoW to increase the cost of submitting blocks to the network to cut +down on spam. The +.I work +that is computed is based on the hash of the previous block on this chain, or +if there is no previous block on this chain (i.e., because it is the first +block on an account) the public key of the account. If the +.B -update +option is used, return the object with the updated attribute. +If the +.B -work +option is used, just return the work. +.HB + +.TP +.BI ::nano::block:: representation ::validateWork +.I blockRepresentation +.RI " -> " boolean + +Validate the proof-of-work (PoW) in the object specified as +.I blockRepresentation +with the attribute +.B work +is valid for the block passed in. + +.TP +.B ::nano::block::hash +.I blockData +.RB ? -hex | -binary ? +.RI " -> " blockHash + +Compute the cryptographic hash of a block. The cryptographic hashing +algorithm used for Nano is Blake2b. Blocks are typically identified +by their hash (i.e., content addressable). +.HB + +.TP +.B ::nano::block::signBlockHash +.I blockHash +.I privateKey +.RB ? -hex | -binary ? +.RI " -> " signature + +Compute an Ed25519-with-Blake2b signature of a given block hash specified as +.I blockHash +with the private key specified as +.IR privateKey . +In Nano, signed blocks are signed by signing the block's hash thus all that is +needed to sign a block is its hash and the private key that corresponds to the +account. +.B NOTE: Ensure that the +.I privateKey +.B specified matches the account the block belongs to. +.HB + +.TP +.B ::nano::block::sign +.I blockData +.I privateKey +.RB ? -hex | -binary ? +.RI " -> " signature + +This is a convienence procedure which computes the hash of a block given as +.IR blockData , +and then calls +.BR signBlockHash . +.HB + +.TP +.B ::nano::block::verifyBlockHash +.I blockHash +.I signature +.I publicKey +.RI " -> " boolean + +Verify that a block hash +.RI ( blockHash ) +was signed +.RI ( signature ) +by an account holding the private key that +corresponds to the public key specified as +.IR publicKey . + +.TP +.B ::nano::block::verify +.I blockData +.I signature +.I publicKey +.RI " -> " boolean + +This is a convienence procedure which computes the hash of a block given as +.IR blockData , +and then calls +.BR verifyBlockHash . + +.TP +.B ::nano::block::create::send +.BI "from " address +.BI "to " address +.BI "previous " blockHash +.BI "representative " address +.BI "previousBalance " integer +.BI "amount " integer +? +.BI "-json " boolean +? +.RI " -> " blockJSON | blockDict + +This is a low-level interface for creating blocks which correspond to sending +Nano from one account to another. It constructs a block which sends the +.B amount +specified from the +.B from +address to the destination +.RB ( to ). +The previous block's hash must be specified as the +.I blockHash +following +.BR previous . +Additionally the balance of the account at the previous block must be supplied +as the integer argument to +.BR previousBalance . +All balance amounts are in units of +.BR raw . +.JB + +.TP +.B ::nano::block::create::receive +.BI "to " address +.BI "sourceBlock " blockHash +.BI "previous " blockHash +.BI "representative " address +.BI "previousBalance " integer +.BI "amount " integer +? +.BI "-json " boolean +? +.RI " -> " blockJSON | blockDict + +This is a low-level interface for creating blocks which correspond to receiving +(pocketing) Nano previously sent from another account to the account specified +as the +.I address +supplied to the +.B to +argument. It constructs a block which receives the amount of Nano specified +as the +.B amount +argument. +The block hash +.RI ( blockHash ) +of the send block which was used to send the Nano to this account must be +specified as the argument to the +.B sourceBlock +option. +The previous block's hash must be specified as the +.I blockHash +following +.BR previous . +Additionally the balance of the account at the previous block must be supplied +as the integer argument to +.BR previousBalance . +All balance amounts are in units of +.BR raw . +.JB + +.TP +.B ::nano::block::create::setRepresentative +.BI "account " address +.BI "previous " blockHash +.BI "representative " address +? +.BI "-json " boolean +? +.RI " -> " blockJSON | blockDict + +This is a low-level interface for creating blocks which correspond to an +explicit change of representative. Representatives in Nano are used as +part of the Delegated Proof-of-Stake (dPoS) consensus mechanism which is +used by the Nano network to determine which block (if any) out of many possible +subordinate blocks in a chain are valid. So that every account holder does +not have to be online to vote for valid transactions, an account may delegate +another account to vote its stake on its behalf. That delegate is called +a representative. An account may change its representative at any time by +issuing a block with a new representative, such as a send or receive block, +or by issuing an explicit change of representative block. This procedure +creates an explicit change of representative block for the +.B account +specified. It changes to the delegate to the +.B representative +specified. Further, the +.I blockHash +of the previous block must be specified as the argument to +.BR previous . +.JB + +.SS Work Generation +.TP +.B ::nano::work::fromWorkData +.I blockHashOrPublicKey +.RI " -> " work + +Create proof-of-work (PoW) from a block hash or public key. Which one is used +depends on whether or not there are any other blocks in this account's chain. +If this is the first block in this account's chain then the public key of the +account is used, otherwise the hash of the blocks predecessor +.RI ( previous ) +is used. The specific value needed should be accessible from the +.B _workData +member of a JSON object or Tcl dictionary. Note that this attribute (and all +attributes that begin with an underscore) should be discarded when +sending the block outside of the Tcl process. + +.TP +.B ::nano::work::fromBlock +.I blockData +.RI " -> " work + +This is a convienence procedure which computes work data (either a block hash +or a public key) for a given block and then calls +.BR fromWorkData . + +.TP +.B ::nano::work::validate +.I workData +.I work +.RI " -> " boolean + +This procedure validates that the supplied +.I work +is valid for the supplied +.IR workData , +which is either a block hash or an account public key. For more information +see the descript of +.BR fromWorkData . + + +.SS High-level Account +.TP +.B :nano::account::setFrontier +.I account +.I frontierHash +.I balance +.I representative + +This procedure is used as part of the High-level Account interface. It sets the +.IR frontier , +which is the block hash +.RI ( frontierHash ) +and data +.RI ( balance ", " representative ) +associated with that block that corresponds to the head of an account's chain. + +.TP +.B :nano::account::getFrontier +.I account +.RI " -> " frontierInfo + +.TP +.B :nano::account::getFrontier +.I account +.RB ? frontierHash | balance | representative ? +.RI " -> " frontierHash | balance | representative + +.TP +.B :nano::account::addPending +.I account +.I blockHash +.I amount + +.TP +.B :nano::account::getPending +.I account +.RI ? blockHash ? +.RI " -> " listOfDicts + +.TP +.B ::nano::account::clearPending +.I account +.RI ? blockHash ? + +.TP +.B :nano::account::receive +.I account +.I blockHash +.I privateKey +.RI " -> " blockJSON | blockDict + +.TP +.B :nano::account::receiveAllPending +.I account +.I privateKey +.RI " -> " listOfBlockJSON | listOfBlockDict + +.TP +.B :nano::account::send +.I fromAccount +.I toAccount +.I amount +.I privateKey +.RI " -> " blockJSON | blockDict + +.TP +.B ::nano::account::setRepresentative +.I account +.I representative +.I privateKey +.RI " -> " blockJSON | blockDict + +.SH EXAMPLES +.SS Example 1 +.SS Example 2 +.SS Example 3 + +.SH AUTHOR +.Sp +Roy Keene +.RI < rkeene@nano.org > DELETED build/nano.txt Index: build/nano.txt ================================================================== --- build/nano.txt +++ /dev/null @@ -1,53 +0,0 @@ -Address -::nano::address::toPublicKey address ?-hex|-binary? ?-verify|-no-verify? -> publicKey -::nano::address::fromPublicKey pubKey ?-xrb|-nano? -> address -::nano::address::fromPrivateKey privateKey ?-xrb|-nano? -> address - -Key and Seed -::nano::key::newSeed ?-hex|-binary? -> seed -::nano::key::newKey ?-hex|-binary? -> privateKey -::nano::key::fromSeed seed ?index? ?-hex|-binary? -> privateKey -::nano::key::publicKeyFromPrivateKey privateKey ?-hex|-binary? -> publicKey - -Low-level Block -::nano::block::json::toBlock blockJSON -> blockData -::nano::block::json::fromDict blockDict -> blockJSON -::nano::block::json::fromBlock blockData ?-xrb|-nano? ?-type=? ?-signKey=? -> blockJSON -::nano::block::json::sign blockJSON privateKey ?-update|-signature ?-hex|binary?? -> signature|blockJSON -::nano::block::json::verifySignature blockJSON args -> boolean -::nano::block::json::work blockJSON ?-update|-work ?-hex|-binary?? -> work|blockJSON -::nano::block::json::validateWork blockJSON -> boolean - -::nano::block::dict::toBlock blockDict -> blockData -::nano::block::dict::fromJSON blockJSON -> blockDict -::nano::block::dict::fromBlock blockData ?-xrb|-nano? ?-type=? ?-signKey=? -> blockDict -::nano::block::dict::sign blockDict privateKey ?-update|-signature ?-hex|-binary?? -> signature|blockDict -::nano::block::dict::verifySignature blockDict args -> boolean -::nano::block::dict::work blockDict ?-update|-work ?-hex|-binary?? -> work|blockDict -::nano::block::dict::validateWork blockDict -> boolean - -::nano::block::hash blockData ?-hex|-binary? -> blockHash - -::nano::block::signBlockHash blockHash privateKey ?-hex|-binary? -> signature -::nano::block::sign blockData privateKey ?-hex|-binary? -> signature - -::nano::block::verifyBlockHash blockHash signature publicKey -> boolean -::nano::block::verify blockData signature publicKey -> boolean - -::nano::block::create::send args -> blockJSON|blockDict -::nano::block::create::receive args -> blockJSON|blockDict -::nano::block::create::setRepresentative args -> blockJSON|blockDict - -# Work Generation -::nano::work::fromWorkData blockHashOrPublicKey -> work -::nano::work::fromBlock blockData -> work -::nano::work::validate workData work -> boolean - -# High Level Account -:nano::account::setFrontier account frontierHash balance representative -> nil -:nano::account::getFrontier account -> frontierInfo -:nano::account::getFrontier account ?frontierHash|balance|representative? -> frontierHash|balance|representative -:nano::account::addPending account blockHash amount -> nil -:nano::account::receive account blockHash privateKey -> blockJSON|blockDict -:nano::account::send fromAccount toAccount amount privateKey -> blockJSON|blockDict -:nano::account::receiveAllPending account privateKey -> ListOfBlockJSON|ListOfBlockDict