查看: 1080|回复: 0

[Java语言] 兄弟连Go语言+区块链培训以太坊源码分析(17)Internal包简介

发表于 2018-7-13 16:56:42
  兄弟连兄弟连Go语言+区块链培训学院院长尹成资深区块链技术专家:毕业于清华大学,曾担任Google算法工程师,微软区块链领域全球最具价值专家,微软Tech.Ed大会金牌讲师。精通C/C++PythonGo语言、Sicikit-LearnTensorFlow。拥有15年编程经验与5年的教学经验,资深软件架构师,Intel软件技术专家,著名技术专家,具备多年的世界顶尖IT公司微软谷歌的工作经验。具备多年的软件编程经验与讲师授课经历,并在人机交互、教育、信息安全、广告、区块链系统开发诸多产品。具备深厚的项目管理经验以及研发经验,拥有两项人工智能发明专利,与开发电子货币部署到微软WindowsAzure的实战经验。教学讲解深入浅出,使学员能够做到学以致用。
## Internal包简介

Internal包主要是封装了js的命令行界面,并且包含了命令行所调用的api信息。


## ethapi/api包分析
ethapi/api包主要是进入js的命令行界面后,输入的命令实现部分。<br>
js的命令实现在ethapi/api和node/api中。目前一共有三种api的命令。<br>
(1)第一种是admin相关的命令,这个是通过安全的RPC通道实现的。其结构体为PrivateAdminAPI<br>
```
// PrivateAdminAPI is the collection of administrative API methods exposed only
// over a secure RPC channel.
type PrivateAdminAPI struct {
    node *Node // Node interfaced by this API
}
```
(2)第二种是personal相关的命令,主要是负责账户管理相关命令,可以lock和unlock账户。其结构体为PrivateAccountAPI<br>
```
// PrivateAccountAPI provides an API to access accounts managed by this node.
// It offers methods to create, (un)lock en list accounts. Some methods accept
// passwords and are therefore considered private by default.
type PrivateAccountAPI struct {
    am *accounts.Manager
    nonceLock *AddrLocker
    b Backend
}
```
(3)第三种是eth相关的命令,主要是可以操作区块上的相关命令。其结构体为PublicBlockChainAPI<br>
```
// PublicBlockChainAPI provides an API to access the Ethereum blockchain.
// It offers only methods that operate on public data that is freely available to anyone.
type PublicBlockChainAPI struct {
    b Backend
}
```



## otto包
以太坊的命令是通过在js虚拟机上来实现命令的。而在go语言中,有第三方的otto包,可以直接在go语言中实现js命令。而以太坊代码则使用了otto包来实现搭建js命令。<br>
在otto包中,set方法是设置变量的值,get方法是获取变量的值。
```
// Set the property of the given name to the given value.
func (self Object) Set(name string, value interface{})
// Get the value of the property with the given name.
func (self Object) Get(name string) (Value, error)
```
Compile是根据输入的路径对js的代码进行编译,返回变量的值。
```
// Compile will parse the given source and return a Script value or nil and
// an error if there was a problem during compilation.
func (self *Otto) Compile(filename string, src interface{}) (*Script, error)
```
Run方法会运行相关的js代码,如果有返回值的话会返回。
```
// Run will run the given source (parsing it first if necessary), returning the resulting value and error (if any)
func (self Otto) Run(src interface{}) (Value, error)
```
## 如何编写自己的以太坊命令
接上篇ethapi.api-analysis分析,如果我们需要在相关模块添加相关命令,首先我们需要找到相关命令所对应的api结构体。<br>
各个命令对应的结构体,包的位置如下:
```
     admin  PrivateAdminAPI,PublicAdminAPI  node/api
     debug  PrivateDebugAPI eth/api
     eth    PublicBlockChainAPI ethapi/api
     miner  PrivateMinerAPI eth/api
     net    PublicNetAPI    ethapi/api
     personal   PrivateAccountAPI   ethapi/api
     txpool PublicTxPoolAPI ethapi/api
     rpc    所有可调用包集合
     web3   所有命令集合
```
假设我们需要在personal包中添加一个命令,那么我们就在PrivateAccountAPI中添加一个方法:
```
func (s *PrivateAccountAPI) TestMethod() {
fmt.Print("TestMethod")
}
```
接下来到internal/web3ext/web3ext.go中,找到personal命令集合,然后添加一条自己的命令:
```
const Personal_JS = `
web3._extend(
methods: [
        new web3._extend.Method({
            name : 'testMethod',
            call : 'personal_testMethod'
        }), //our method
...
```
最后到internal/jsre/deps/web3.js中,找到personal方法的定义:
```
function Personal(web3) {
this._requestManager = web3._requestManager;

var self = this;

methods().forEach(function(method) {
method.attachToObject(self);
method.setRequestManager(self._requestManager);
});

properties().forEach(function(p) {
p.attachToObject(self);
p.setRequestManager(self._requestManager);
});
}
var methods = function () {
...
```
然后再methods中添加你定义的方法名:
```
var methods = function () {
var testMethod = new Method({
name : 'testMethod',
call : 'personal_testMethod'
});
...
```
并在最后的return中添加你的方法:
```
return [
newAccount,
testMethod, //our method
importRawKey,
unlockAccount,
ecRecover,
sign,
sendTransaction,
lockAccount
];
```
这之后在启动命令行,我们就可以调用我们的方法了。结果如下:
```
> personal.testMethod()

TestMethodnull

``` 
  比特币没赶上?以太币没有买?你错过了成为了百万富翁的梦但是不要错失成为创造者的机会!!!77日起每晚8-9点半兄弟连区块链学院正式开课:http://www.ydma.cn/open/course/16【清华学霸携全球区块链大赛冠军团队】带你实战区块链开发!!!



回复

使用道具 举报