Merge branch 'feat/chainwatch-stuff' into feat/chainwatch-pg
This commit is contained in:
commit
3d666b3992
61
cmd/lotus-chainwatch/site/block.html
Normal file
61
cmd/lotus-chainwatch/site/block.html
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Lotus ChainWatch</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="main.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{{$cid := param "cid"}}
|
||||||
|
|
||||||
|
<div class="Index">
|
||||||
|
<div class="Index-header">
|
||||||
|
<div>
|
||||||
|
<span>Lotus ChainWatch - Wallets</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="Index-nodes">
|
||||||
|
<div class="Index-node">
|
||||||
|
<div>Miner: {{index (strings "blocks" "miner" "cid=?" $cid) 0}}</div>
|
||||||
|
<div>Parents:</div>
|
||||||
|
<div>
|
||||||
|
{{range strings "block_parents" "parent" "block=?" $cid}}
|
||||||
|
{{$parent := .}}
|
||||||
|
<a href="block.html?cid={{$parent}}">{{. | substr 54 62}}</a>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
<div>Messages:</div>
|
||||||
|
<table>
|
||||||
|
{{range strings "block_messages" "message" "block=?" $cid}}
|
||||||
|
{{$msg := .}}
|
||||||
|
<tr>
|
||||||
|
<td><a href="message.html?cid={{$msg}}">{{$msg | substr 54 62}}</a></td>
|
||||||
|
<td>
|
||||||
|
{{$from := qstr "select \"from\" from messages where cid=?" $msg}}
|
||||||
|
{{$nonce := qstr "select nonce from messages where cid=?" $msg}}
|
||||||
|
<a href="key.html?w={{$from}}">{{$from}}</a> (N:{{$nonce}})
|
||||||
|
</td>
|
||||||
|
<td>-></td>
|
||||||
|
<td>
|
||||||
|
{{$to := qstr "select \"to\" from messages where cid=?" $msg}}
|
||||||
|
<a href="key.html?w={{$to}}">{{$to}}</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
Method:<b>{{qstr "select method from messages where cid=?" $msg}}</b>
|
||||||
|
</td>
|
||||||
|
{{$rec := qstrs `select r.exit, r.gas_used from messages
|
||||||
|
inner join block_messages bm on messages.cid = bm.message
|
||||||
|
inner join blocks b on bm.block = b.cid
|
||||||
|
inner join block_parents bp on b.cid = bp.parent
|
||||||
|
inner join blocks chd on bp.block = chd.cid
|
||||||
|
inner join receipts r on messages.cid = r.msg and chd.parentStateRoot = r.state
|
||||||
|
where messages.cid=? and b.cid=?` 2 $msg $cid}}
|
||||||
|
<td>exit:<b>{{index $rec 0}}</b></td>
|
||||||
|
<td>gasUsed:<b>{{index $rec 1}}</b></td>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
43
cmd/lotus-chainwatch/site/blocks.html
Normal file
43
cmd/lotus-chainwatch/site/blocks.html
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Lotus ChainWatch</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="main.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{{$start := param "start" | parseInt}}
|
||||||
|
|
||||||
|
<div class="Index">
|
||||||
|
<div class="Index-header">
|
||||||
|
<div>
|
||||||
|
<span>Lotus ChainWatch - Wallets</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="Index-nodes">
|
||||||
|
<div class="Index-node">
|
||||||
|
<table>
|
||||||
|
{{range pageDown $start 50}}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
{{$h := .}}
|
||||||
|
{{$h}};
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<b>{{qstr `select count(distinct block_messages.message) from block_messages
|
||||||
|
inner join blocks b on block_messages.block = b.cid
|
||||||
|
where b.height = ?` $h}}</b> Msgs
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{range strings "blocks" "cid" "height = ?" $h}}
|
||||||
|
<a href="block.html?cid={{.}}">{{. | substr 54 62}}</a>
|
||||||
|
{{end}}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
</table>
|
||||||
|
<a href="blocks.html?start={{sub $start 50}}">Next 50</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -26,6 +26,11 @@
|
|||||||
{{count "id_address_map" "id != address"}} <a href="keys.html">Keys</a>;
|
{{count "id_address_map" "id != address"}} <a href="keys.html">Keys</a>;
|
||||||
E% FIL in wallets; F% FIL in miners; M% in market; %G Other actors; %H FIL it treasury
|
E% FIL in wallets; F% FIL in miners; M% in market; %G Other actors; %H FIL it treasury
|
||||||
</div>
|
</div>
|
||||||
|
<div class="Index-node">
|
||||||
|
{{$maxH := queryNum "select max(height) from blocks inner join blocks_synced bs on blocks.cid = bs.cid"}}
|
||||||
|
|
||||||
|
{{count "blocks"}} <a href="blocks.html?start={{$maxH}}">Blocks</a>; Current Height: {{$maxH}};
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
@ -24,9 +24,9 @@
|
|||||||
{{ range messages "\"from\" = $1 or \"to\" = $1" $wallet}}
|
{{ range messages "\"from\" = $1 or \"to\" = $1" $wallet}}
|
||||||
<tr>
|
<tr>
|
||||||
{{ if eq .From.String $wallet }}
|
{{ if eq .From.String $wallet }}
|
||||||
<td>To</td><td>{{.To.String}}</td>
|
<td>To</td><td><a href="key.html?w={{.To.String}}">{{.To.String}}</a></td>
|
||||||
{{else}}
|
{{else}}
|
||||||
<td>From</td><td>{{.From.String}}</td>
|
<td>From</td><td><a href="key.html?w={{.From.String}}">{{.From.String}}</a></td>
|
||||||
{{end}}
|
{{end}}
|
||||||
<td>{{.Nonce}}</td>
|
<td>{{.Nonce}}</td>
|
||||||
<td>{{.Value}}</td>
|
<td>{{.Value}}</td>
|
||||||
|
@ -14,7 +14,12 @@
|
|||||||
<div class="Index-nodes">
|
<div class="Index-nodes">
|
||||||
<div class="Index-node">
|
<div class="Index-node">
|
||||||
{{range strings "id_address_map" "address" "address != id"}}
|
{{range strings "id_address_map" "address" "address != id"}}
|
||||||
<div><a href="key.html?w={{.}}">{{.}}</a></div>
|
{{$addr := .}}
|
||||||
|
<div>
|
||||||
|
<a href="key.html?w={{$addr}}">{{$addr}}</a>
|
||||||
|
<span><b>{{qstr "select count(distinct cid) from messages where \"from\"=?" $addr}}</b> outmsgs;</span>
|
||||||
|
<span><b>{{qstr "select count(distinct cid) from messages where \"to\"=?" $addr}}</b> inmsgs</span>
|
||||||
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -6,6 +6,10 @@ body {
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
b {
|
||||||
|
color: #aff;
|
||||||
|
}
|
||||||
|
|
||||||
.Index {
|
.Index {
|
||||||
width: 100vw;
|
width: 100vw;
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
|
@ -6,6 +6,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
rice "github.com/GeertJohan/go.rice"
|
rice "github.com/GeertJohan/go.rice"
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
@ -42,8 +43,15 @@ func newHandler(api api.FullNode, st *storage) (*handler, error) {
|
|||||||
"queryNum": h.queryNum,
|
"queryNum": h.queryNum,
|
||||||
"sizeStr": sizeStr,
|
"sizeStr": sizeStr,
|
||||||
"strings": h.strings,
|
"strings": h.strings,
|
||||||
|
"qstr": h.qstr,
|
||||||
|
"qstrs": h.qstrs,
|
||||||
"messages": h.messages,
|
"messages": h.messages,
|
||||||
|
|
||||||
|
"pageDown": pageDown,
|
||||||
|
"parseInt": func(s string) (int, error) {i, e := strconv.ParseInt(s, 10, 64); return int(i), e},
|
||||||
|
"substr": func(i, j int, s string,) string {return s[i:j]},
|
||||||
|
"sub": func(a, b int) int {return a - b}, // TODO: really not builtin?
|
||||||
|
|
||||||
"param": func(string) string { return "" }, // replaced in request handler
|
"param": func(string) string { return "" }, // replaced in request handler
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -192,7 +200,7 @@ func (h *handler) strings(table string, col string, filter string, args ...inter
|
|||||||
if len(filter) > 0 {
|
if len(filter) > 0 {
|
||||||
filter = " where " + filter
|
filter = " where " + filter
|
||||||
}
|
}
|
||||||
log.Info("strings qstr ", "select "+col+" from "+table+filter)
|
log.Info("strings qstr ", "select "+col+" from "+table+filter, args)
|
||||||
rws, err := h.st.db.Query("select "+col+" from "+table+filter, args...)
|
rws, err := h.st.db.Query("select "+col+" from "+table+filter, args...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -208,6 +216,33 @@ func (h *handler) strings(table string, col string, filter string, args ...inter
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *handler) qstr(q string, p ...interface{}) (string, error) {
|
||||||
|
// explicitly not caring about sql injection too much, this doesn't take user input
|
||||||
|
|
||||||
|
r, err := h.qstrs(q, 1, p...)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return r[0], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *handler) qstrs(q string, n int, p ...interface{}) ([]string, error) {
|
||||||
|
// explicitly not caring about sql injection too much, this doesn't take user input
|
||||||
|
|
||||||
|
c := make([]string, n)
|
||||||
|
ia := make([]interface{}, n)
|
||||||
|
for i := range c {
|
||||||
|
ia[i] = &c[i]
|
||||||
|
}
|
||||||
|
err := h.st.db.QueryRow(q, p...).Scan(ia...)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("qnum ", q, p, err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return c, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (h *handler) messages(filter string, args ...interface{}) (out []types.Message, err error) {
|
func (h *handler) messages(filter string, args ...interface{}) (out []types.Message, err error) {
|
||||||
if len(filter) > 0 {
|
if len(filter) > 0 {
|
||||||
filter = " where " + filter
|
filter = " where " + filter
|
||||||
@ -251,4 +286,13 @@ func (h *handler) messages(filter string, args ...interface{}) (out []types.Mess
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func pageDown(base, n int) []int {
|
||||||
|
out := make([]int, n)
|
||||||
|
for i := range out {
|
||||||
|
out[i] = base - i
|
||||||
|
}
|
||||||
|
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
var _ http.Handler = &handler{}
|
var _ http.Handler = &handler{}
|
||||||
|
Loading…
Reference in New Issue
Block a user