github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/core/vm/common.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 //版权所有2014 Go Ethereum作者 10 //此文件是Go以太坊库的一部分。 11 // 12 //Go-Ethereum库是免费软件:您可以重新分发它和/或修改 13 //根据GNU发布的较低通用公共许可证的条款 14 //自由软件基金会,或者许可证的第3版,或者 15 //(由您选择)任何更高版本。 16 // 17 //Go以太坊图书馆的发行目的是希望它会有用, 18 //但没有任何保证;甚至没有 19 //适销性或特定用途的适用性。见 20 //GNU较低的通用公共许可证,了解更多详细信息。 21 // 22 //你应该收到一份GNU较低级别的公共许可证副本 23 //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。 24 25 package vm 26 27 import ( 28 "math/big" 29 30 "github.com/ethereum/go-ethereum/common" 31 "github.com/ethereum/go-ethereum/common/math" 32 ) 33 34 //计算步骤所需的内存大小 35 func calcMemSize(off, l *big.Int) *big.Int { 36 if l.Sign() == 0 { 37 return common.Big0 38 } 39 40 return new(big.Int).Add(off, l) 41 } 42 43 //GetData根据起始点、大小和焊盘从数据返回一个切片。 44 //最大大小为零。此函数是溢出安全的。 45 func getData(data []byte, start uint64, size uint64) []byte { 46 length := uint64(len(data)) 47 if start > length { 48 start = length 49 } 50 end := start + size 51 if end > length { 52 end = length 53 } 54 return common.RightPadBytes(data[start:end], int(size)) 55 } 56 57 //GetDataBig根据开始、大小和焊盘从数据返回一个切片 58 //最大大小为零。此函数是溢出安全的。 59 func getDataBig(data []byte, start *big.Int, size *big.Int) []byte { 60 dlen := big.NewInt(int64(len(data))) 61 62 s := math.BigMin(start, dlen) 63 e := math.BigMin(new(big.Int).Add(s, size), dlen) 64 return common.RightPadBytes(data[s.Uint64():e.Uint64()], int(size.Uint64())) 65 } 66 67 //bigunt64返回强制转换为uint64的整数,并返回它是否 68 //过程中溢出。 69 func bigUint64(v *big.Int) (uint64, bool) { 70 return v.Uint64(), v.BitLen() > 64 71 } 72 73 //TowordSize返回内存扩展所需的接收字大小。 74 func toWordSize(size uint64) uint64 { 75 if size > math.MaxUint64-31 { 76 return math.MaxUint64/32 + 1 77 } 78 79 return (size + 31) / 32 80 } 81 82 func allZero(b []byte) bool { 83 for _, byte := range b { 84 if byte != 0 { 85 return false 86 } 87 } 88 return true 89 }