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 }