如何理解';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
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'
}