commit
772e723e8e
45 changed files with 5313 additions and 324 deletions
105
docs/compiler.md
105
docs/compiler.md
|
@ -472,10 +472,113 @@ and structures. Notice that structured types returned by methods can't be Null
|
|||
at the moment (see #2795).
|
||||
|
||||
```
|
||||
$ ./bin/neo-go contract compile -i contract.go --config contract.yml -o contract.nef --manifest manifest.json --bindings contract.bindings.yml
|
||||
$ ./bin/neo-go contract compile -i contract.go --config contract.yml -o contract.nef --manifest manifest.json --bindings contract.bindings.yml --guess-eventtypes
|
||||
$ ./bin/neo-go contract generate-rpcwrapper --manifest manifest.json --config contract.bindings.yml --out rpcwrapper.go --hash 0x1b4357bff5a01bdf2a6581247cf9ed1e24629176
|
||||
```
|
||||
|
||||
Contract-specific RPC-bindings generated by "generate-rpcwrapper" command include
|
||||
structure wrappers for each event declared in the contract manifest as far as the
|
||||
set of helpers that allow to retrieve emitted event from the application log or
|
||||
from stackitem. By default, event wrappers builder use event structure that was
|
||||
described in the manifest. Since the type data available in the manifest is
|
||||
limited, in some cases the resulting generated event structure may use generic
|
||||
go types. Go contracts can make use of additional type data from bindings
|
||||
configuration file generated during compilation. Like for any other contract
|
||||
types, this can cover arrays, maps and structures. To reach the maximum
|
||||
resemblance between the emitted events and the generated event wrappers, we
|
||||
recommend either to fill in the extended events type information in the contract
|
||||
configuration file before the compilation or to use `--guess-eventtypes`
|
||||
compilation option.
|
||||
|
||||
If using `--guess-eventtypes` compilation option, event parameter types will be
|
||||
guessed from the arguments of `runtime.Notify` calls for each emitted event. If
|
||||
multiple calls of `runtime.Notify` are found, then argument types will be checked
|
||||
for matching (guessed types must be the same across the particular event usages).
|
||||
After that, the extended types binding configuration will be generated according
|
||||
to the emitted events parameter types. `--guess-eventtypes` compilation option
|
||||
is able to recognize those events that has a constant name known at a compilation
|
||||
time and do not include variadic arguments usage. Thus, use this option if your
|
||||
contract suites these requirements. Otherwise, we recommend to manually specify
|
||||
extended event parameter types information in the contract configuration file.
|
||||
|
||||
Extended event parameter type information can be provided manually via contract
|
||||
configuration file under the `events` section. Each event parameter specified in
|
||||
this section may be supplied with additional parameter type information specified
|
||||
under `extendedtype` subsection. The extended type information (`ExtendedType`)
|
||||
has the following structure:
|
||||
|
||||
| Field | Type | Required | Meaning |
|
||||
|-------------|---------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| `base` | Any valid [NEP-14 parameter type](https://github.com/neo-project/proposals/blob/master/nep-14.mediawiki#parametertype) except `Void`. | Always required. | The base type of a parameter, e.g. `Array` for go structures and any nested arrays, `Map` for nested maps, `Hash160` for 160-bits integers, etc. |
|
||||
| `name` | `string` | Required for structures, omitted for arrays, interfaces and maps. | Name of a structure that will be used in the resulting RPC binding. |
|
||||
| `interface` | `string` | Required for `InteropInterface`-based types, currently `iterator` only is supported. | Underlying value of the `InteropInterface`. |
|
||||
| `key` | Any simple [NEP-14 parameter type](https://github.com/neo-project/proposals/blob/master/nep-14.mediawiki#parametertype). | Required for `Map`-based types. | Key type for maps. |
|
||||
| `value` | `ExtendedType`. | Required for iterators, arrays and maps. | Value type of iterators, arrays and maps. |
|
||||
| `fields` | Array of `FieldExtendedType`. | Required for structures. | Ordered type data for structure fields. |
|
||||
|
||||
The structure's field extended information (`FieldExtendedType`) has the following structure:
|
||||
|
||||
| Field | Type | Required | Meaning |
|
||||
|------------------------|----------------|------------------|-----------------------------------------------------------------------------|
|
||||
| `field` | `string` | Always required. | Name of the structure field that will be used in the resulting RPC binding. |
|
||||
| Inlined `ExtendedType` | `ExtendedType` | Always required. | The extended type information about structure field. |
|
||||
|
||||
|
||||
Any named structures used in the `ExtendedType` description must be manually
|
||||
specified in the contract configuration file under top-level `namedtypes` section
|
||||
in the form of `map[string]ExtendedType`, where the map key is a name of the
|
||||
described named structure that matches the one provided in the `name` field of
|
||||
the event parameter's extended type.
|
||||
|
||||
Here's the example of manually-created contract configuration file that uses
|
||||
extended types for event parameters description:
|
||||
|
||||
```
|
||||
name: "HelloWorld contract"
|
||||
supportedstandards: []
|
||||
events:
|
||||
- name: Some simple notification
|
||||
parameters:
|
||||
- name: intP
|
||||
type: Integer
|
||||
- name: boolP
|
||||
type: Boolean
|
||||
- name: stringP
|
||||
type: String
|
||||
- name: Structure notification
|
||||
parameters:
|
||||
- name: structure parameter
|
||||
type: Array
|
||||
extendedtype:
|
||||
base: Array
|
||||
name: transferData
|
||||
- name: Map of structures notification
|
||||
parameters:
|
||||
- name: map parameter
|
||||
type: Map
|
||||
extendedtype:
|
||||
base: Map
|
||||
key: Integer
|
||||
value:
|
||||
base: Array
|
||||
name: transferData
|
||||
- name: Iterator notification
|
||||
parameters:
|
||||
- name: data
|
||||
type: InteropInterface
|
||||
extendedtype:
|
||||
base: InteropInterface
|
||||
interface: iterator
|
||||
namedtypes:
|
||||
transferData:
|
||||
base: Array
|
||||
fields:
|
||||
- field: IntField
|
||||
base: Integer
|
||||
- field: BoolField
|
||||
base: Boolean
|
||||
```
|
||||
|
||||
## Smart contract examples
|
||||
|
||||
Some examples are provided in the [examples directory](../examples). For more
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue