Как понять метод 'rlpHash' в core / types / block.go - PullRequest
0 голосов
/ 24 сентября 2018

код:

func rlpHash(x interface{}) (h common.Hash) {
    hw := sha3.NewKeccak256()
    rlp.Encode(hw, x)
    hw.Sum(h[:0])
    return h
}

Если полезно:

func (d *state) Sum(in []byte) []byte {
    dup := d.clone()
    hash := make([]byte, dup.outputLen)
    dup.Read(hash)
    return append(in, hash...)
}

Полный контекст кода см. здесь .

Как понять 'h'здесь?

Не следует ли сначала присвоить значение h?

' h [: 0] 'означает байт нулевого значения?

Что за "h"возвращено точно?

'hw.Sum (h [: 0])' имеет возвращаемое значение, только что проигнорировано?

Смущен ...

1 Ответ

0 голосов
/ 24 сентября 2018

Некоторые мысли ... надеюсь, это поможет:

h [: 0] -> создать пустой фрагмент из h ... но он все еще ссылается на тот же базовый массив.

Затем срез передается методу hw.Sum(h[:0]) Обратите внимание, что при передаче среза в метод целевой метод может изменить значение среза (поскольку срез является ссылочным типом, найдите relect.SliceHeader, чтобы узнать, почему)

Если вы посмотрите на метод Sum.Это на самом деле изменить значение среза h на строчку кода ниже:

return append(in, hash...)

Итак, оператор возврата выполняет 2 задания:

  1. Изменение содержимого срезаin (h в нашем случае)
  2. Вернуть срез h

Они используют именованный возврат h, поэтому для меня это немного усложняет коднемного трудно читать.

Кстати, приведенный ниже код проясняет, как работает срез (извините, если нет):

package main

import (
    "fmt"
)

func Sum(in []byte) []byte {
    return append(in, []byte{'a','b'}...)
}

func main() {
    h := [4]byte{}
    Sum(h[:0])
    fmt.Printf("%s\n", h) //should print 'ab'
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...