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  }