func FormatTransactionData(data string) []byte { d := ethutil.StringToByteFunc(data, func(s string) (ret []byte) { slice := regexp.MustCompile("\\n|\\s").Split(s, 1000000000) for _, dataItem := range slice { d := ethutil.FormatData(dataItem) ret = append(ret, d...) } return }) return d }
func (self *Pipe) Transact(key *ethcrypto.KeyPair, rec []byte, value, gas, price *ethutil.Value, data []byte) ([]byte, error) { var hash []byte var contractCreation bool if rec == nil { contractCreation = true } var tx *ethchain.Transaction // Compile and assemble the given data if contractCreation { script, err := ethutil.Compile(string(data), false) if err != nil { return nil, err } tx = ethchain.NewContractCreationTx(value.BigInt(), gas.BigInt(), price.BigInt(), script) } else { data := ethutil.StringToByteFunc(string(data), func(s string) (ret []byte) { slice := strings.Split(s, "\n") for _, dataItem := range slice { d := ethutil.FormatData(dataItem) ret = append(ret, d...) } return }) tx = ethchain.NewTransactionMessage(hash, value.BigInt(), gas.BigInt(), price.BigInt(), data) } acc := self.stateManager.TransState().GetOrNewStateObject(key.Address()) tx.Nonce = acc.Nonce acc.Nonce += 1 self.stateManager.TransState().UpdateStateObject(acc) tx.Sign(key.PrivateKey) self.obj.TxPool().QueueTransaction(tx) if contractCreation { logger.Infof("Contract addr %x", tx.CreationAddress()) return tx.CreationAddress(), nil } return tx.Hash(), nil }
func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, dataStr string) { if !self.Db.done { self.Db.Q <- true } defer func() { if r := recover(); r != nil { self.Logf("compile FAULT: %v", r) } }() data := ethutil.StringToByteFunc(dataStr, func(s string) (ret []byte) { slice := strings.Split(dataStr, "\n") for _, dataItem := range slice { d := ethutil.FormatData(dataItem) ret = append(ret, d...) } return }) var err error script := ethutil.StringToByteFunc(scriptStr, func(s string) (ret []byte) { ret, err = ethutil.Compile(s, false) return }) if err != nil { self.Logln(err) return } var ( gas = ethutil.Big(gasStr) gasPrice = ethutil.Big(gasPriceStr) value = ethutil.Big(valueStr) // Contract addr as test address keyPair = self.lib.eth.KeyManager().KeyPair() ) state := self.lib.eth.StateManager().TransState() account := self.lib.eth.StateManager().TransState().GetAccount(keyPair.Address()) contract := ethchain.NewStateObject([]byte{0}) contract.Amount = value callerClosure := ethchain.NewClosure(account, contract, script, state, gas, gasPrice) block := self.lib.eth.BlockChain().CurrentBlock vm := ethchain.NewVm(state, self.lib.eth.StateManager(), ethchain.RuntimeVars{ Block: block, Origin: account.Address(), BlockNumber: block.Number, PrevHash: block.PrevHash, Coinbase: block.Coinbase, Time: block.Time, Diff: block.Difficulty, Value: ethutil.Big(valueStr), }) vm.Verbose = true vm.Dbg = self.Db self.vm = vm self.Db.done = false self.Logf("callsize %d", len(script)) go func() { ret, g, err := callerClosure.Call(vm, data) tot := new(big.Int).Mul(g, gasPrice) self.Logf("gas usage %v total price = %v (%v)", g, tot, ethutil.CurrencyToString(tot)) if err != nil { self.Logln("exited with errors:", err) } else { if len(ret) > 0 { self.Logf("exited: % x", ret) } else { self.Logf("exited: nil") } } state.Reset() if !self.Db.interrupt { self.Db.done = true } else { self.Db.interrupt = false } }() }