aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDeterminant <tederminant@gmail.com>2020-06-30 20:56:12 -0400
committerDeterminant <tederminant@gmail.com>2020-06-30 20:56:12 -0400
commitfbe0f2d6b14d7b6fc43068e224412d4e65176550 (patch)
tree5db367ee2d219386c2968f30e51c8c67c1ef8121
parent7feec02902d52a3abf722613eb9e218e015b723c (diff)
test multi-coin smart contracts
-rw-r--r--core/state/statedb.go3
-rw-r--r--core/state_transition.go1
-rw-r--r--examples/multicoin/main.go87
3 files changed, 56 insertions, 35 deletions
diff --git a/core/state/statedb.go b/core/state/statedb.go
index 1d3207d..9c7535b 100644
--- a/core/state/statedb.go
+++ b/core/state/statedb.go
@@ -41,6 +41,7 @@ type revision struct {
var (
// emptyRoot is the known root hash of an empty trie.
emptyRoot = common.HexToHash("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421")
+ zeroRoot = common.HexToHash("0000000000000000000000000000000000000000000000000000000000000000")
// emptyCode is the known hash of the empty EVM bytecode.
emptyCode = crypto.Keccak256Hash(nil)
@@ -239,7 +240,7 @@ func (self *StateDB) GetBalanceMultiCoin(addr common.Address, coinID common.Hash
func (self *StateDB) EnableMultiCoin(addr common.Address) error {
stateObject := self.GetOrNewStateObject(addr)
- if stateObject.data.Root != emptyRoot {
+ if stateObject.data.Root != emptyRoot && stateObject.data.Root != zeroRoot {
return errors.New("not a fresh account")
}
if !stateObject.EnableMultiCoin() {
diff --git a/core/state_transition.go b/core/state_transition.go
index 139289f..7a48597 100644
--- a/core/state_transition.go
+++ b/core/state_transition.go
@@ -219,7 +219,6 @@ func (st *StateTransition) TransitionDb() (ret []byte, usedGas uint64, failed bo
if contractCreation {
ret, _, st.gas, vmerr = evm.Create(sender, st.data, st.gas, st.value)
} else {
- log.Debug("here2")
// Increment the nonce for the next transaction
st.state.SetNonce(msg.From(), st.state.GetNonce(sender.Address())+1)
ret, st.gas, vmerr = evm.CallExpert(sender, st.to(), st.data, st.gas, st.value, st.coinID, st.value2)
diff --git a/examples/multicoin/main.go b/examples/multicoin/main.go
index 3e42010..b226703 100644
--- a/examples/multicoin/main.go
+++ b/examples/multicoin/main.go
@@ -6,28 +6,30 @@ import (
"encoding/json"
"fmt"
"github.com/ava-labs/coreth"
+ "github.com/ava-labs/coreth/accounts/abi"
"github.com/ava-labs/coreth/core"
- "github.com/ava-labs/coreth/eth"
- //"github.com/ava-labs/coreth/accounts/abi"
"github.com/ava-labs/coreth/core/types"
+ "github.com/ava-labs/coreth/eth"
"github.com/ava-labs/coreth/params"
"github.com/ava-labs/go-ethereum/common"
- "github.com/ava-labs/go-ethereum/common/compiler"
+ //"github.com/ava-labs/go-ethereum/common/compiler"
"github.com/ava-labs/go-ethereum/crypto"
"github.com/ava-labs/go-ethereum/log"
"go/build"
"math/big"
"os"
"os/signal"
- "path/filepath"
- //"strings"
+ //"path/filepath"
+ "strings"
"syscall"
"time"
)
var (
- codeHex = "6101c7610026600b82828239805160001a60731461001957fe5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361061004b5760003560e01c80631e01043914610050578063abb24ba014610092578063b6510bb3146100a9575b600080fd5b61007c6004803603602081101561006657600080fd5b8101908080359060200190929190505050610118565b6040518082815260200191505060405180910390f35b81801561009e57600080fd5b506100a761013b565b005b8180156100b557600080fd5b50610116600480360360808110156100cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919050505061013e565b005b60003373ffffffffffffffffffffffffffffffffffffffff1682905d9050919050565b5c565b8373ffffffffffffffffffffffffffffffffffffffff1681836108fc8690811502906040516000604051808303818888878c8af69550505050505015801561018a573d6000803e3d6000fd5b505050505056fea26469706673582212204e4689067358d8e82903012dcaca0c004d36e39fc99360919fb824c4ce718bdd64736f6c634300060a0033"
- codeABI = `[{"inputs":[{"internalType":"uint256","name":"coinid","type":"uint256"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]`
+ mcLibCode = "6101c7610026600b82828239805160001a60731461001957fe5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361061004b5760003560e01c80631e01043914610050578063abb24ba014610092578063b6510bb3146100a9575b600080fd5b61007c6004803603602081101561006657600080fd5b8101908080359060200190929190505050610118565b6040518082815260200191505060405180910390f35b81801561009e57600080fd5b506100a761013b565b005b8180156100b557600080fd5b50610116600480360360808110156100cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919050505061013e565b005b60003373ffffffffffffffffffffffffffffffffffffffff1682905d9050919050565b5c565b8373ffffffffffffffffffffffffffffffffffffffff1681836108fc8690811502906040516000604051808303818888878c8af69550505050505015801561018a573d6000803e3d6000fd5b505050505056fea2646970667358221220477c0e55c25708d36d55abae8a51496c16bc5d28bc1ee6a9963c304afbacdc3464736f6c634300060a0033"
+ mcLibAddr = "0xDCb165540502E5d32F89382175150013D6644A69"
+ testContract = "608060405234801561001057600080fd5b5073dcb165540502e5d32f89382175150013d6644a6963abb24ba06040518163ffffffff1660e01b815260040160006040518083038186803b15801561005557600080fd5b505af4158015610069573d6000803e3d6000fd5b505050506101528061007c6000396000f3fe6080604052600436106100295760003560e01c80631e0104391461002e578063d0e30db01461007d575b600080fd5b34801561003a57600080fd5b506100676004803603602081101561005157600080fd5b8101908080359060200190929190505050610087565b6040518082815260200191505060405180910390f35b61008561011a565b005b600073dcb165540502e5d32f89382175150013d6644a69631e010439836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156100d857600080fd5b505af41580156100ec573d6000803e3d6000fd5b505050506040513d602081101561010257600080fd5b81019080805190602001909291905050509050919050565b56fea26469706673582212204e41dc04c9409d8c06804429d6a03f2d6bca46de6073522300ea08f8ed4a90ac64736f6c634300060a0033"
+ testContractABI = `[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"coinid","type":"uint256"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]`
)
func checkError(err error) {
@@ -99,25 +101,23 @@ func main() {
chain := coreth.NewETHChain(&config, nil, nil, nil)
newTxPoolHeadChan := make(chan core.NewTxPoolHeadEvent, 1)
log.Info(chain.GetGenesisBlock().Hash().Hex())
- firstBlock := false
var contractAddr common.Address
+ var contractAddr1 common.Address
coin0 := common.HexToHash("0x0")
- //var calls [][]byte
postGen := func(block *types.Block) bool {
if blockCount == 15 {
state, err := chain.CurrentState()
checkError(err)
log.Info(fmt.Sprintf("genesis balance = %s", state.GetBalance(genKey.Address)))
log.Info(fmt.Sprintf("genesis balance2 = %s", state.GetBalanceMultiCoin(genKey.Address, coin0)))
- log.Info(fmt.Sprintf("contract balance = %s", state.GetBalance(contractAddr)))
+ log.Info(fmt.Sprintf("contract balance2 = %s", state.GetBalanceMultiCoin(contractAddr1, coin0)))
log.Info(fmt.Sprintf("bob's balance = %s", state.GetBalance(bob.Address)))
log.Info(fmt.Sprintf("bob's balance2 = %s", state.GetBalanceMultiCoin(bob.Address, coin0)))
log.Info(fmt.Sprintf("state = %s", state.Dump(true, false, true)))
log.Info(fmt.Sprintf("x = %s", state.GetState(contractAddr, common.BigToHash(big.NewInt(0))).String()))
return true
}
- if !firstBlock {
- firstBlock = true
+ if blockCount == 1 {
receipts := chain.GetReceiptsByHash(block.Hash())
if len(receipts) != 1 {
panic(fmt.Sprintf("# receipts is %d != 1", len(receipts)))
@@ -126,14 +126,20 @@ func main() {
txHash := receipts[0].TxHash
log.Info(fmt.Sprintf("deploy tx = %s", txHash.String()))
log.Info(fmt.Sprintf("contract addr = %s", contractAddr.String()))
- //var call []byte
- //if len(calls) > 0 {
- // call = calls[0]
- // calls = calls[1:]
- //} else {
- // call = nil
- //}
- //state, _ := chain.CurrentState()
+ code := common.Hex2Bytes(testContract)
+ tx := types.NewContractCreation(nonce, big.NewInt(0), uint64(gasLimit), gasPrice, code)
+ signedTx, err := types.SignTx(tx, types.NewEIP155Signer(chainID), genKey.PrivateKey)
+ checkError(err)
+ chain.AddRemoteTxs([]*types.Transaction{signedTx})
+ nonce++
+ } else if blockCount == 2 {
+ receipts := chain.GetReceiptsByHash(block.Hash())
+ if len(receipts) != 1 {
+ panic(fmt.Sprintf("# receipts is %d != 1", len(receipts)))
+ }
+ contractAddr1 = receipts[0].ContractAddress
+ fmt.Println("contract", contractAddr1.Hex())
+
//call := common.Hex2Bytes("1003e2d20000000000000000000000000000000000000000000000000000000000000001")
//log.Info(fmt.Sprintf("code = %s", hex.EncodeToString(state.GetCode(contractAddr))))
go func() {
@@ -152,13 +158,26 @@ func main() {
chain.AddRemoteTxs([]*types.Transaction{signedTx})
time.Sleep(20 * time.Millisecond)
- for i := 0; i < 10; i++ {
- tx := types.NewTransaction(nonce, bob.Address, big.NewInt(10000000000000000), uint64(gasLimit), gasPrice, nil)
+ var code []byte
+ abi, err := abi.JSON(strings.NewReader(testContractABI))
+ checkError(err)
+ code, err = abi.Pack("deposit")
+ checkError(err)
+
+ for i := 0; i < 5; i++ {
+ tx := types.NewTransaction(nonce, bob.Address, big.NewInt(0), uint64(gasLimit), gasPrice, nil)
tx.SetMultiCoinValue(&coin0, big.NewInt(100000000000000000))
signedTx, err := types.SignTx(tx, types.NewEIP155Signer(chainID), genKey.PrivateKey)
checkError(err)
chain.AddRemoteTxs([]*types.Transaction{signedTx})
nonce++
+
+ tx = types.NewTransaction(nonce, contractAddr1, big.NewInt(0), uint64(gasLimit), gasPrice, code)
+ tx.SetMultiCoinValue(&coin0, big.NewInt(100000000000000000))
+ signedTx, err = types.SignTx(tx, types.NewEIP155Signer(chainID), genKey.PrivateKey)
+ checkError(err)
+ chain.AddRemoteTxs([]*types.Transaction{signedTx})
+ nonce++
}
}()
}
@@ -189,25 +208,27 @@ func main() {
chain.GetTxPool().SubscribeNewHeadEvent(newTxPoolHeadChan)
chain.Start()
- //code := common.Hex2Bytes(codeHex)
- counterSrc, err := filepath.Abs(gopath + "/src/github.com/ava-labs/coreth/examples/counter/counter.sol")
- checkError(err)
- contracts, err := compiler.CompileSolidity("", counterSrc)
- checkError(err)
- contract, _ := contracts[fmt.Sprintf("%s:%s", counterSrc, "Counter")]
- code := common.Hex2Bytes(contract.Code[2:])
-
- //abi, err := abi.JSON(strings.NewReader(codeABI))
- //cc, err := abi.Pack("getBalance", big.NewInt(0))
+ //cc, err := abi.Pack("enableMultiCoin")
+ //checkError(err)
+ //calls = append(calls, cc)
+ //cc, err = abi.Pack("getBalance", big.NewInt(0))
//checkError(err)
//calls = append(calls, cc)
+
+ code := common.Hex2Bytes(mcLibCode)
tx := types.NewContractCreation(nonce, big.NewInt(0), uint64(gasLimit), gasPrice, code)
signedTx, err := types.SignTx(tx, types.NewEIP155Signer(chainID), genKey.PrivateKey)
checkError(err)
chain.AddRemoteTxs([]*types.Transaction{signedTx})
- time.Sleep(1000 * time.Millisecond)
nonce++
+ //counterSrc, err := filepath.Abs(gopath + "/src/github.com/ava-labs/coreth/examples/counter/counter.sol")
+ //checkError(err)
+ //contracts, err := compiler.CompileSolidity("", counterSrc)
+ //checkError(err)
+ //contract, _ := contracts[fmt.Sprintf("%s:%s", counterSrc, "Counter")]
+ //code := common.Hex2Bytes(contract.Code[2:])
+ time.Sleep(10 * time.Millisecond)
chain.GenBlock()
c := make(chan os.Signal, 1)