eth_submitWork時的問題

在向以太坊節(jié)點(diǎn)調(diào)用eth_submitWork時视哑,偶爾會返回false

查看geth的日志险领,可以發(fā)現(xiàn)false 的原因是:"Work submitted but none pending"褐缠, 那這個又是指什么呢

在go-ethereum的源碼中找到報錯的位置

//miner/remote_agent.go
// SubmitWork tries to inject a pow solution into the remote agent, returning
// whether the solution was accepted or not (not can be both a bad pow as well as
// any other error, like no work pending).
func (a *RemoteAgent) SubmitWork(nonce types.BlockNonce, mixDigest, hash common.Hash) bool {
    a.mu.Lock()
    defer a.mu.Unlock()

    // Make sure the work submitted is present
    work := a.work[hash]
    if work == nil {
        log.Info("Work submitted but none pending", "hash", hash)
        return false
    }
    // Make sure the Engine solutions is indeed valid
    result := work.Block.Header()
    result.Nonce = nonce
    result.MixDigest = mixDigest

    if err := a.engine.VerifySeal(a.chain, result); err != nil {
        log.Warn("Invalid proof-of-work submitted", "hash", hash, "err", err)
        return false
    }
    block := work.Block.WithSeal(result)

    // Solutions seems to be valid, return to the miner and notify acceptance
    a.returnCh <- &Result{work, block}
    delete(a.work, hash)

    return true
}

1.可以看到節(jié)點(diǎn)將任務(wù)保存在RemoteAgent.work
2.任務(wù)以hash_nononce為索引
3.提交任務(wù)時先驗(yàn)證該任務(wù)是否存在

錯誤的原因是提交的任務(wù)在RemoteAgent.work已經(jīng)找不到

那么問題來了
1.任務(wù)什么時候生成
2.任務(wù)為什么會被刪掉

任務(wù)生成的代碼

//miner/remote_agent.go
func (a *RemoteAgent) GetWork() ([3]string, error) {
    a.mu.Lock()
    defer a.mu.Unlock()

    var res [3]string

    if a.currentWork != nil {
        block := a.currentWork.Block

        res[0] = block.HashNoNonce().Hex()
        seedHash := ethash.SeedHash(block.NumberU64())
        res[1] = common.BytesToHash(seedHash).Hex()
        // Calculate the "target" to be returned to the external miner
        n := big.NewInt(1)
        n.Lsh(n, 255)
        n.Div(n, block.Difficulty())
        n.Lsh(n, 1)
        res[2] = common.BytesToHash(n.Bytes()).Hex()
######
任務(wù)在getwork時候才會保存到RemoteAgent.work中
######
        a.work[block.HashNoNonce()] = a.currentWork
        return res, nil
    }
    return res, errors.New("No work available yet, don't panic.")
}

刪除任務(wù)的代碼

//miner/remote_agent.go
// loop monitors mining events on the work and quit channels, updating the internal
// state of the remote miner until a termination is requested.
//
// Note, the reason the work and quit channels are passed as parameters is because
// RemoteAgent.Start() constantly recreates these channels, so the loop code cannot
// assume data stability in these member fields.
func (a *RemoteAgent) loop(workCh chan *Work, quitCh chan struct{}) {
    ticker := time.NewTicker(5 * time.Second)
    defer ticker.Stop()

    for {
        select {
        case <-quitCh:
            return
        case work := <-workCh:
            a.mu.Lock()
            a.currentWork = work
            a.mu.Unlock()
        case <-ticker.C:
            // cleanup
            a.mu.Lock()
            for hash, work := range a.work {
#######
當(dāng)任務(wù)生成時間超過84s后 任務(wù)將會被刪除
#######
                if time.Since(work.createdAt) > 7*(12*time.Second) {
                    delete(a.work, hash)
                }
            }
            a.mu.Unlock()

            a.hashrateMu.Lock()
            for id, hashrate := range a.hashrate {
                if time.Since(hashrate.ping) > 10*time.Second {
                    delete(a.hashrate, id)
                }
            }
            a.hashrateMu.Unlock()
        }
    }
}

結(jié)論:

  • 任務(wù)只會在getWork時才會生成
  • 任務(wù)在生成84s后刪除,需要重新調(diào)用getwork
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末草穆,一起剝皮案震驚了整個濱河市戚揭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌儒搭,老刑警劉巖吠架,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異搂鲫,居然都是意外死亡傍药,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門魂仍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拐辽,“玉大人,你說我怎么就攤上這事擦酌【阒睿” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵赊舶,是天一觀的道長睁搭。 經(jīng)常有香客問我,道長锯岖,這世上最難降的妖魔是什么介袜? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮出吹,結(jié)果婚禮上遇伞,老公的妹妹穿的比我還像新娘。我一直安慰自己捶牢,他們只是感情好鸠珠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布巍耗。 她就那樣靜靜地躺著,像睡著了一般渐排。 火紅的嫁衣襯著肌膚如雪炬太。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天驯耻,我揣著相機(jī)與錄音亲族,去河邊找鬼。 笑死可缚,一個胖子當(dāng)著我的面吹牛霎迫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帘靡,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼知给,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了描姚?” 一聲冷哼從身側(cè)響起涩赢,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎轩勘,沒想到半個月后筒扒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赃阀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年霎肯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榛斯。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡观游,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出驮俗,到底是詐尸還是另有隱情懂缕,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布王凑,位于F島的核電站搪柑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏索烹。R本人自食惡果不足惜工碾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望百姓。 院中可真熱鬧渊额,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奔垦,卻和暖如春屹耐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背椿猎。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工惶岭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人犯眠。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓俗他,卻偏偏與公主長得像,于是被迫代替她去往敵國和親阔逼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

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

  • 本文是對以太坊文檔 Ethereum Frontier Guide 和 Ethereum Homestead 的整...
    趁風(fēng)卷閱讀 9,499評論 0 16
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理地沮,服務(wù)發(fā)現(xiàn)嗜浮,斷路器,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • 金指尖的花園閱讀 114評論 0 3
  • 1.我為什么想讀這本書 摩疑? 最早之前看過古典老師的《拆掉思維的墻》一書危融,對于《躍遷》這本書我也特別感興趣,光是躍遷...
    美少女曉露閱讀 140評論 0 5
  • 這個夏天雷袋,雖進(jìn)入了五月底吉殃,但還是熱烈不起來,經(jīng)常大雨滂沱或細(xì)雨彌漫楷怒,總讓人覺得還是涼涼的蛋勺。加上一要好同事生病告假住...
    回首己陌路閱讀 194評論 0 2