mirror of
https://github.com/fluencelabs/tendermint
synced 2025-05-27 21:21:20 +00:00
rpc: return tx hash, creates contract, contract addr in broadcast (required some helper functions). Closes #30
This commit is contained in:
parent
bf87ec1070
commit
f93bb35c02
@ -61,16 +61,21 @@ func HashFromHashes(hashes [][]byte) []byte {
|
||||
func HashFromBinaries(items []interface{}) []byte {
|
||||
hashes := [][]byte{}
|
||||
for _, item := range items {
|
||||
hasher, n, err := sha256.New(), new(int64), new(error)
|
||||
binary.WriteBinary(item, hasher, n, err)
|
||||
if *err != nil {
|
||||
panic(err)
|
||||
}
|
||||
hashes = append(hashes, hasher.Sum(nil))
|
||||
hashes = append(hashes, HashFromBinary(item))
|
||||
}
|
||||
return HashFromHashes(hashes)
|
||||
}
|
||||
|
||||
// General Convenience
|
||||
func HashFromBinary(item interface{}) []byte {
|
||||
hasher, n, err := sha256.New(), new(int64), new(error)
|
||||
binary.WriteBinary(item, hasher, n, err)
|
||||
if *err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return hasher.Sum(nil)
|
||||
}
|
||||
|
||||
// Convenience for HashFromHashes.
|
||||
func HashFromHashables(items []Hashable) []byte {
|
||||
hashes := [][]byte{}
|
||||
|
@ -6,6 +6,8 @@ import (
|
||||
"github.com/tendermint/tendermint/binary"
|
||||
blk "github.com/tendermint/tendermint/block"
|
||||
. "github.com/tendermint/tendermint/common"
|
||||
"github.com/tendermint/tendermint/merkle"
|
||||
"github.com/tendermint/tendermint/state"
|
||||
)
|
||||
|
||||
func BroadcastTxHandler(w http.ResponseWriter, r *http.Request) {
|
||||
@ -24,7 +26,22 @@ func BroadcastTxHandler(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
WriteAPIResponse(w, API_OK, "")
|
||||
txHash := merkle.HashFromBinary(tx)
|
||||
var createsContract bool
|
||||
var contractAddr []byte
|
||||
|
||||
if callTx, ok := tx.(*blk.CallTx); ok {
|
||||
if callTx.Address == nil {
|
||||
createsContract = true
|
||||
contractAddr = state.NewContractAddress(callTx.Input.Address, uint64(callTx.Input.Sequence))
|
||||
}
|
||||
}
|
||||
|
||||
WriteAPIResponse(w, API_OK, struct {
|
||||
TxHash []byte
|
||||
CreatesContract bool
|
||||
ContractAddr []byte
|
||||
}{txHash, createsContract, contractAddr})
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -113,10 +113,8 @@ func (vas *VMAppState) CreateAccount(creator *vm.Account) (*vm.Account, error) {
|
||||
// Generate an address
|
||||
nonce := creator.Nonce
|
||||
creator.Nonce += 1
|
||||
temp := make([]byte, 32+8)
|
||||
copy(temp, creator.Address[:])
|
||||
vm.PutUint64(temp[32:], nonce)
|
||||
addr := vm.RightPadWord(sha3.Sha3(temp)[:20])
|
||||
|
||||
addr := vm.RightPadWord(NewContractAddress(creator.Address[:], nonce))
|
||||
|
||||
// Create account from address.
|
||||
account, deleted := unpack(vas.accounts[addr.String()])
|
||||
@ -238,3 +236,13 @@ func (vas *VMAppState) Sync() {
|
||||
func (vas *VMAppState) AddLog(log *vm.Log) {
|
||||
vas.logs = append(vas.logs, log)
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
// Convenience function to return address of new contract
|
||||
func NewContractAddress(caller []byte, nonce uint64) []byte {
|
||||
temp := make([]byte, 32+8)
|
||||
copy(temp, caller)
|
||||
vm.PutUint64(temp[32:], nonce)
|
||||
return sha3.Sha3(temp)[:20]
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user