@ -0,0 +1,18 @@ |
|||||
|
# Binaries for programs and plugins |
||||
|
*.exe |
||||
|
*.dll |
||||
|
*.so |
||||
|
*.dylib |
||||
|
|
||||
|
# Test binary, build with `go test -c` |
||||
|
*.test |
||||
|
|
||||
|
# Output of the go coverage tool, specifically when used with LiteIDE |
||||
|
*.out |
||||
|
|
||||
|
# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 |
||||
|
.glide/ |
||||
|
|
||||
|
|
||||
|
*.conf |
||||
|
*.json |
@ -0,0 +1,9 @@ |
|||||
|
package main |
||||
|
|
||||
|
import "fmt" |
||||
|
|
||||
|
func check(err error) { |
||||
|
if err != nil { |
||||
|
fmt.Println(err) |
||||
|
} |
||||
|
} |
@ -0,0 +1,70 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"fmt" |
||||
|
|
||||
|
"github.com/btcsuite/btcd/chaincfg/chainhash" |
||||
|
"github.com/btcsuite/btcrpcclient" |
||||
|
) |
||||
|
|
||||
|
func explore(client *btcrpcclient.Client, blockHash string) { |
||||
|
for blockHash != "" { |
||||
|
//generate hash from string
|
||||
|
bh, err := chainhash.NewHashFromStr(blockHash) |
||||
|
check(err) |
||||
|
fmt.Print("blockHash: ") |
||||
|
fmt.Println(bh) |
||||
|
block, err := client.GetBlockVerbose(bh) |
||||
|
check(err) |
||||
|
fmt.Print("height: ") |
||||
|
fmt.Println(block.Height) |
||||
|
fmt.Print("rawTx: ") |
||||
|
fmt.Println(block.RawTx) |
||||
|
fmt.Print("Tx: ") |
||||
|
fmt.Println(block.Tx) |
||||
|
fmt.Print("Time: ") |
||||
|
fmt.Println(block.Time) |
||||
|
fmt.Print("Confirmations: ") |
||||
|
fmt.Println(block.Confirmations) |
||||
|
|
||||
|
fmt.Print("Fee: ") |
||||
|
th, err := chainhash.NewHashFromStr(block.Tx[0]) |
||||
|
check(err) |
||||
|
tx, err := client.GetRawTransactionVerbose(th) |
||||
|
check(err) |
||||
|
|
||||
|
var totalFee float64 |
||||
|
for _, Vo := range tx.Vout { |
||||
|
totalFee = totalFee + Vo.Value |
||||
|
} |
||||
|
fmt.Print("totalFee: ") |
||||
|
fmt.Print(totalFee) |
||||
|
fmt.Println(" FAIR") |
||||
|
|
||||
|
//for each Tx, get the Tx value
|
||||
|
var totalAmount float64 |
||||
|
for k, txHash := range block.Tx { |
||||
|
//first Tx is the Fee
|
||||
|
//after first Tx is the Sent Amount
|
||||
|
if k > 0 { |
||||
|
th, err := chainhash.NewHashFromStr(txHash) |
||||
|
check(err) |
||||
|
fmt.Print("tx hash: ") |
||||
|
fmt.Println(th) |
||||
|
tx, err := client.GetRawTransactionVerbose(th) |
||||
|
check(err) |
||||
|
for _, Vo := range tx.Vout { |
||||
|
totalAmount = totalAmount + Vo.Value |
||||
|
} |
||||
|
fmt.Print("totalAmount: ") |
||||
|
fmt.Print(totalAmount) |
||||
|
fmt.Println(" FAIR") |
||||
|
} |
||||
|
} |
||||
|
fmt.Println("-----") |
||||
|
|
||||
|
//set the next block
|
||||
|
blockHash = block.NextHash |
||||
|
} |
||||
|
fmt.Println("reached the end of blockchain") |
||||
|
} |
@ -0,0 +1,32 @@ |
|||||
|
# Instructions |
||||
|
|
||||
|
#### Install FairCoin Wallet and configure |
||||
|
now, need to configure wallet: |
||||
|
.FairCoin/ |
||||
|
FairCoin.conf |
||||
|
|
||||
|
``` |
||||
|
rpcuser=usernamerpc |
||||
|
rpcpassword=password |
||||
|
rpcport=3021 |
||||
|
rpcworkqueue=2000 |
||||
|
server=1 |
||||
|
rpcbind=127.0.0.1 |
||||
|
rpcallowip=127.0.0.1 |
||||
|
``` |
||||
|
|
||||
|
execute wallet: |
||||
|
./FairCoind -txindex -reindex-chainstate |
||||
|
|
||||
|
### Configure |
||||
|
|
||||
|
```json |
||||
|
{ |
||||
|
"user": "faircoinrpc", |
||||
|
"pass": "password", |
||||
|
"host": "127.0.0.1", |
||||
|
"port": "3021", |
||||
|
"genesisTx": "7c27ade2c28e67ed3077f8f77b8ea6d36d4f5eba04c099be3c9faa9a4a04c046", |
||||
|
"genesisBlock": "beed44fa5e96150d95d56ebd5d2625781825a9407a5215dd7eda723373a0a1d7" |
||||
|
} |
||||
|
``` |
@ -0,0 +1,43 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"log" |
||||
|
|
||||
|
"github.com/btcsuite/btcrpcclient" |
||||
|
) |
||||
|
|
||||
|
func main() { |
||||
|
|
||||
|
readConfig("config.json") |
||||
|
|
||||
|
// create new client instance
|
||||
|
client, err := btcrpcclient.New(&btcrpcclient.ConnConfig{ |
||||
|
HTTPPostMode: true, |
||||
|
DisableTLS: true, |
||||
|
Host: config.Host + ":" + config.Port, |
||||
|
User: config.User, |
||||
|
Pass: config.Pass, |
||||
|
}, nil) |
||||
|
if err != nil { |
||||
|
log.Fatalf("error creating new btc client: %v", err) |
||||
|
} |
||||
|
|
||||
|
// list accounts
|
||||
|
accounts, err := client.ListAccounts() |
||||
|
if err != nil { |
||||
|
log.Fatalf("error listing accounts: %v", err) |
||||
|
} |
||||
|
// iterate over accounts (map[string]btcutil.Amount) and write to stdout
|
||||
|
for label, amount := range accounts { |
||||
|
log.Printf("%s: %s", label, amount) |
||||
|
} |
||||
|
|
||||
|
explore(client, config.GenesisBlock) |
||||
|
|
||||
|
// Get the current block count.
|
||||
|
blockCount, err := client.GetBlockCount() |
||||
|
if err != nil { |
||||
|
log.Fatal(err) |
||||
|
} |
||||
|
log.Printf("Block count: %d", blockCount) |
||||
|
} |
@ -0,0 +1,24 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"encoding/json" |
||||
|
"io/ioutil" |
||||
|
) |
||||
|
|
||||
|
type Config struct { |
||||
|
User string `json:"user"` |
||||
|
Pass string `json:"pass"` |
||||
|
Host string `json:"host"` |
||||
|
Port string `json:"port"` |
||||
|
GenesisTx string `json:"genesisTx"` |
||||
|
GenesisBlock string `json:"genesisBlock"` |
||||
|
} |
||||
|
|
||||
|
var config Config |
||||
|
|
||||
|
func readConfig(path string) { |
||||
|
file, err := ioutil.ReadFile(path) |
||||
|
check(err) |
||||
|
content := string(file) |
||||
|
json.Unmarshal([]byte(content), &config) |
||||
|
} |