Skip to content

Commit

Permalink
Merge 3a809a8 into 56b92f8
Browse files Browse the repository at this point in the history
  • Loading branch information
JacobDenver007 committed Apr 25, 2019
2 parents 56b92f8 + 3a809a8 commit 633d904
Showing 1 changed file with 82 additions and 116 deletions.
198 changes: 82 additions & 116 deletions processor/vm/vm.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,68 @@ func (evm *EVM) Cancel() {
atomic.StoreInt32(&evm.abort, 1)
}

func (evm *EVM) distributeContractGas(runGas uint64, contractName common.Name, callerName common.Name) {
if runGas > 0 && len(contractName.String()) > 0 {
contratFounderRatio := evm.chainConfig.ChargeCfg.ContractRatio

if _, ok := evm.FounderGasMap[contractName]; !ok {
dGas := DistributeGas{int64(runGas * contratFounderRatio / 100), ContractGas}
evm.FounderGasMap[contractName] = dGas
} else {
dGas := DistributeGas{int64(runGas * contratFounderRatio / 100), ContractGas}
dGas.Value = evm.FounderGasMap[contractName].Value + dGas.Value
evm.FounderGasMap[contractName] = dGas
}
if evm.depth != 0 {
if _, ok := evm.FounderGasMap[callerName]; !ok {
dGas := DistributeGas{-int64(runGas * contratFounderRatio / 100), ContractGas}
evm.FounderGasMap[callerName] = dGas
} else {
dGas := DistributeGas{-int64(runGas * contratFounderRatio / 100), ContractGas}
dGas.Value = evm.FounderGasMap[callerName].Value + dGas.Value
evm.FounderGasMap[callerName] = dGas
}
}
}
}

func (evm *EVM) distributeAssetGas(callValueGas int64, assetName common.Name, callerName common.Name) {
if evm.depth != 0 {
assetFounderRatio := evm.chainConfig.ChargeCfg.AssetRatio //get asset founder charge ratio

if len(assetName.String()) > 0 {
if _, ok := evm.FounderGasMap[assetName]; !ok {
dGas := DistributeGas{int64(callValueGas * int64(assetFounderRatio) / 100), AssetGas}
evm.FounderGasMap[assetName] = dGas
} else {
dGas := DistributeGas{int64(callValueGas * int64(assetFounderRatio) / 100), AssetGas}
dGas.Value = evm.FounderGasMap[assetName].Value + dGas.Value
evm.FounderGasMap[assetName] = dGas
}
}
if len(callerName.String()) > 0 {
if _, ok := evm.FounderGasMap[callerName]; !ok {
dGas := DistributeGas{-int64(callValueGas * int64(assetFounderRatio) / 100), AssetGas}
dGas.Value = evm.FounderGasMap[callerName].Value - dGas.Value
evm.FounderGasMap[callerName] = dGas
} else {
dGas := DistributeGas{int64(callValueGas * int64(assetFounderRatio) / 100), AssetGas}
dGas.Value = evm.FounderGasMap[callerName].Value - dGas.Value
evm.FounderGasMap[callerName] = dGas
}
}
}
}

func (evm *EVM) distributeGasByScale(actualUsedGas uint64, runGas uint64) {
if evm.depth == 0 && actualUsedGas != runGas {
for name, gas := range evm.FounderGasMap {
v := DistributeGas{(gas.Value / int64(runGas)) * int64(actualUsedGas), gas.TypeID}
evm.FounderGasMap[name] = v
}
}
}

// Call executes the contract associated with the addr with the given input as
// parameters. It also handles any necessary value transfer required and takes
// the necessary steps to create accounts and reverses the state in case of an
Expand All @@ -177,13 +239,6 @@ func (evm *EVM) Call(caller ContractRef, action *types.Action, gas uint64) (ret
to = AccountRef(toName)
snapshot = evm.StateDB.Snapshot()
)
// if ok, err := evm.AccountDB.AccountIsExist(toName); !ok || err != nil {
// // todo
// //precompiles := PrecompiledContractsHomestead
// if err := evm.AccountDB.CreateAccount(toName, evm.FromPubkey); err != nil {
// return nil, gas, err
// }
// }

if err := evm.AccountDB.TransferAsset(action.Sender(), action.Recipient(), action.AssetID(), action.Value()); err != nil {
return nil, gas, err
Expand All @@ -197,15 +252,8 @@ func (evm *EVM) Call(caller ContractRef, action *types.Action, gas uint64) (ret
assetName = common.Name(assetInfo.GetAssetName())
}

assetFounderRatio := evm.chainConfig.ChargeCfg.AssetRatio //get asset founder charge ratio

//
contractName := toName

contratFounderRatio := evm.chainConfig.ChargeCfg.ContractRatio
//
callerName := caller.Name()

// Initialise a new contract and set the code that is to be used by the EVM.
// The contract is a scoped environment for this execution context only.

Expand All @@ -222,60 +270,16 @@ func (evm *EVM) Call(caller ContractRef, action *types.Action, gas uint64) (ret
return nil, gas, err
}
code, _ := acct.GetCode()
//codeHash, _ := evm.AccountDB.GetCodeHash(toName)
//code, _ := evm.AccountDB.GetCode(toName)
contract.SetCallCode(&toName, codeHash, code)

start := time.Now()

// Capture the tracer start/end events in debug mode
if evm.vmConfig.Debug && evm.depth == 0 {
evm.vmConfig.Tracer.CaptureStart(caller.Name(), toName, false, action.Data(), gas, action.Value())
defer func() { // Lazy evaluation of the parameters
evm.vmConfig.Tracer.CaptureEnd(ret, gas-contract.Gas, time.Since(start), err)
}()
}

ret, err = run(evm, contract, action.Data())
runGas := gas - contract.Gas

if runGas > 0 && len(contractName.String()) > 0 {
if _, ok := evm.FounderGasMap[contractName]; !ok {
dGas := DistributeGas{int64(runGas * contratFounderRatio / 100), ContractGas}
evm.FounderGasMap[contractName] = dGas
} else {
dGas := DistributeGas{int64(runGas * contratFounderRatio / 100), ContractGas}
dGas.Value = evm.FounderGasMap[contractName].Value + dGas.Value
evm.FounderGasMap[contractName] = dGas
}
}
evm.distributeContractGas(runGas, contractName, caller.Name())

if action.Value().Sign() != 0 && evm.depth != 0 {
callValueGas := int64(params.CallValueTransferGas - contract.Gas)
if callValueGas < 0 {
callValueGas = 0
}
if len(assetName.String()) > 0 {
if _, ok := evm.FounderGasMap[assetName]; !ok {
dGas := DistributeGas{int64(callValueGas * int64(assetFounderRatio) / 100), AssetGas}
evm.FounderGasMap[assetName] = dGas
} else {
dGas := DistributeGas{int64(callValueGas * int64(assetFounderRatio) / 100), AssetGas}
dGas.Value = evm.FounderGasMap[assetName].Value + dGas.Value
evm.FounderGasMap[assetName] = dGas
}
}
if len(callerName.String()) > 0 {
if _, ok := evm.FounderGasMap[callerName]; !ok {
dGas := DistributeGas{-int64(callValueGas * int64(assetFounderRatio) / 100), AssetGas}
dGas.Value = evm.FounderGasMap[callerName].Value - dGas.Value
evm.FounderGasMap[callerName] = dGas
} else {
dGas := DistributeGas{int64(callValueGas * int64(assetFounderRatio) / 100), AssetGas}
dGas.Value = evm.FounderGasMap[callerName].Value - dGas.Value
evm.FounderGasMap[callerName] = dGas
}
}
callValueGas := int64(params.CallValueTransferGas - contract.Gas)
if action.Value().Sign() != 0 && callValueGas > 0 {
evm.distributeAssetGas(callValueGas, assetName, caller.Name())
}

// When an error was returned by the EVM or when setting the creation code
Expand All @@ -289,12 +293,7 @@ func (evm *EVM) Call(caller ContractRef, action *types.Action, gas uint64) (ret
}

actualUsedGas := gas - contract.Gas
if evm.depth == 0 && actualUsedGas != runGas {
for name, gas := range evm.FounderGasMap {
v := DistributeGas{(gas.Value / int64(runGas)) * int64(actualUsedGas), gas.TypeID}
evm.FounderGasMap[name] = v
}
}
evm.distributeGasByScale(actualUsedGas, runGas)

return ret, contract.Gas, err
}
Expand Down Expand Up @@ -346,30 +345,19 @@ func (evm *EVM) CallCode(caller ContractRef, action *types.Action, gas uint64) (
ret, err = run(evm, contract, action.Data())
runGas := gas - contract.Gas

var contractName common.Name
contractFounder, _ := evm.AccountDB.GetFounder(toName)
if len(contractFounder.String()) == 0 {
contractName = toName
}
contractName := toName

contratFounderRatio := evm.chainConfig.ChargeCfg.ContractRatio
if runGas > 0 && len(contractName.String()) > 0 {
if _, ok := evm.FounderGasMap[contractName]; !ok {
dGas := DistributeGas{int64(runGas * contratFounderRatio / 100), ContractGas}
evm.FounderGasMap[contractName] = dGas
} else {
dGas := DistributeGas{int64(runGas * contratFounderRatio / 100), ContractGas}
dGas.Value = evm.FounderGasMap[contractName].Value + dGas.Value
evm.FounderGasMap[contractName] = dGas
}
}
evm.distributeContractGas(runGas, contractName, caller.Name())

if err != nil {
evm.StateDB.RevertToSnapshot(snapshot)
if err != errExecutionReverted {
contract.UseGas(contract.Gas)
}
}

actualUsedGas := gas - contract.Gas
evm.distributeGasByScale(actualUsedGas, runGas)
return ret, contract.Gas, err
}

Expand Down Expand Up @@ -410,30 +398,19 @@ func (evm *EVM) DelegateCall(caller ContractRef, name common.Name, input []byte,
ret, err = run(evm, contract, input)
runGas := gas - contract.Gas

var contractName common.Name
contractFounder, _ := evm.AccountDB.GetFounder(name)
if len(contractFounder.String()) == 0 {
contractName = name
}
contractName := name

contratFounderRatio := evm.chainConfig.ChargeCfg.ContractRatio
if runGas > 0 && len(contractName.String()) > 0 {
if _, ok := evm.FounderGasMap[contractName]; !ok {
dGas := DistributeGas{int64(runGas * contratFounderRatio / 100), ContractGas}
evm.FounderGasMap[contractName] = dGas
} else {
dGas := DistributeGas{int64(runGas * contratFounderRatio / 100), ContractGas}
dGas.Value = evm.FounderGasMap[contractName].Value + dGas.Value
evm.FounderGasMap[contractName] = dGas
}
}
evm.distributeContractGas(runGas, contractName, caller.Name())

if err != nil {
evm.StateDB.RevertToSnapshot(snapshot)
if err != errExecutionReverted {
contract.UseGas(contract.Gas)
}
}

actualUsedGas := gas - contract.Gas
evm.distributeGasByScale(actualUsedGas, runGas)
return ret, contract.Gas, err
}

Expand Down Expand Up @@ -484,30 +461,19 @@ func (evm *EVM) StaticCall(caller ContractRef, name common.Name, input []byte, g
ret, err = run(evm, contract, input)
runGas := gas - contract.Gas

var contractName common.Name
contractFounder, _ := evm.AccountDB.GetFounder(to.Name())
if len(contractFounder.String()) == 0 {
contractName = to.Name()
}
contractName := to.Name()

contratFounderRatio := evm.chainConfig.ChargeCfg.ContractRatio
if runGas > 0 && len(contractName.String()) > 0 {
if _, ok := evm.FounderGasMap[contractName]; !ok {
dGas := DistributeGas{int64(runGas * contratFounderRatio / 100), ContractGas}
evm.FounderGasMap[contractName] = dGas
} else {
dGas := DistributeGas{int64(runGas * contratFounderRatio / 100), ContractGas}
dGas.Value = evm.FounderGasMap[contractName].Value + dGas.Value
evm.FounderGasMap[contractName] = dGas
}
}
evm.distributeContractGas(runGas, contractName, caller.Name())

if err != nil {
evm.StateDB.RevertToSnapshot(snapshot)
if err != errExecutionReverted {
contract.UseGas(contract.Gas)
}
}

actualUsedGas := gas - contract.Gas
evm.distributeGasByScale(actualUsedGas, runGas)
return ret, contract.Gas, err
}

Expand Down

0 comments on commit 633d904

Please sign in to comment.