github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/core/vm/contract.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  //版权所有2015 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  )
    32  
    33  //contractRef是对合同支持对象的引用
    34  type ContractRef interface {
    35  	Address() common.Address
    36  }
    37  
    38  //accountRef执行contractRef。
    39  //
    40  //在EVM初始化和
    41  //它的主要用途是获取地址。删除此对象
    42  //由于缓存的跳转目的地
    43  //从父合同(即调用者)中提取,其中
    44  //是ContractRef。
    45  type AccountRef common.Address
    46  
    47  //地址将accountRef强制转换为地址
    48  func (ar AccountRef) Address() common.Address { return (common.Address)(ar) }
    49  
    50  //契约表示状态数据库中的以太坊契约。它包含
    51  //合同代码,调用参数。合同执行合同参考号
    52  type Contract struct {
    53  //CallerAddress是调用方初始化此项的结果
    54  //合同。但是,当“调用方法”被委托时,这个值
    55  //需要初始化为调用方的调用方的调用方。
    56  	CallerAddress common.Address
    57  	caller        ContractRef
    58  	self          ContractRef
    59  
    60  jumpdests destinations //JumpDest分析结果。
    61  
    62  	Code     []byte
    63  	CodeHash common.Hash
    64  	CodeAddr *common.Address
    65  	Input    []byte
    66  
    67  	Gas   uint64
    68  	value *big.Int
    69  
    70  	Args []byte
    71  
    72  	DelegateCall bool
    73  }
    74  
    75  //NewContract返回执行EVM的新合同环境。
    76  func NewContract(caller ContractRef, object ContractRef, value *big.Int, gas uint64) *Contract {
    77  	c := &Contract{CallerAddress: caller.Address(), caller: caller, self: object, Args: nil}
    78  
    79  	if parent, ok := caller.(*Contract); ok {
    80  //如果可用,请重新使用父上下文中的JumpDest分析。
    81  		c.jumpdests = parent.jumpdests
    82  	} else {
    83  		c.jumpdests = make(destinations)
    84  	}
    85  
    86  //气体应该是一个指针,这样可以在运行过程中安全地减少气体。
    87  //此指针将关闭状态转换
    88  	c.Gas = gas
    89  //确保设置了值
    90  	c.value = value
    91  
    92  	return c
    93  }
    94  
    95  //asdelegate将协定设置为委托调用并返回当前
    96  //合同(用于链接呼叫)
    97  func (c *Contract) AsDelegate() *Contract {
    98  	c.DelegateCall = true
    99  //注:呼叫者必须始终是合同。这不应该发生
   100  //打电话的不是合同。
   101  	parent := c.caller.(*Contract)
   102  	c.CallerAddress = parent.CallerAddress
   103  	c.value = parent.value
   104  
   105  	return c
   106  }
   107  
   108  //getop返回契约字节数组中的第n个元素
   109  func (c *Contract) GetOp(n uint64) OpCode {
   110  	return OpCode(c.GetByte(n))
   111  }
   112  
   113  //GetByte返回协定字节数组中的第n个字节
   114  func (c *Contract) GetByte(n uint64) byte {
   115  	if n < uint64(len(c.Code)) {
   116  		return c.Code[n]
   117  	}
   118  
   119  	return 0
   120  }
   121  
   122  //调用者返回合同的调用者。
   123  //
   124  //当协定是委托时,调用方将递归调用调用方
   125  //呼叫,包括呼叫者的呼叫。
   126  func (c *Contract) Caller() common.Address {
   127  	return c.CallerAddress
   128  }
   129  
   130  //use gas尝试使用气体并减去它,成功后返回true。
   131  func (c *Contract) UseGas(gas uint64) (ok bool) {
   132  	if c.Gas < gas {
   133  		return false
   134  	}
   135  	c.Gas -= gas
   136  	return true
   137  }
   138  
   139  //地址返回合同地址
   140  func (c *Contract) Address() common.Address {
   141  	return c.self.Address()
   142  }
   143  
   144  //value返回合同值(从调用方发送给它)
   145  func (c *Contract) Value() *big.Int {
   146  	return c.value
   147  }
   148  
   149  //setcode将代码设置为合同
   150  func (c *Contract) SetCode(hash common.Hash, code []byte) {
   151  	c.Code = code
   152  	c.CodeHash = hash
   153  }
   154  
   155  //setcallcode设置合同的代码和支持数据的地址
   156  //对象
   157  func (c *Contract) SetCallCode(addr *common.Address, hash common.Hash, code []byte) {
   158  	c.Code = code
   159  	c.CodeHash = hash
   160  	c.CodeAddr = addr
   161  }