ebuchman comments 2

This commit is contained in:
rigelrozanski 2017-02-14 14:01:18 -05:00 committed by Ethan Buchman
parent 20dc3a1d4b
commit d8b2ceb07c
3 changed files with 33 additions and 17 deletions

View File

@ -64,6 +64,14 @@ and also to store arbitrary other information in the state.
In this way, the functionality and state of a Basecoin-derived cryptocurrency can be greatly extended.
One could imagine going so far as to implement the Ethereum Virtual Machine as a plugin!
Any required plugin initialization should be constructed within `SetOption`.
`SetOption` may be called during genesis of basecoin and can be used to set
initial plugin parameters. Within genesis.json file entries are made in
the format: "<plugin>/<key>", "<value>" Where <plugin> is the plugin name,
and <key> and <value> are the strings passed into the plugin SetOption function.
This function is intended to be used to set plugin specific information such
as the plugin state.
## Examples
To get started with plugins, see [the example-plugin tutorial](example-plugin.md).

View File

@ -41,12 +41,26 @@ func cmdExamplePluginTx(c *cli.Context) error {
//Retrieve any flag results
exampleFlag := c.Bool("valid")
//Create a transaction object with flag results
// Create a transaction object with flag results
// This object is responsible for passing on custom plugin information
exampleTx := ExamplePluginTx{exampleFlag}
//Encode transaction bytes
// The custom plugin object is passed to the plugin in the form of
// a byte array. This is achieved serializing the object using go-wire.
// Once received in the plugin, these exampleTxBytes are decoded back
// into the original object struct ExamplePluginTx
exampleTxBytes := wire.BinaryBytes(exampleTx)
//Send the transaction and return any errors
// Send the transaction and return any errors.
// Here exampleTxBytes will be passed on to the plugin through the
// following series of function calls:
// - commands.AppTx as data (cmd/commands/tx.go)
// - commands.broadcastTx as tx.Data (cmd/commands/tx.go)
// - after being broadcast the Tendermint transaction
// will be run through app.CheckTx, and if successful DeliverTx,
// let's assume app.CheckTx passes
// - app.DeliverTx serialized within txBytes as tx.Data (app/app.go)
// - state.ExecTx as tx.Data (state/execution.go)
// - plugin.RunTx as txBytes (docs/guide/src/example-plugin/plugin.go)
return commands.AppTx(c, "example-plugin", exampleTxBytes)
}

View File

@ -13,10 +13,9 @@ import (
// Plugin State Struct
// * Intended to store the current state of the plugin
// * This example contains a field which holds the execution count
// * Used by go-wire as the encoding/decoding struct to hold the plugin state
// * All fields must be exposed (for go-wire)
// * The state is stored within the KVStore using the key retrieved
// from the ExamplePlugin.StateKey() function
// * Serialized (by go-wire) and stored within the KVStore using the key retrieved
// from the ExamplePlugin.StateKey() function/
// * All fields must be exposed for serialization by external libs (here go-wire)
type ExamplePluginState struct {
Counter int
}
@ -25,9 +24,8 @@ type ExamplePluginState struct {
// * Stores transaction-specific plugin-customized information
// * This example contains a dummy field 'Valid' intended to specify
// if the transaction is a valid and should proceed
// * Used by go-wire as the encoding/decoding struct to pass transaction
// * All fields must be exposed (for go-wire)
// * Passed through txBytes in the RunTx func.
// * Deserialized (by go-wire) from txBytes in ExamplePlugin.RunTx
// * All fields must be exposed for serialization by external libs (here go-wire)
type ExamplePluginTx struct {
Valid bool
}
@ -42,10 +40,7 @@ type ExamplePlugin struct {
//-----------------------------------------
// Non-Mandatory Functions
// Return a new example plugin pointer with a hard-coded name. Within other
// plugin implementations may choose to include other initialization
// information to populate custom fields of your Plugin struct in this example
// named ExamplePlugin
// Return a new ExamplePlugin pointer with a hard-coded name
func NewExamplePlugin() *ExamplePlugin {
return &ExamplePlugin{
name: "example-plugin",
@ -81,13 +76,12 @@ func (ep *ExamplePlugin) SetOption(store types.KVStore, key string, value string
// Input fields:
// - store types.KVStore
// - This term provides read/write capabilities to the merkelized data store
// which is accessible cross-plugin
// which holds the basecoin state and is accessible to all plugins
// - ctx types.CallContext
// - The ctx contains the callers address, a pointer to the callers account,
// and an amount of coins sent with the transaction
// - txBytes []byte
// - Used to send customized information from the basecoin
// application to your plugin
// - Used to send customized information to your plugin
//
// Other more complex plugins may have a variant on the process order within this
// example including loading and saving multiple or variable states, or not