lotus/lotuspond/front/src/Block.js

82 lines
3.0 KiB
JavaScript
Raw Normal View History

2019-07-25 17:06:10 +00:00
import React from 'react';
import {BlockLinks} from "./BlockLink";
2019-08-10 01:54:45 +00:00
import Address from "./Address";
2019-09-19 14:27:01 +00:00
import Window from "./Window";
2019-07-25 17:06:10 +00:00
class Block extends React.Component {
constructor(props) {
super(props)
this.state = {}
this.loadHeader()
}
async loadHeader() {
const header = await this.props.conn.call('Filecoin.ChainGetBlock', [this.props.cid])
2019-08-19 14:47:09 +00:00
let messages = await this.props.conn.call('Filecoin.ChainGetBlockMessages', [this.props.cid])
let receipts = await this.props.conn.call('Filecoin.ChainGetBlockReceipts', [this.props.cid])
2019-09-23 11:15:16 +00:00
const mcids = messages.Cids
2019-08-19 14:47:09 +00:00
messages = [
...(messages.BlsMessages.map(m => ({...m, type: 'BLS'}))),
...(messages.SecpkMessages.map(m => ({...(m.Message), type: 'Secpk'})))
]
messages = messages.map((msg, k) => ({...msg, receipt: receipts[k]}))
2019-09-23 11:15:16 +00:00
messages = await Promise.all(messages.map(async (msg, i) => {
if (msg.receipt.ExitCode !== 0) {
let reply = await this.props.conn.call('Filecoin.StateReplay', [{Cids: [this.props.cid], Blocks: [header], Height: header.Height}, mcids[i]])
if(!reply.Error) {
reply.Error = "reply: no error"
}
msg.Error = reply.Error
}
return msg
}))
this.setState({header: header, messages: messages})
2019-07-25 17:06:10 +00:00
}
render() {
let content = <div>Loading Block Info</div>
if (this.state.header) {
let head = this.state.header
2019-08-19 14:47:09 +00:00
const messages = this.state.messages.map(m => (
2019-07-25 17:06:10 +00:00
<div>
2019-09-23 11:15:16 +00:00
<div>
<Address client={this.props.conn} addr={m.From} mountWindow={this.props.mountWindow}/><b>&nbsp;=>&nbsp;</b>
<Address client={this.props.conn} addr={m.To} mountWindow={this.props.mountWindow} transfer={m.Value} method={m.Method}/>
<span>&nbsp;N{m.Nonce}</span>
<span>&nbsp;{m.receipt.GasUsed}Gas</span>
{m.receipt.ExitCode !== 0 ? <span>&nbsp;<b>EXIT:{m.receipt.ExitCode}</b></span> : <span/>}
</div>
{m.receipt.ExitCode !== 0 ? <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Error: <b>{m.Error}</b></div> : <span/>}
</div>
))
content = (
<div className="Block">
2019-07-25 17:06:10 +00:00
<div>Height: {head.Height}</div>
<div>Parents: <BlockLinks cids={head.Parents} conn={this.props.conn} mountWindow={this.props.mountWindow}/></div>
<div>Weight: {head.ParentWeight}</div>
2019-08-10 01:54:45 +00:00
<div>Miner: {<Address client={this.props.conn} addr={head.Miner} mountWindow={this.props.mountWindow}/>}</div>
2019-07-25 17:06:10 +00:00
<div>Messages: {head.Messages['/']} {/*TODO: link to message explorer */}</div>
<div>Receipts: {head.MessageReceipts['/']}</div>
<div>State Root:&nbsp;{head.StateRoot['/']}</div>
<div>----</div>
<div>{messages}</div>
2019-07-25 17:06:10 +00:00
</div>
)
}
2019-09-19 14:27:01 +00:00
return (<Window className="CristalScroll" initialSize={{width: 700, height: 400}} onClose={this.props.onClose} title={`Block ${this.props.cid['/']}`}>
2019-07-25 17:06:10 +00:00
{content}
2019-09-19 14:27:01 +00:00
</Window>)
2019-07-25 17:06:10 +00:00
}
}
export default Block