如何理解';rlpHash';core/types/block.go中的方法

如何理解';rlpHash';core/types/block.go中的方法,go,ethereum,Go,Ethereum,守则: 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

守则:

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])”有一个返回值,只是被忽略了


困惑…

一些想法…希望能有所帮助:

h[:0]->从
h
…创建一个空片,但它仍然引用相同的底层数组

然后将切片传递给方法
hw.Sum(h[:0])
请注意,当您将切片传递给方法时,目标方法可以更改切片的值(因为切片是引用类型,请搜索relct.SliceHeader以了解原因)

如果你看一下Sum方法。它实际上是通过下面的代码行更改切片
h
的值:

return append(in, hash...)
因此,return语句执行两项任务:

  • 在中更改切片的内容(
    h
  • 返回切片
    h
  • 他们使用名为return
    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'
    }