Merge pull request #24 from ShyftNetwork/writeContracts

Updated writeTransactions
This commit is contained in:
Tim Williams 2018-05-17 11:11:38 -04:00 committed by GitHub
commit 573cb28a43
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 125 additions and 124 deletions

View file

@ -16,7 +16,6 @@ import (
func GetTransaction(w http.ResponseWriter, r *http.Request) { func GetTransaction(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r) vars := mux.Vars(r)
txHash := vars["txHash"] txHash := vars["txHash"]
fmt.Println(txHash)
connStr := "user=postgres dbname=shyftdb sslmode=disable" connStr := "user=postgres dbname=shyftdb sslmode=disable"
blockExplorerDb, err := sql.Open("postgres", connStr) blockExplorerDb, err := sql.Open("postgres", connStr)
if err != nil { if err != nil {
@ -24,7 +23,6 @@ func GetTransaction(w http.ResponseWriter, r *http.Request) {
} }
getTxResponse := shyftdb.GetTransaction(blockExplorerDb, txHash) getTxResponse := shyftdb.GetTransaction(blockExplorerDb, txHash)
fmt.Println(getTxResponse)
if err != nil { if err != nil {
http.Error(w, err.Error(), 500) http.Error(w, err.Error(), 500)

View file

@ -24,7 +24,7 @@ class BlocksTable extends Component {
render() { render() {
const table = this.state.data.map((data, i) => { const table = this.state.data.map((data, i) => {
return <BlockTable return <BlockTable
key={data.Hash[i]} key={`${data.TxHash}${i}`}
Hash={data.Hash} Hash={data.Hash}
Number={data.Number} Number={data.Number}
Coinbase={data.Coinbase} Coinbase={data.Coinbase}

View file

@ -5,7 +5,7 @@ import { Link } from 'react-router-dom'
const BlockTable = (props) => { const BlockTable = (props) => {
return ( return (
<tbody key={props.key}> <tbody>
<tr> <tr>
<td><Link to="/blocks/detail" onClick={() => props.detailBlockHandler(props.Number)}> <td><Link to="/blocks/detail" onClick={() => props.detailBlockHandler(props.Number)}>
{props.Number} {props.Number}

View file

@ -8,6 +8,7 @@ class DetailBlockTable extends Component {
let combinedClasses = ['responsive-table', classes.table]; let combinedClasses = ['responsive-table', classes.table];
return ( return (
<table className={combinedClasses.join(' ')}> <table className={combinedClasses.join(' ')}>
<tbody>
<tr> <tr>
<th scope="col">Height:</th> <th scope="col">Height:</th>
<td>{data.Number}</td> <td>{data.Number}</td>
@ -68,6 +69,7 @@ class DetailBlockTable extends Component {
<th scope="col">Reward:</th> <th scope="col">Reward:</th>
<td>TBD</td> <td>TBD</td>
</tr> </tr>
</tbody>
</table> </table>
); );
} }

View file

@ -13,6 +13,11 @@ th {
padding-right: 10px; padding-right: 10px;
} }
td {
padding-left: 5px;
font-size: .5rem;
}
.addressTag { .addressTag {
display: inline-block; display: inline-block;
vertical-align: bottom; vertical-align: bottom;

View file

@ -8,66 +8,60 @@ class DetailTransactionTable extends Component {
let combinedClasses = ['responsive-table', classes.table]; let combinedClasses = ['responsive-table', classes.table];
return ( return (
<table className={combinedClasses.join(' ')}> <table className={combinedClasses.join(' ')}>
<tbody>
<tr> <tr>
<th scope="col">TxHash:</th> <th scope="col">TxHash:</th>
<td>{data.TxHash}</td> <td>{data.TxHash}</td>
</tr> </tr>
<tr> <tr>
<th scope="col">Age:</th> <th scope="col">TxReceipt Status:</th>
<td>{data.Status}</td>
</tr>
<tr>
<th scope="col">Block Height:</th>
<td>{data.BlockNumber}</td>
</tr>
<tr>
<th scope="col">TimeStamp:</th>
<td>{data.Age}</td> <td>{data.Age}</td>
</tr> </tr>
<tr> <tr>
<th scope="col">Txn:</th> <th scope="col">From:</th>
<td>{data.TxCount} transactions</td> <td>{data.From}</td>
</tr> </tr>
<tr> <tr>
<th scope="col">Block Hash:</th> <th scope="col">To:</th>
<td>{data.Hash}</td> <td>{ `${data.IsContract}` ? `${data.To} (Contract)` : `${data.To}` }</td>
</tr> </tr>
<tr> <tr>
<th scope="col">Parent Hash:</th> <th scope="col">Value:</th>
<td>{data.ParentHash}</td> <td>{data.Amount}</td>
</tr> </tr>
<tr> <tr>
<th scope="col">Uncle Hash:</th> <th scope="col">Gas Limit:</th>
<td>{data.UncleHash}</td>
</tr>
<tr>
<th scope="col">Uncle Count:</th>
<td>{data.UncleCount}</td>
</tr>
<tr>
<th scope="col">Coinbase:</th>
<td>{data.Coinbase}</td>
</tr>
<tr>
<th scope="col">Difficulty:</th>
<td>{data.Difficulty}</td>
</tr>
<tr>
<th scope="col">GasUsed:</th>
<td>{data.GasUsed}</td>
</tr>
<tr>
<th scope="col">Size:</th>
<td>{data.Size}ytes</td>
</tr>
<tr>
<th scope="col">GasUsed:</th>
<td>{data.GasUsed}</td>
</tr>
<tr>
<th scope="col">GasLimit:</th>
<td>{data.GasLimit}</td> <td>{data.GasLimit}</td>
</tr> </tr>
<tr>
<th scope="col">Gas Used By Txn:</th>
<td>{data.Gas}</td>
</tr>
<tr>
<th scope="col">Gas Price:</th>
<td>{data.GasPrice}</td>
</tr>
<tr>
<th scope="col">Actual Tx Cost/Fee:</th>
<td>{data.Cost}</td>
</tr>
<tr> <tr>
<th scope="col">Nonce:</th> <th scope="col">Nonce:</th>
<td>{data.Nonce}</td> <td>{data.Nonce}</td>
</tr> </tr>
<tr> <tr>
<th scope="col">Reward:</th> <th scope="col">Input Data:</th>
<td>TBD</td> <td>{data.Data}</td>
</tr> </tr>
</tbody>
</table> </table>
); );
} }

View file

@ -26,25 +26,28 @@ class TransactionTable extends Component {
const table = this.state.data.map((data, i) => { const table = this.state.data.map((data, i) => {
return <TransactionsTable return <TransactionsTable
key={data.TxHash[i]} key={`${data.TxHash}${i}`}
age={data.Age}
txHash={data.TxHash} txHash={data.TxHash}
blockNumber={data.BlockNumber} blockNumber={data.BlockNumber}
to={data.To} to={data.To}
from={data.From} from={data.From}
value={data.Amount} value={data.Amount}
cost={data.Cost} cost={data.Cost}
detailTransactionHandler={this.props.detailTransactionHandler}
/> />
}) })
let combinedClasses = ['responsive-table', classes.table]; let combinedClasses = ['responsive-table', classes.table];
return ( return (
<table className={combinedClasses.join(' ')}> <table key={this.state.data.TxHash} className={combinedClasses.join(' ')}>
<thead className={classes.tHead}> <thead className={classes.tHead}>
<tr> <tr>
<th scope="col">TxHash</th> <th scope="col">TxHash</th>
<th scope="col">Block</th> <th scope="col">Block</th>
<th scope="col">Age</th> <th scope="col">Age</th>
<th scope="col">From</th> <th scope="col">From</th>
<th scope="col"></th>
<th scope="col">To</th> <th scope="col">To</th>
<th scope="col">Value</th> <th scope="col">Value</th>
<th scope="col">TxFee</th> <th scope="col">TxFee</th>

View file

@ -12,10 +12,10 @@ const TransactionTable = (props) => {
{props.txHash}</Link> {props.txHash}</Link>
</td> </td>
<td>{props.blockNumber}</td> <td>{props.blockNumber}</td>
<td>30 secs ago</td> <td>{props.age}</td>
<td className={classes.fromTag}>{props.from}</td> <td className={classes.fromTag}>{props.from}</td>
<img className={classes.arrow} src={arrow}/> <td><img className={classes.arrow} src={arrow}/></td>
<td>{props.to}</td> <td className={classes.toTag}>{props.to}</td>
<td>{props.value}</td> <td>{props.value}</td>
<td>{props.cost}</td> <td>{props.cost}</td>
</tr> </tr>

View file

@ -23,9 +23,12 @@ CREATE TABLE IF NOT EXISTS txs (
amount numeric, amount numeric,
gasprice numeric, gasprice numeric,
gas numeric, gas numeric,
gasLimit numeric,
txFee numeric, txFee numeric,
nonce numeric, nonce numeric,
txStatus text,
isContract bool, isContract bool,
age timestamp,
data bytea data bytea
); );

View file

@ -78,8 +78,12 @@ type ShyftTxEntryPretty struct {
Amount uint64 Amount uint64
GasPrice uint64 GasPrice uint64
Gas uint64 Gas uint64
GasLimit uint64
Cost uint64 Cost uint64
Nonce uint64 Nonce uint64
Status string
IsContract bool
Age time.Time
Data []byte Data []byte
} }
@ -98,13 +102,7 @@ type SendAndReceive struct {
} }
//WriteBlock writes to block info to sql db //WriteBlock writes to block info to sql db
func WriteBlock(sqldb *sql.DB, block *types.Block, receipts []*types.Receipt) error { func WriteBlock(sqldb *sql.DB, block *types.Block, receipts []*types.Receipt) error {
//Need to create field in postgres db isContract : True || False
//Need to fix nonce numeric issue (attempt to reproduce and record)
//Need to update tx To Field where null with Contract Address
//Need to update account table with that Contract Address
//Need to update AccountNonce and Balance of Tx To field || Contract Address
coinbase := block.Header().Coinbase.String() coinbase := block.Header().Coinbase.String()
number := block.Header().Number.String() number := block.Header().Number.String()
gasUsed := block.Header().GasUsed gasUsed := block.Header().GasUsed
@ -117,33 +115,6 @@ type SendAndReceive struct {
blockSize := block.Size().String() blockSize := block.Size().String()
blockNonce := block.Nonce() blockNonce := block.Nonce()
// Convert the receipts into their storage form and serialize them
storageReceipts := make([]*types.ReceiptForStorage, len(receipts))
for i, receipt := range receipts {
storageReceipts[i] = (*types.ReceiptForStorage)(receipt)
var txHashFromReciept = (*types.ReceiptForStorage)(receipt).TxHash
var statusFromReciept = (*types.ReceiptForStorage)(receipt).Status
var contractAddressFromReciept = (*types.ReceiptForStorage)(receipt).ContractAddress
if statusFromReciept == 1 {
fmt.Println("THIS IS statusFromReciept", "SUCCESS", statusFromReciept)
}
if statusFromReciept == 0 {
fmt.Println("THIS IS statusFromReciept", "FAIL", statusFromReciept)
}
if block.Transactions()[0].To() == nil {
updateSQLStatement := `UPDATE txs SET to_addr = ($2) WHERE txHash = ($1)`
_, error := sqldb.Exec(updateSQLStatement, txHashFromReciept.String(), contractAddressFromReciept.String())
if error != nil {
panic(error)
}
}
fmt.Println("THIS IS txHashFromReciept", txHashFromReciept.String())
fmt.Println("THIS IS contractAddressFromReciept", contractAddressFromReciept.String())
}
i, err := strconv.ParseInt(block.Time().String(), 10, 64) i, err := strconv.ParseInt(block.Time().String(), 10, 64)
if err != nil { if err != nil {
panic(err) panic(err)
@ -159,7 +130,7 @@ type SendAndReceive struct {
if block.Transactions().Len() > 0 { if block.Transactions().Len() > 0 {
for _, tx := range block.Transactions() { for _, tx := range block.Transactions() {
//WriteMinerRewards(sqldb, block) //WriteMinerRewards(sqldb, block)
WriteTransactions(sqldb, tx, block.Header().Hash(), block.Header().Number.String()) WriteTransactions(sqldb, tx, block.Header().Hash(), block.Header().Number.String(), receipts, age, gasLimit)
if block.Transactions()[0].To() != nil { if block.Transactions()[0].To() != nil {
WriteFromBalance(sqldb, tx) WriteFromBalance(sqldb, tx)
} }
@ -173,7 +144,7 @@ type SendAndReceive struct {
} }
//WriteTransactions writes to sqldb //WriteTransactions writes to sqldb
func WriteTransactions(sqldb *sql.DB, tx *types.Transaction, blockHash common.Hash, blockNumber string) error { func WriteTransactions(sqldb *sql.DB, tx *types.Transaction, blockHash common.Hash, blockNumber string, receipts []*types.Receipt, age time.Time, gasLimit uint64) error {
txData := ShyftTxEntry{ txData := ShyftTxEntry{
TxHash: tx.Hash(), TxHash: tx.Hash(),
From: tx.From(), From: tx.From(),
@ -186,7 +157,6 @@ func WriteTransactions(sqldb *sql.DB, tx *types.Transaction, blockHash common.Ha
Nonce: tx.Nonce(), Nonce: tx.Nonce(),
Data: tx.Data(), Data: tx.Data(),
} }
txHash := txData.TxHash.Hex() txHash := txData.TxHash.Hex()
from := txData.From.Hex() from := txData.From.Hex()
blockHasher := txData.BlockHash blockHasher := txData.BlockHash
@ -198,11 +168,25 @@ func WriteTransactions(sqldb *sql.DB, tx *types.Transaction, blockHash common.Ha
data := txData.Data data := txData.Data
to := txData.To to := txData.To
var isContract bool var isContract bool
var statusFromReciept string
if (to == nil){ if (to == nil){
var contractAddressFromReciept string
for _, receipt := range receipts {
statusReciept := (*types.ReceiptForStorage)(receipt).Status
contractAddressFromReciept = (*types.ReceiptForStorage)(receipt).ContractAddress.String()
if statusReciept == 1 {
statusFromReciept = "SUCCESS"
}
if statusReciept == 0 {
statusFromReciept = "FAIL"
}
}
var retNonce string var retNonce string
isContract = true isContract = true
sqlStatement := `INSERT INTO txs(txhash, from_addr, blockhash, blockNumber, amount, gasprice, gas, txfee, nonce, isContract, data) VALUES(($1), ($2), ($3), ($4), ($5), ($6), ($7), ($8), ($9), ($10), ($11)) RETURNING nonce` sqlStatement := `INSERT INTO txs(txhash, from_addr, to_addr, blockhash, blockNumber, amount, gasprice, gas, gasLimit,txfee, nonce, isContract, txStatus, age, data) VALUES(($1), ($2), ($3), ($4), ($5), ($6), ($7), ($8), ($9), ($10), ($11), ($12), ($13), ($14), ($15)) RETURNING nonce`
qerr := sqldb.QueryRow(sqlStatement, txHash, from, blockHasher, blockNumber, amount, gasPrice, gas, txFee, nonce, isContract, data).Scan(&retNonce) qerr := sqldb.QueryRow(sqlStatement, txHash, from, contractAddressFromReciept, blockHasher, blockNumber, amount, gasPrice, gas, gasLimit, txFee, nonce, isContract, statusFromReciept, age,data).Scan(&retNonce)
if qerr != nil { if qerr != nil {
panic(qerr) panic(qerr)
@ -210,8 +194,18 @@ func WriteTransactions(sqldb *sql.DB, tx *types.Transaction, blockHash common.Ha
} else { } else {
var retNonce string var retNonce string
isContract = false isContract = false
sqlStatement := `INSERT INTO txs(txhash, from_addr, to_addr, blockhash, blockNumber, amount, gasprice, gas, txfee, nonce, isContract, data) VALUES(($1), ($2), ($3), ($4), ($5), ($6), ($7), ($8), ($9), ($10), ($11), ($12)) RETURNING nonce` for _, receipt := range receipts {
qerr := sqldb.QueryRow(sqlStatement, txHash, from, to.Hex(), blockHasher, blockNumber, amount, gasPrice, gas, txFee, nonce, isContract, data).Scan(&retNonce) statusReciept := (*types.ReceiptForStorage)(receipt).Status
if statusReciept == 1 {
statusFromReciept = "SUCCESS"
}
if statusReciept == 0 {
statusFromReciept = "FAIL"
}
}
sqlStatement := `INSERT INTO txs(txhash, from_addr, to_addr, blockhash, blockNumber, amount, gasprice, gas, gasLimit, txfee, nonce, isContract, txStatus, age, data) VALUES(($1), ($2), ($3), ($4), ($5), ($6), ($7), ($8), ($9), ($10), ($11), ($12), ($13), ($14), ($15)) RETURNING nonce`
qerr := sqldb.QueryRow(sqlStatement, txHash, from, to.Hex(), blockHasher, blockNumber, amount, gasPrice, gas, gasLimit, txFee, nonce, isContract, statusFromReciept, age,data).Scan(&retNonce)
if qerr != nil { if qerr != nil {
panic(qerr) panic(qerr)
@ -243,13 +237,6 @@ func WriteContractBalance(sqldb *sql.DB, tx *types.Transaction) error {
err := sqldb.QueryRow(sqlExistsStatement, fromAddr).Scan(&response) err := sqldb.QueryRow(sqlExistsStatement, fromAddr).Scan(&response)
switch { switch {
case err == sql.ErrNoRows: case err == sql.ErrNoRows:
fmt.Println("NO ROWS RAN")
//i, err := strconv.Atoi(accountNonceSen)
//if err != nil {
// fmt.Println(err)
//}
//fmt.Println("accountnonce", i)
//fmt.Println(reflect.TypeOf(i))
sqlStatement := `INSERT INTO accounts(addr, balance, txCountAccount) VALUES(($1), ($2), ($3)) RETURNING addr` sqlStatement := `INSERT INTO accounts(addr, balance, txCountAccount) VALUES(($1), ($2), ($3)) RETURNING addr`
insertErr := sqldb.QueryRow(sqlStatement, fromAddr, amount, accountNonceSen).Scan(&fromAddr) insertErr := sqldb.QueryRow(sqlStatement, fromAddr, amount, accountNonceSen).Scan(&fromAddr)
if insertErr != nil { if insertErr != nil {
@ -307,8 +294,6 @@ func WriteContractBalanceHelper(sqldb *sql.DB, tx *types.Transaction) (SendAndRe
//WriteFromBalance writes senders balance to accounts db //WriteFromBalance writes senders balance to accounts db
func WriteFromBalance(sqldb *sql.DB, tx *types.Transaction) error { func WriteFromBalance(sqldb *sql.DB, tx *types.Transaction) error {
//IF to address is nil (which means its contract creation)
//Need to create a condition (flag) check and then change how the nonce increment works
sendAndReceiveData, balanceRec, balanceSen, accountNonceRec, accountNonceSen := WriteBalanceHelper(sqldb, tx) sendAndReceiveData, balanceRec, balanceSen, accountNonceRec, accountNonceSen := WriteBalanceHelper(sqldb, tx)
toAddr := sendAndReceiveData.To toAddr := sendAndReceiveData.To
fromAddr := sendAndReceiveData.From fromAddr := sendAndReceiveData.From
@ -321,13 +306,10 @@ func WriteFromBalance(sqldb *sql.DB, tx *types.Transaction) error {
err := sqldb.QueryRow(sqlExistsStatement, toAddr).Scan(&response) err := sqldb.QueryRow(sqlExistsStatement, toAddr).Scan(&response)
switch { switch {
case err == sql.ErrNoRows: case err == sql.ErrNoRows:
fmt.Println("NO ROWS RAN")
i, err := strconv.Atoi(accountNonceRec) i, err := strconv.Atoi(accountNonceRec)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} }
//fmt.Println("accountnonce", i)
//fmt.Println(reflect.TypeOf(i))
sqlStatement := `INSERT INTO accounts(addr, balance, txCountAccount) VALUES(($1), ($2), ($3)) RETURNING addr` sqlStatement := `INSERT INTO accounts(addr, balance, txCountAccount) VALUES(($1), ($2), ($3)) RETURNING addr`
insertErr := sqldb.QueryRow(sqlStatement, toAddr, amount, i).Scan(&toAddr) insertErr := sqldb.QueryRow(sqlStatement, toAddr, amount, i).Scan(&toAddr)
if insertErr != nil { if insertErr != nil {
@ -611,19 +593,7 @@ func GetAllTransactions(sqldb *sql.DB) string {
var arr txRes var arr txRes
var txx string var txx string
rows, err := sqldb.Query(` rows, err := sqldb.Query(`
SELECT SELECT * FROM txs`)
txhash,
to_addr,
from_addr,
blockhash,
blocknumber,
amount,
gasprice,
gas,
txfee,
nonce,
data
FROM txs`)
if err != nil { if err != nil {
fmt.Println("err") fmt.Println("err")
} }
@ -637,8 +607,12 @@ func GetAllTransactions(sqldb *sql.DB) string {
var amount uint64 var amount uint64
var gasprice uint64 var gasprice uint64
var gas uint64 var gas uint64
var gasLimit uint64
var txfee uint64 var txfee uint64
var nonce uint64 var nonce uint64
var status string
var isContract bool
var age time.Time
var data []byte var data []byte
err = rows.Scan( err = rows.Scan(
&txhash, &txhash,
@ -649,8 +623,12 @@ func GetAllTransactions(sqldb *sql.DB) string {
&amount, &amount,
&gasprice, &gasprice,
&gas, &gas,
&gasLimit,
&txfee, &txfee,
&nonce, &nonce,
&status,
&isContract,
&age,
&data, &data,
) )
@ -663,8 +641,12 @@ func GetAllTransactions(sqldb *sql.DB) string {
Amount: amount, Amount: amount,
GasPrice: gasprice, GasPrice: gasprice,
Gas: gas, Gas: gas,
GasLimit: gasLimit,
Cost: txfee, Cost: txfee,
Nonce: nonce, Nonce: nonce,
Status: status,
IsContract: isContract,
Age: age,
Data: data, Data: data,
}) })
@ -687,20 +669,30 @@ func GetTransaction(sqldb *sql.DB, txHash string) string {
var amount uint64 var amount uint64
var gasprice uint64 var gasprice uint64
var gas uint64 var gas uint64
var gasLimit uint64
var txfee uint64 var txfee uint64
var nonce uint64 var nonce uint64
var status string
var isContract bool
var age time.Time
var data []byte var data []byte
row.Scan( row.Scan(
&txhash, &txhash,
&to_addr, &to_addr,
&from_addr, &from_addr,
&blockhash, &blockhash,
&blocknumber,
&amount, &amount,
&gasprice, &gasprice,
&gas, &gas,
&gasLimit,
&txfee, &txfee,
&nonce, &nonce,
&status,
&isContract,
&age,
&data) &data)
tx := ShyftTxEntryPretty{ tx := ShyftTxEntryPretty{
TxHash: txhash, TxHash: txhash,
To: to_addr, To: to_addr,
@ -710,8 +702,12 @@ func GetTransaction(sqldb *sql.DB, txHash string) string {
Amount: amount, Amount: amount,
GasPrice: gasprice, GasPrice: gasprice,
Gas: gas, Gas: gas,
GasLimit: gasLimit,
Cost: txfee, Cost: txfee,
Nonce: nonce, Nonce: nonce,
Status: status,
IsContract: isContract,
Age: age,
Data: data, Data: data,
} }
json, _ := json.Marshal(tx) json, _ := json.Marshal(tx)