Skip to content

Commit

Permalink
add events subcommand; update contract events
Browse files Browse the repository at this point in the history
  • Loading branch information
jmank88 committed Apr 10, 2019
1 parent 6e731e7 commit 8ffd79d
Show file tree
Hide file tree
Showing 10 changed files with 256 additions and 60 deletions.
144 changes: 117 additions & 27 deletions cmd/gofs/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,27 @@ package main
import (
"context"
"crypto/ecdsa"
"encoding/hex"
"errors"
"fmt"
"math/big"
"os"
"os/signal"
"strings"
"syscall"
"text/tabwriter"
"time"

"github.com/gochain-io/gochain/v3/crypto"
"github.com/gochain-io/gochain/v3/common/hexutil"

"github.com/gochain-io/gofs"

"github.com/gochain-io/gochain/v3/common"
"github.com/gochain-io/gochain/v3/core/types"
"github.com/gochain-io/gochain/v3/crypto"
"github.com/gochain-io/web3"
cid "github.com/ipfs/go-cid"
"github.com/urfave/cli"

"github.com/gochain-io/gofs"
)

func main() {
Expand Down Expand Up @@ -87,9 +91,9 @@ func main() {
if dur == 0 {
return fmt.Errorf("duration missing or invalid")
}
contract, err := parseContract(contract)
contract, err := parseAddress(contract)
if err != nil {
return err
return fmt.Errorf("invalid contract: %v", err)
}
pkStr := c.String("private-key")
pk, err := crypto.HexToECDSA(strings.TrimPrefix(pkStr, "0x"))
Expand All @@ -103,16 +107,16 @@ func main() {
Name: "rate",
Usage: "Get the current storage rate in wei per GigaByteHour.",
Action: func(c *cli.Context) error {
contract, err := parseContract(contract)
contract, err := parseAddress(contract)
if err != nil {
return err
return fmt.Errorf("invalid contract: %v", err)
}
return Rate(ctx, rpc, contract)
},
},
{
Name: "cost",
Usage: "Get the current storage cost in wei for the given GigaByteHour.",
Usage: "Get the current storage cost in wei for the given size and duration.",
Flags: []cli.Flag{
cli.Uint64Flag{
Name: "duration, d",
Expand All @@ -134,9 +138,9 @@ func main() {
if size == 0 {
return fmt.Errorf("size missing or invalid")
}
contract, err := parseContract(contract)
contract, err := parseAddress(contract)
if err != nil {
return err
return fmt.Errorf("invalid contract: %v", err)
}
return Cost(ctx, rpc, contract, size, dur)
},
Expand Down Expand Up @@ -170,40 +174,99 @@ func main() {
return Status(ctx, api, cid)
},
},
//TODO gofs logs CID (filter logs, start/end blocks)
//TODO by user too? do we need to index user in the event?
{
Name: "events",
Usage: "Get Pinned events from filtered logs.",
Flags: []cli.Flag{
cli.StringFlag{
Name: "hash",
Usage: "Specific block hash",
},
cli.Int64Flag{
Name: "from",
Usage: "Starting block number.",
},
cli.Int64Flag{
Name: "to",
Usage: "Ending block number.",
},
cli.StringFlag{
Name: "cid",
Usage: "CID to filter on.",
},
cli.StringFlag{
Name: "user",
Usage: "User to filter on.",
},
},
Action: func(c *cli.Context) error {
contract, err := parseAddress(contract)
if err != nil {
return fmt.Errorf("invalid contract: %v", err)
}
var f gofs.EventFilter
if c.IsSet("hash") {
hash := c.String("hash")
b, err := hex.DecodeString(strings.TrimPrefix(hash, "0x"))
if err != nil {
return fmt.Errorf("invalid hex for hash %q: %v", hash, err)
} else if len(b) != common.HashLength {
return fmt.Errorf("invalid hash len %d bytes: must be %d", len(b), common.HashLength)
}
h := common.BytesToHash(b)
f.Hash = &h
}
if c.IsSet("from") {
f.From = big.NewInt(c.Int64("from"))
}
if c.IsSet("to") {
f.To = big.NewInt(c.Int64("to"))
}
f.CID = c.String("cid")
if c.IsSet("user") {
if a, err := parseAddress(c.String("user")); err != nil {
return fmt.Errorf("invalid user: %v", err)
} else {
f.User = &a
}
}

return Events(ctx, rpc, contract, f)
},
},
}
err := app.Run(os.Args)
if err != nil {
fmt.Fprintf(os.Stderr, "ERROR: %v\n", err)
}
}

func parseContract(contract string) (common.Address, error) {
if !common.IsHexAddress(contract) {
return common.Address{}, fmt.Errorf("invalid hex contract address: %s", contract)
func parseAddress(addr string) (common.Address, error) {
if !common.IsHexAddress(addr) {
return common.Address{}, fmt.Errorf("invalid hex address: %s", addr)
}
return common.HexToAddress(contract), nil
return common.HexToAddress(addr), nil
}

func Pin(ctx context.Context, url string, contract common.Address, pk *ecdsa.PrivateKey, ci string, dur uint64) error {
h, r, err := gofs.Pin(ctx, url, contract, pk, ci, dur)
func Pin(ctx context.Context, rpcURL string, contract common.Address, pk *ecdsa.PrivateKey, ci string, dur uint64) error {
h, r, err := gofs.Pin(ctx, rpcURL, contract, pk, ci, dur)
if err != nil {
return fmt.Errorf("failed to pin: %v", err)
}
switch r.Status {
case types.ReceiptStatusFailed:
return fmt.Errorf("tx %s failed", h.Hex())
case types.ReceiptStatusSuccessful:
fmt.Printf("Purchased %d GigaByte Hours of storage for %s with tx %s.\n", dur, ci, h.Hex())
fmt.Printf("Purchased %d GigaByte Hours of storage for %s.\n", dur, ci)
fmt.Printf(`https://testnet-explorer.gochain.io/tx/%s`, h.Hex())
return nil
default:
return fmt.Errorf("tx %s unrecognized receipt status: %d", h.Hex(), r.Status)
}
}

func Add(ctx context.Context, url, path string) error {
ar, err := gofs.AddFile(ctx, url, path)
func Add(ctx context.Context, apiURL, path string) error {
ar, err := gofs.AddFile(ctx, apiURL, path)
if err != nil {
return fmt.Errorf("failed to add file %q: %v", path, err)
}
Expand All @@ -212,8 +275,8 @@ func Add(ctx context.Context, url, path string) error {
return nil
}

func Cost(ctx context.Context, rpcurl string, contract common.Address, size, dur uint64) error {
_, cost, err := gofs.Cost(ctx, rpcurl, contract, size, dur)
func Cost(ctx context.Context, rpcURL string, contract common.Address, size, dur uint64) error {
_, cost, err := gofs.Cost(ctx, rpcURL, contract, size, dur)
if err != nil {
return err
}
Expand All @@ -227,8 +290,8 @@ func costStr(size uint64, dur uint64, cost *big.Int) string {
return fmt.Sprintf("%d GBs for %s: %s GO", size, time.Duration(dur)*time.Hour, web3.WeiAsBase(cost))
}

func Rate(ctx context.Context, rpcurl string, contract common.Address) error {
rate, err := gofs.Rate(ctx, rpcurl, contract)
func Rate(ctx context.Context, rpcURL string, contract common.Address) error {
rate, err := gofs.Rate(ctx, rpcURL, contract)
if err != nil {
return err
}
Expand Down Expand Up @@ -257,8 +320,8 @@ func Rate(ctx context.Context, rpcurl string, contract common.Address) error {
return nil
}

func Status(ctx context.Context, url, ci string) error {
st, err := gofs.Status(ctx, url, ci)
func Status(ctx context.Context, apiURL, ci string) error {
st, err := gofs.Status(ctx, apiURL, ci)
if err != nil {
return err
}
Expand All @@ -274,3 +337,30 @@ func Status(ctx context.Context, url, ci string) error {

return nil
}

func Events(ctx context.Context, rpcURL string, contract common.Address, f gofs.EventFilter) error {
events, err := gofs.Events(ctx, rpcURL, contract, f)
if err != nil {
return err
}
w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', 0)
fmt.Fprintln(w, "Block\tTx\tLog\tRemoved\tCID\tGBH\t")
for _, e := range events {
ci, err := cid.Parse(e.Cid)
if err != nil {
return fmt.Errorf("invalid cid %s: %v", hexutil.Encode(e.Cid), err)
}
fmt.Fprintf(w,
"%d\t%d\t%d\t%t\t%s\t%d\t\n",
e.Raw.BlockNumber, //TODO why are all these idxs 0?
e.Raw.TxIndex,
e.Raw.Index,
e.Raw.Removed,
ci.String(),
e.Gbh,
)
}
w.Flush()

return nil
}
10 changes: 10 additions & 0 deletions contracts/GOFSPinner.abi
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,16 @@
"inputs": [
{
"indexed": true,
"name": "user",
"type": "address"
},
{
"indexed": true,
"name": "cidIdx",
"type": "bytes"
},
{
"indexed": false,
"name": "cid",
"type": "bytes"
},
Expand Down
2 changes: 1 addition & 1 deletion contracts/GOFSPinner.bin
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0x608060405234801561001057600080fd5b506040516020806104f68339810180604052602081101561003057600080fd5b505160008054600160a060020a031916331790556001554360025561049c8061005a6000396000f3fe60806040526004361061005b577c010000000000000000000000000000000000000000000000000000000060003504632c4e722e811461006057806334fcf4371461008757806393b862fe146100c5578063f905c15a1461016d575b600080fd5b34801561006c57600080fd5b50610075610182565b60408051918252519081900360200190f35b34801561009357600080fd5b506100b1600480360360208110156100aa57600080fd5b5035610188565b604080519115158252519081900360200190f35b6100b1600480360360408110156100db57600080fd5b8101906020810181356401000000008111156100f657600080fd5b82018360208201111561010857600080fd5b8035906020019184600183028401116401000000008311171561012a57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610202915050565b34801561017957600080fd5b50610075610448565b60015481565b6000805473ffffffffffffffffffffffffffffffffffffffff1633146101f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061044f6022913960400191505060405180910390fd5b60019190915590565b600082600081518110151561021357fe5b90602001015160f860020a900460f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916601260f860020a021480156102a6575082600181518110151561026757fe5b90602001015160f860020a900460f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916602060f860020a02145b1561031257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f56657273696f6e203020434944206e6f7420616c6c6f77656400000000000000604482015290519081900360640190fd5b60015482023481111561038657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f56616c756520746f6f206c6f772e000000000000000000000000000000000000604482015290519081900360640190fd5b60405133903483900380156108fc02916000818181858888f193505050501580156103b5573d6000803e3d6000fd5b50836040518082805190602001908083835b602083106103e65780518252601f1990920191602091820191016103c7565b51815160209384036101000a60001901801990921691161790526040805192909401829003822089835293519395507fa0d90cefad6d4f81c3b726e011627beb8a079c24c0215d178fcb1225ae9ea6d494509083900301919050a25092915050565b6002548156fe4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e2ea165627a7a723058207a5287ec447ab30a8698bdce3c3de8e185810bc67160feaa3358e3cd7a64fc440029
0x608060405234801561001057600080fd5b506040516020806105808339810180604052602081101561003057600080fd5b505160008054600160a060020a03191633179055600155436002556105268061005a6000396000f3fe60806040526004361061005b577c010000000000000000000000000000000000000000000000000000000060003504632c4e722e811461006057806334fcf4371461008757806393b862fe146100c5578063f905c15a1461016d575b600080fd5b34801561006c57600080fd5b50610075610182565b60408051918252519081900360200190f35b34801561009357600080fd5b506100b1600480360360208110156100aa57600080fd5b5035610188565b604080519115158252519081900360200190f35b6100b1600480360360408110156100db57600080fd5b8101906020810181356401000000008111156100f657600080fd5b82018360208201111561010857600080fd5b8035906020019184600183028401116401000000008311171561012a57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610202915050565b34801561017957600080fd5b506100756104d2565b60015481565b6000805473ffffffffffffffffffffffffffffffffffffffff1633146101f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806104d96022913960400191505060405180910390fd5b60019190915590565b600082600081518110151561021357fe5b90602001015160f860020a900460f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916601260f860020a021480156102a6575082600181518110151561026757fe5b90602001015160f860020a900460f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916602060f860020a02145b1561031257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f56657273696f6e203020434944206e6f7420616c6c6f77656400000000000000604482015290519081900360640190fd5b60015482023481111561038657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f56616c756520746f6f206c6f772e000000000000000000000000000000000000604482015290519081900360640190fd5b60405133903483900380156108fc02916000818181858888f193505050501580156103b5573d6000803e3d6000fd5b50836040518082805190602001908083835b602083106103e65780518252601f1990920191602091820191016103c7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390203373ffffffffffffffffffffffffffffffffffffffff167f4d6efb9bd2f38e3cafaf5d932ce16579df65d7653204e2cb666e874edaafb68e86866040518080602001838152602001828103825284818151815260200191508051906020019080838360005b83811015610490578181015183820152602001610478565b50505050905090810190601f1680156104bd5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a35092915050565b6002548156fe4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e2ea165627a7a72305820f6a793ec8355f43396dd0fe2814a38e083283282be8135324bc19930d75393f70029
10 changes: 10 additions & 0 deletions contracts/Pinner.abi
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,16 @@
"inputs": [
{
"indexed": true,
"name": "user",
"type": "address"
},
{
"indexed": true,
"name": "cidIdx",
"type": "bytes"
},
{
"indexed": false,
"name": "cid",
"type": "bytes"
},
Expand Down
2 changes: 1 addition & 1 deletion contracts/owned.bin
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0x6080604052348015600f57600080fd5b5060008054600160a060020a03191633179055603580602f6000396000f3fe6080604052600080fdfea165627a7a72305820a6fa1b62fd9ec4ba497c37301a5aaeab61ce4d2737fb1accec68c74bfb832a8c0029
0x6080604052348015600f57600080fd5b5060008054600160a060020a03191633179055603580602f6000396000f3fe6080604052600080fdfea165627a7a7230582021f92166fec503bbbf7e744be3ba1ea5f0bf8f456fe32a457e043ced758478220029
4 changes: 2 additions & 2 deletions contracts/pinner.sol
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ interface Pinner {

function pin(bytes calldata cid, uint gbh) external payable returns (bool);

event Pinned(bytes indexed cid, uint gbh);
event Pinned(address indexed user, bytes indexed cidIdx, bytes cid, uint gbh);
}


Expand Down Expand Up @@ -61,6 +61,6 @@ contract GOFSPinner is Pinner, owned {
);
// refund excess
msg.sender.transfer(msg.value - cost);
emit Pinned(cid, gbh);
emit Pinned(msg.sender, cid, cid, gbh);
}
}
5 changes: 3 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ go 1.12

require (
github.com/aristanetworks/goarista v0.0.0-20190319235110-489128639c40 // indirect
github.com/gochain-io/gochain/v3 v3.0.11
github.com/gochain-io/gochain/v3 v3.1.14
github.com/gochain-io/web3 v0.0.36
github.com/hashicorp/golang-lru v0.5.1 // indirect
github.com/ipfs/go-cid v0.0.1
Expand All @@ -14,6 +14,7 @@ require (
github.com/urfave/cli v1.20.0
go.opencensus.io v0.19.1 // indirect
golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576 // indirect
golang.org/x/net v0.0.0-20190311183353-d8887717615a // indirect
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 // indirect
golang.org/x/tools v0.0.0-20190320215829-36c10c0a621f // indirect
golang.org/x/tools v0.0.0-20190121143147-24cd39ecf745 // indirect
)
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gochain-io/gochain/v3 v3.0.11 h1:3ykaUoRnAFTPIw8ajnIb8e40ftR/Y267dKZWZSWFeF8=
github.com/gochain-io/gochain/v3 v3.0.11/go.mod h1:e+h1qGhr65M3MlO3kOnXRMXq6Btu8GJnOZWeCXauy9I=
github.com/gochain-io/gochain/v3 v3.1.14 h1:K9ktWBD8+oSJEi9ZOQVf/LvVS7a8qWrbrlMj3INnHdk=
github.com/gochain-io/gochain/v3 v3.1.14/go.mod h1:NbUyql/tzg4zjBiOW0kirbk7hvlBKO1Php4IaQQv47A=
github.com/gochain-io/web3 v0.0.36 h1:lKrRpXF/A2wVqONKJkKJadG1ZaiX6NDcQmI/6m0uCUg=
github.com/gochain-io/web3 v0.0.36/go.mod h1:YMqsKiDz8bpX8LnJEFgsK/RoJG+iE7T2NbUmbZxYPS0=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
Expand Down Expand Up @@ -246,8 +248,6 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190121143147-24cd39ecf745/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190320215829-36c10c0a621f h1:1ZEOEQCgHwWeZkEp7AeN0DROZtO+h0NDRxtar5CdyYQ=
golang.org/x/tools v0.0.0-20190320215829-36c10c0a621f/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
google.golang.org/api v0.0.0-20180904000447-0ad5a633fea1/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
Expand Down
Loading

0 comments on commit 8ffd79d

Please sign in to comment.