ethereum rpc 調(diào)用分析

以太坊以JSON RPC的方式提供API service弊仪。本文將從go-ethereum源碼中挖掘服務(wù)端如何提供JSON RPC 服務(wù)亭枷。

服務(wù)端啟動(dòng)rpc server

?  go-ethereum git:(master) ? tree -d -L 1
├── cmd
          ├── geth
                   ├── main.go
├── internal
          ├── ethapi
                   ├── api.go
├── node
├── rpc
...

go-ethereum的代碼很多劣挫,單從發(fā)起一筆轉(zhuǎn)賬這樣一個(gè)api而言,geth節(jié)點(diǎn)涉及的代碼相對(duì)簡(jiǎn)單。
首先,cmd/geth/main.go是整個(gè)geth節(jié)點(diǎn)的entrypoint蹦渣,main函數(shù)會(huì)實(shí)例化一個(gè)全功能的節(jié)點(diǎn):

func geth(ctx *cli.Context) error {
    node := makeFullNode(ctx)
    startNode(ctx, node)
    node.Wait()
    return nil
}

實(shí)例化之后,將調(diào)用node/node.go中的Start方法貌亭,來(lái)配置node相應(yīng)的服務(wù), 然后啟動(dòng)柬唯,等到所有的服務(wù)啟動(dòng)完成之后,節(jié)點(diǎn)開啟RPC服務(wù)圃庭,根據(jù)config將相應(yīng)的服務(wù)注冊(cè)到RPC服務(wù)的白名單中:

func (s *Server) RegisterName(name string, rcvr interface{}) error {
    ...
    methods, subscriptions := 
    suitableCallbacks(rcvrVal, svc.typ)
    ...
    svc.name = name
    svc.callbacks, svc.subscriptions = methods, subscriptions

上述方法將一個(gè)service中的可以rpc調(diào)用的method存儲(chǔ)到server的map中锄奢。
go-ethereum節(jié)點(diǎn)的rpc提供了四種能力的rpc失晴,以HTTP為例:

func (n *Node) startHTTP(endpoint string, apis []rpc.API, modules []string, cors []string) error {
    // Register all the APIs exposed by the services
    ...
    // All APIs registered, start the HTTP listener
    var (
        listener net.Listener
        err      error
    )
    if listener, err = net.Listen("tcp", endpoint); err != nil {
        return err
    }
    go rpc.NewHTTPServer(cors, handler).Serve(listener)
    ...
}

geth節(jié)點(diǎn)將監(jiān)聽端口,默認(rèn)是8545拘央,然后開啟HTTPServer涂屁,等待http rpc請(qǐng)求。

HTTP RPC 請(qǐng)求響應(yīng)流程

一個(gè)標(biāo)準(zhǔn)的HTTP RPC請(qǐng)求如下:

curl -H "Content-Type: application/json" -X POST --data \
'{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0xd46e8dd67c5d32be8d"],"id":1}' http://localhost:8545

需要jsonrpc, method, paramsid構(gòu)成request body堪滨。當(dāng)我們的geth節(jié)點(diǎn)的rpc server監(jiān)聽到新的request到來(lái)時(shí)胯陋,將會(huì):

  1. 實(shí)例化一個(gè)NewJSONCodec編碼器蕊温。
  2. 通過(guò)編碼器來(lái)將request轉(zhuǎn)換成jsonRequest袱箱,然后獲取service_name和service_method以及params。
  3. 通過(guò)service_name 和service_method义矛,可以找到當(dāng)時(shí)注冊(cè)的rpc服務(wù)发笔。
  4. 通過(guò)反射方式運(yùn)行rpc服務(wù)reply := req.callb.method.Func.Call(arguments),得到method的返回值
  5. 利用編碼器將返回值json序列化凉翻,然后返回codec.Write(response)

針對(duì)一個(gè)轉(zhuǎn)賬交易的話了讨,我們得知service_name 是eth,service_method是sendRawTransaction制轰,其方法在internal/api.go中前计。運(yùn)行reply := req.callb.method.Func.Call(arguments)之后我們得到的reply是一個(gè)common.Hash對(duì)象,然后通過(guò)json序列化我們得到的結(jié)果是TxnHash的字符串垃杖。

{
  "id":1,
  "jsonrpc": "2.0",
  "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末男杈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子调俘,更是在濱河造成了極大的恐慌伶棒,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彩库,死亡現(xiàn)場(chǎng)離奇詭異肤无,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)骇钦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門宛渐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人眯搭,你說(shuō)我怎么就攤上這事皇忿。” “怎么了坦仍?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵鳍烁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我繁扎,道長(zhǎng)幔荒,這世上最難降的妖魔是什么糊闽? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮爹梁,結(jié)果婚禮上右犹,老公的妹妹穿的比我還像新娘。我一直安慰自己姚垃,他們只是感情好念链,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著积糯,像睡著了一般掂墓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上看成,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天君编,我揣著相機(jī)與錄音,去河邊找鬼川慌。 笑死吃嘿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的梦重。 我是一名探鬼主播兑燥,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼琴拧!你這毒婦竟也來(lái)了降瞳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤艾蓝,失蹤者是張志新(化名)和其女友劉穎力崇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赢织,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亮靴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了于置。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茧吊。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖八毯,靈堂內(nèi)的尸體忽然破棺而出搓侄,到底是詐尸還是另有隱情,我是刑警寧澤话速,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布讶踪,位于F島的核電站,受9級(jí)特大地震影響泊交,放射性物質(zhì)發(fā)生泄漏乳讥。R本人自食惡果不足惜柱查,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望云石。 院中可真熱鬧唉工,春花似錦、人聲如沸汹忠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宽菜。三九已至谣膳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赋焕,已是汗流浹背参歹。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工仰楚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留隆判,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓僧界,卻偏偏與公主長(zhǎng)得像侨嘀,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捂襟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理咬腕,服務(wù)發(fā)現(xiàn),斷路器葬荷,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • 本文是對(duì)以太坊文檔 Ethereum Frontier Guide 和 Ethereum Homestead 的整...
    趁風(fēng)卷閱讀 9,516評(píng)論 0 16
  • json-rpc 是 rpc 通信過(guò)程中定義的一套 json 格式標(biāo)準(zhǔn)涨共,最早是 json-rpc1.0,最新是 j...
    juniway閱讀 4,802評(píng)論 0 2
  • 概述 我們現(xiàn)在所處的生產(chǎn)環(huán)境是一個(gè)集Nodejs, Go, Java, Ruby, Scala等多種語(yǔ)言程序的混合...
    Kungfu貓熊閱讀 6,238評(píng)論 2 49
  • 那時(shí)候宠漩, 像素不高举反, 總好過(guò)現(xiàn)在一把青蒿, 秋風(fēng)瀟瀟扒吁, 青山依舊飄渺火鼻, 時(shí)過(guò)境遷,人易老雕崩, 待到靈魂覺(jué)曉魁索, 是否更...
    竹帛攻玉閱讀 139評(píng)論 0 0