mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-24 13:46:43 +00:00
docs: init ethereum api v2
This commit is contained in:
parent
8b865fa9bf
commit
9f6dba812e
1 changed files with 138 additions and 0 deletions
138
docs/ethereum_api_v2.md
Normal file
138
docs/ethereum_api_v2.md
Normal file
|
|
@ -0,0 +1,138 @@
|
||||||
|
The current design for setting up a node is non-trivial and requires you to
|
||||||
|
write a lot of custom startup code (e.g. setting up node configuration, gas,
|
||||||
|
verbosity, port, etc). I suggest that we allow custom configuration but set any
|
||||||
|
default value to those that aren't set (e.g. data dir, name, networking, keys).
|
||||||
|
|
||||||
|
I suggest we also split out the RPC, IPC and Whisper from the `eth.Backend`
|
||||||
|
interface and move those secondary interface and startup code to a `eth/utility`
|
||||||
|
package which can handle most of the domain specific code.
|
||||||
|
|
||||||
|
The node should also contain a `Com`munication interface that, depending on the
|
||||||
|
node type (i.e. full, light), returns a type allowing you to communicate and
|
||||||
|
interface with the ethereum network and allows you to filter for specific
|
||||||
|
ethereum related events (i.e. block, log).
|
||||||
|
|
||||||
|
Currently the `eth.Ethereum` is responsibly for just about anything, managing
|
||||||
|
keys, managing whisper, starting stopping filtering system, etc. Most of this
|
||||||
|
logic should instead by moved to the binary implementing the client. For example
|
||||||
|
the `KeyManager` shouldn't be managed by the `Ethereum` node but instead should
|
||||||
|
be managed by the client code. There needs to be a clear separation between
|
||||||
|
**client** and **node**.
|
||||||
|
|
||||||
|
### Node
|
||||||
|
|
||||||
|
A `Node` is responsible for allowing access to the ethereum state and management
|
||||||
|
thereof, setting up the P2P stack (arguable) and allowing direct access to the
|
||||||
|
the higher level `Com` object while keeping its integrity and allow direct
|
||||||
|
access to the lower level APIs of the node.
|
||||||
|
|
||||||
|
It can be argued that the P2P extensions (e.g. Ethereum, Whisper) should not be
|
||||||
|
integrated directly in to the node but instead should be offered to the node as
|
||||||
|
service.
|
||||||
|
|
||||||
|
### Client
|
||||||
|
|
||||||
|
A `Client` is what wraps up the node, offers several services to the `Node` and
|
||||||
|
possibly allows some level of interaction with the system. An example of a cient
|
||||||
|
would be `geth`. While the node offers little flexibility in terms of signing
|
||||||
|
transactions, allowing user confirmations and accesses to the Ethereum internal
|
||||||
|
state due to lack of interfacing, the client should fill that gap by tying the
|
||||||
|
several systems together and providing the user the need and tools. Managing the
|
||||||
|
user's keys, setting up a REPS and confirmation dialogs are all examples of
|
||||||
|
tasks the client should be managing.
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
I'll continue to update this issue and in the meantime I recommend anyone to
|
||||||
|
comment on this issue with ideas and suggestions.
|
||||||
|
|
||||||
|
#### Example
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math/big"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
|
"github.com/ethereum/go-ethereum/core/vm"
|
||||||
|
"github.com/ethereum/go-ethereum/eth"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// setup ethereum. the rest of the defaults will be picked for us
|
||||||
|
// (port, host, ipc, etc). Second argument is the type of node; full/light
|
||||||
|
node, err := eth.New(eth.Config{
|
||||||
|
Name: "My ethereum node",
|
||||||
|
Datadir: "/tmp/001",
|
||||||
|
}, eth.Light)
|
||||||
|
if err != nil {
|
||||||
|
logger.Fatalln(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// communication interface. `com` is an interface and depends on the
|
||||||
|
// node type given to `eth.New`. `com` is the basic state accessor
|
||||||
|
com := node.Com()
|
||||||
|
// state interfacing
|
||||||
|
com.GetBalance(common.Address{})
|
||||||
|
com.SetBalance(common.Address{}, big.NewInt(1))
|
||||||
|
com.SetAccountStorage(common.Address{}, common.Hash{}, common.Hash{})
|
||||||
|
// and allow filtering
|
||||||
|
id := com.Filters().AddLogFilter(filters.Log{FromBlock: 0, ToBlock: -1}, func(logs vm.Logs) {
|
||||||
|
fmt.Println("get log event")
|
||||||
|
})
|
||||||
|
id = com.Filters().AddBlockFilter(filters.BlockAny|filters.BlockFork, func(typ filter.BlockEvent, block *types.Block) {
|
||||||
|
fmt.Println("block event:", typ)
|
||||||
|
})
|
||||||
|
// send transactions
|
||||||
|
tx := types.NewTransaction(common.Address{/* to */, big.NewInt(1), big.NewInt(1), []byte{1,2,3})
|
||||||
|
tx = tx.WithSignECDSA(privateKey)
|
||||||
|
node.TxPool().SubmitTransaction(tx)
|
||||||
|
|
||||||
|
// setup service
|
||||||
|
// HTTP RPC
|
||||||
|
http, err := util.StartRPC(com, remote.Http{":0"})
|
||||||
|
if err != nil {
|
||||||
|
logger.Fatalln(err)
|
||||||
|
}
|
||||||
|
rpc.EnableAPIs(remote.APIs{remote.Web3})
|
||||||
|
// IPC RPC
|
||||||
|
ipc, err := util.StartRPC(com, remote.Ipc{"/path/to"})
|
||||||
|
if err != nil {
|
||||||
|
logger.Fatalln(err)
|
||||||
|
}
|
||||||
|
ipc.EnableAPIs(remote.APIs{remote.Web3, remote.Admin, remote.Personal})
|
||||||
|
|
||||||
|
// start up whisper
|
||||||
|
whisper, err := util.StartWhisper(node.Net())
|
||||||
|
if err != nil {
|
||||||
|
logger.Fatalln(err)
|
||||||
|
}
|
||||||
|
whisper.Post("stuff")
|
||||||
|
|
||||||
|
swarm, err := util.StartSwarm(com, ipfs.Provider())
|
||||||
|
if err != nil {
|
||||||
|
logger.Fatalln(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
in, err := os.Open("/path/to/source")
|
||||||
|
if err != nil {
|
||||||
|
logger.Fatalln(err)
|
||||||
|
}
|
||||||
|
defer in.Close()
|
||||||
|
|
||||||
|
hash, size := swarm.Copy(swarm, in)
|
||||||
|
|
||||||
|
// get default eventer
|
||||||
|
eventer := node.DefaultEventer()
|
||||||
|
eventer.Post(struct{ T string }{"my async event"})
|
||||||
|
eventer.PostSync(struct{ T string }{"my sync event"})
|
||||||
|
|
||||||
|
// let eth handle shutdowns
|
||||||
|
eth.WaitForShutdown()
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
Loading…
Reference in a new issue