2014-02-24 05:10:45 -06:00
|
|
|
package ethchain
|
|
|
|
|
|
|
|
import (
|
2014-03-30 11:55:51 -05:00
|
|
|
_ "bytes"
|
2014-03-24 07:20:34 -05:00
|
|
|
"fmt"
|
2014-02-24 05:10:45 -06:00
|
|
|
"github.com/ethereum/eth-go/ethdb"
|
|
|
|
"github.com/ethereum/eth-go/ethutil"
|
2014-03-24 07:20:34 -05:00
|
|
|
"github.com/obscuren/mutan"
|
2014-02-24 05:10:45 -06:00
|
|
|
"math/big"
|
2014-03-24 07:20:34 -05:00
|
|
|
"strings"
|
2014-02-24 05:10:45 -06:00
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
2014-03-24 07:20:34 -05:00
|
|
|
func TestRun4(t *testing.T) {
|
2014-06-27 09:56:45 -05:00
|
|
|
ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "", "ETH")
|
2014-03-24 07:20:34 -05:00
|
|
|
|
|
|
|
db, _ := ethdb.NewMemDatabase()
|
|
|
|
state := NewState(ethutil.NewTrie(db, ""))
|
|
|
|
|
2014-04-27 11:00:38 -05:00
|
|
|
callerScript, err := mutan.Compile(strings.NewReader(`
|
2014-05-25 08:13:54 -05:00
|
|
|
this.store[this.origin()] = 10**20
|
|
|
|
hello := "world"
|
2014-04-10 20:03:14 -05:00
|
|
|
|
2014-05-25 08:13:54 -05:00
|
|
|
return lambda {
|
|
|
|
big to = this.data[0]
|
|
|
|
big from = this.origin()
|
|
|
|
big value = this.data[1]
|
2014-04-19 18:31:01 -05:00
|
|
|
|
2014-05-25 08:13:54 -05:00
|
|
|
if this.store[from] >= value {
|
|
|
|
this.store[from] = this.store[from] - value
|
|
|
|
this.store[to] = this.store[to] + value
|
2014-04-19 18:31:01 -05:00
|
|
|
}
|
2014-05-25 08:13:54 -05:00
|
|
|
}
|
2014-03-30 05:58:37 -05:00
|
|
|
`), false)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
}
|
2014-05-25 08:13:54 -05:00
|
|
|
fmt.Println(Disassemble(callerScript))
|
2014-03-24 07:20:34 -05:00
|
|
|
|
2014-05-25 08:13:54 -05:00
|
|
|
callerTx := NewContractCreationTx(ethutil.Big("0"), ethutil.Big("1000"), ethutil.Big("100"), callerScript)
|
|
|
|
callerTx.Sign([]byte("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"))
|
2014-03-24 07:20:34 -05:00
|
|
|
|
|
|
|
// Contract addr as test address
|
2014-04-19 18:31:01 -05:00
|
|
|
gas := big.NewInt(1000)
|
|
|
|
gasPrice := big.NewInt(10)
|
2014-03-24 07:20:34 -05:00
|
|
|
account := NewAccount(ContractAddr, big.NewInt(10000000))
|
2014-04-19 18:31:01 -05:00
|
|
|
fmt.Println("account.Amount =", account.Amount)
|
2014-04-09 11:27:54 -05:00
|
|
|
c := MakeContract(callerTx, state)
|
2014-04-19 18:31:01 -05:00
|
|
|
e := account.ConvertGas(gas, gasPrice)
|
|
|
|
if e != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
}
|
|
|
|
fmt.Println("account.Amount =", account.Amount)
|
2014-05-25 08:13:54 -05:00
|
|
|
callerClosure := NewClosure(account, c, callerScript, state, gas, gasPrice)
|
2014-03-24 07:20:34 -05:00
|
|
|
|
2014-04-25 18:54:45 -05:00
|
|
|
vm := NewVm(state, nil, RuntimeVars{
|
2014-04-11 12:29:57 -05:00
|
|
|
Origin: account.Address(),
|
|
|
|
BlockNumber: 1,
|
|
|
|
PrevHash: ethutil.FromHex("5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"),
|
|
|
|
Coinbase: ethutil.FromHex("2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"),
|
|
|
|
Time: 1,
|
|
|
|
Diff: big.NewInt(256),
|
2014-03-24 07:20:34 -05:00
|
|
|
})
|
2014-05-25 08:13:54 -05:00
|
|
|
var ret []byte
|
2014-05-29 16:54:48 -05:00
|
|
|
ret, _, e = callerClosure.Call(vm, nil, nil)
|
2014-04-18 06:41:07 -05:00
|
|
|
if e != nil {
|
|
|
|
fmt.Println("error", e)
|
|
|
|
}
|
2014-05-25 08:13:54 -05:00
|
|
|
fmt.Println(ret)
|
2014-03-24 07:20:34 -05:00
|
|
|
}
|