Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Information on breaking changes and significant new features released with RNode version 0.7.

Validator bonding to support the proof of stake (PoS) consensus system is now available.

The RChain platform has a pure proof of stake of consensus system. To secure the network, validators must provide a bond, which is 'locked' into the PoS contract on the chain. We call this process validator bonding. During the test net phase of the project there is no way to acquire tokens for the network. So to support validator bonding, this version of RNode offers a faucet to dispense the bond amount. To start the validator bonding process users invoke the 'GenerateBondingDeploys' client api. They provide a public/private key pair and bond amount through this api to generate the Rholang files required to create the bonding request.

For new validators to bond, a network must have at least 1 bonded validator at Genesis. The bonding request must be sent to this bonded validator. To properly bond to the network, a node should join the network as a validating node would (include the private key at start) and then obtain the state of the network from other nodes. This is also referred to as 'Read Only Mode'. The bonding requests (deploys) need to be sent to a bonded validator by specifying the '--grpc-host' option and passing in the bonded validators' IP address. The bonded validator should propose blocks to finalize the bonding requests. Once the prospective validating Information on breaking changes and significant new features released with RNode version 0.7.

Validator bonding to support the proof of stake (PoS) consensus system is now available.

The RChain platform has a pure proof of stake of consensus system. To secure the network, validators must provide a bond, which is 'locked' into the PoS contract on the chain. We call this process validator bonding. During the test net phase of the project there is no way to acquire tokens for the network. So to support validator bonding, this version of RNode offers a faucet to dispense the bond amount. To start the validator bonding process users invoke the 'GenerateBondingDeploys' client api. They provide a public/private key pair and bond amount through this api to generate the Rholang files required to create the bonding request.

For new validators to bond, a network must have at least 1 bonded validator at Genesis. The bonding request must be sent to this bonded validator. To properly bond to the network, a node should join the network as a validating node would (include the private key at start) and then obtain the state of the network from other nodes. This is also referred to as 'Read Only Mode'. The bonding requests (deploys) need to be sent to a bonded validator by specifying the '--grpc-host' option and passing in the bonded validators' IP address. The bonded validator should propose blocks to finalize the bonding requests. Once the prospective validating node has an updated version of the PoS contract containing the its validator identity and bond amount, the node considers itself bonded. After this point, the node can propose blocks.

...

The name registry provides secure, efficient storage of Rholang terms. Unforgeable names can be registered arbitrarily, and any other term can be registered using a public key and a signature as proof of ownership. All entries are referenced by URI.

Usage:

Code Block
new insertArbitrary(`rho:registry:insertArbitrary`) in { … }
new insertSigned_ed25519(`rho:registry:insertSigned:ed25519`) in { … }
new lookup(`rho:registry:lookup`) in { … }

Examples:

...

of ownership. All entries are referenced by URI.

Usage:

Code Block
new insertArbitrary(`rho:registry:insertArbitrary`) in { … }
new insertSigned_ed25519(`rho:registry:insertSigned:ed25519`) in { … }
new lookup(`rho:registry:lookup`) in { … }

Examples:

Code Block
// insertArbitrary
//     Insert an unforgable name
//     Two parameters: name, returnUri
new insertArbitrary(`rho:registry:insertArbitrary`), stdout(`rho:io:stdout`) in {
    new x, return in {
        // Insert the name into the registry
        // Wrap in bundle+ so only write is possible for those who lookup
        insertArbitrary!(bundle+{*x}, *return) |

        // Receive the URI generated by the registry
        for (xUri <- return) {
            // Something like: `rho:id:rtu77e1cj1ky7dpqyoc6o8rcdseseax35qi7w37hbf3astmrcupusi`
            stdout!(*xUri)
        }
    }
}

// insertSigned 
//     Insert an unforgable name a signed term using ed25519 signature 
//     Four parameters:  Two parameters: namepublic-key, term, signature, returnUri 
new insertArbitraryinsertSigned_ed25519(`rho:registry:insertArbitrary`insertSigned:ed25519`), stdout(`rho:io:stdout`) in {
    new x, return in {
        // Insert the name into the registry Secret key:
        // d039d5c634ad95d968fc18368d81b97aaecd32fc7cf6eec07a97c5ac9f9fcb5b11afb9a5fa2b3e194b701987b3531a93dbdf790dac26f8a2502cfa5d529f6b4d
        // Public key:
        // Wrap11afb9a5fa2b3e194b701987b3531a93dbdf790dac26f8a2502cfa5d529f6b4d
in bundle+ so only write is possible for those// whoThe lookupsignatures here are over the serialized representation of  insertArbitrary!(bundle+{*x}, *return) |the nonce, value tuple.
         // To Receiverecreate the URI generated by signatures, you can do something like the registryfollowing:
        for// (xUrival <-key return) {
  = Base16.decode("<secret key goes here>")
         // Somethingval like: `rho:id:rtu77e1cj1ky7dpqyoc6o8rcdseseax35qi7w37hbf3astmrcupusi`toSign: Par = ETuple(Seq(GInt(789), GString("entry")))
        // val sig = stdout!(*xUriEd25519.sign(toSign.toByteArray, key)
        }insertSigned_ed25519!(
        } }  // insertSigned "11afb9a5fa2b3e194b701987b3531a93dbdf790dac26f8a2502cfa5d529f6b4d".hexToBytes(),
 //     Insert a signed term using ed25519 signature 
//(789, "entry"),
     Four parameters: public-key, term, signature, returnUri  new insertSigned_ed25519(`rho:registry:insertSigned:ed25519`"20c3b7da06565933400cb61301ffa14df82ef09b046c8152e02e8047d6f69ee2c2a2e4114db7ceb01eb828dfc98c15e40a502f9d85c58ca03734cab549e85e0d".hexToBytes(),
stdout(`rho:io:stdout`) in {     new return in {  *return) |
     // Secret key:         // d039d5c634ad95d968fc18368d81b97aaecd32fc7cf6eec07a97c5ac9f9fcb5b11afb9a5fa2b3e194b701987b3531a93dbdf790dac26f8a2502cfa5d529f6b4d
        // Public key:
  Receive the URI generated by the registry
      // 11afb9a5fa2b3e194b701987b3531a93dbdf790dac26f8a2502cfa5d529f6b4d for (entryUri <- return) {
   // The signatures here are over the serialized representation of the nonce, value tuple. stdout!(*entryUri)
        }
  // To recreate}
the}
signatures,
you// canlookup
do// something like the following: Look up an entry in the registry 
// val key = Base16.decode("<secret key goes here>")
        // val toSign: Par = ETuple(Seq(GInt(789), GString("entry")))
   Two parameters: uri, return 
new lookup(`rho:registry:lookup`),
    insertArbitrary(`rho:registry:insertArbitrary`),
    stdout(`rho:io:stdout`) in {

    // val sig = Ed25519.sign(toSign.toByteArray, key)
  Part 1, Run this code once and then comment it out
    // /*
insertSigned_ed25519!(    new x, insertReturn in {
    "11afb9a5fa2b3e194b701987b3531a93dbdf790dac26f8a2502cfa5d529f6b4d".hexToBytes(),    // Insert x into the registry
   (789, "entry"),     insertArbitrary!(bundle+{*x}, *insertReturn) |

    "20c3b7da06565933400cb61301ffa14df82ef09b046c8152e02e8047d6f69ee2c2a2e4114db7ceb01eb828dfc98c15e40a502f9d85c58ca03734cab549e85e0d".hexToBytes(),     // Receive the URI returned from the registry
*return) |        for (xUri <- insertReturn)   {
            // Write Receiveout the URI generated by the registry
            for// (entryUri <- return) {
A) REMEMBER THIS VALUE, use it below
            stdout!(*entryUrixUri)
        } |

   } }  // lookup // Set up a receive Lookon upx
an entry in the registry  //  for (v <= Two parameters: uri, return 
new lookup(`rho:registry:lookup`),x) {
       insertArbitrary(`rho:registry:insertArbitrary`),     stdout(`rho:io:stdout`) in {!("Received from x") |
             // Part 1, Run this code once and then comment it out
    // /*
    new x, insertReturn in {
   stdout!(*v)
        }
    }

    // End of Part 1, after running once, comment out to here
    // Insert*/
x
into the registry  // Part 2, Uncomment this code once  insertArbitrary!(bundle+{*x}, *insertReturn) |
you've run Part 1 first
    /*    
// Receive the URI returnednew fromlookupReturn thein registry{
        // forLookup (xUrix <-using insertReturn)its {URI from location (A) above
        // Write out the URI generated by the registry
  lookup!(`The Value from A`, *lookupReturn) |

        // (A)x REMEMBERis THIS VALUEreturned, usecalling it belowxLookup here
        for (xFromRegistry  stdout!(*xUri)
        } |<- lookupReturn) {
            // Set up a receive Send on xthe name retrieved     from the forregistry (v <=which is really x)
{             stdoutxFromRegistry!("Received from x") |
            stdout!(*vHello, I'm sending on x which I got from the registry.")
        }
    }
     // End of Part 1, after running once, comment out to here
    // */

    // Part 2, Uncomment this code once you've run Part 1 first
    /*    
    new lookupReturn in {
        // Lookup x using its URI from location (A) above
        // lookup!(`The Value from A`, *lookupReturn) |

    End of Part 2
    */
}

The use of logical connectives (AND, OR, and NOT) in consumes ('for' expressions) has changed.

Starting with this version (RNode 0.7), only the logical connective AND ('/\') is allowed in consumes ('for' expressions). The cost accounting system requires that pattern matching operations consume negligible resources. Using the logical connectives OR ('\/') or NOT ('~') could produce expressions which would be costly to perform even though a match would not be made, and thus, would not be charged for execution. This introduces an attack vector against validators. Multiple mitigations were considered which sought to retain as much expressiveness in the language as possible, while addressing the costing issue. The solution chosen was to change the Rholang grammar to only accept the AND ('/\') logical connective in consumes ('for' expressions). Note that the OR ('\/') and NOT ('~') are still valid within 'match' expressions. This change only affects consumes ('for' expressions).

Examples:

Code Block
new x in {
    // xERROR: islogical returned,OR callingis itused xLookupin herethe pattern of the receive
    for(@{Nil  for (xFromRegistry\/ Nil} <- lookupReturnx) {
            // Send on the name retrieved from the registry (which is really x)
            xFromRegistry!("Hello, I'm sending on x which I got from the registry.")
        }
    }
    // End of Part 2
    */
}
 Nil }
} 

new x in {
    // ERROR: logical NOT is used in the pattern of the receive
    for(@{~Nil} <- x) { Nil }
} 

new x in {
    // OK: logical AND is allowed in the receive
    for(@{Nil /\ Nil} <- x) { Nil }
}


The RNode version number and Git hash can now be retrieved from a remote node.

$ curl -s localhost:40403/version

The show-blocks feature has changed to return only header information and a new depth parameter was added to specify how many blocks, measured from the current block, to display.

$ rnode show-blocks -d 10

Shards can be configured to enforce minimum and maximum bonding amounts. The root shard bond amounts are configured to a minimum of 1,500 Rev and a maximum of 1,000,000 Rev.

...

Subcommand: deploy - Deploy a Rholang source file to Casper on an existing running node. The deploy will be packaged and sent as a block to the network 
depending on the configuration of the Casper instance.

-f, --from <arg> Purse address that will be used to pay for the deployment.
-n, --nonce <arg> This allows you to overwrite your own pending transactions that use the same nonce.
-p, --phlo-limit <arg> The amount of phlo to use for the transaction (unused phlo is refunded). Must be positive integer.
--phlo-price <arg> The price of phlo for this transaction in units dust/phlo. Must be positive integer.

Listening on a name now takes in a starting block height and ending block height.

Subcommand: listen-data-at-name - Listen for data at the specified name

-c, --content <arg> Rholang name
-t, --type <arg> Type of the specified name

Subcommand: listen-cont-at-name - Listen for continuation at the specified name

-c, --content <arg> Rholang name
-t, --type <arg> Type of the specified name

The internal representation of Rholang terms has changed.

The Channel type has been removed. Channels are now represented by just a Par which is assumed to be quoted. This change will affect clients using the gRPC API to consume protobufs or signing terms which would have used the Channel type.


Filter by label (Content by label)
showLabelsfalse
max5
spacescom.atlassian.confluence.content.render.xhtml.model.resource.identifiers.SpaceResourceIdentifier@10918
showSpacefalse
sortmodified
reversetrue
typepage
cqllabel = "release-notes" and type = "page" and space = "DOC"
labelsrelease-notes

...