mirror of https://github.com/ethereum/go-ethereum
commit
75d164037f
@ -1 +1,64 @@ |
||||
var contract = web3.eth.contractFromAbi([{"constant":false,"inputs":[{"name":"_h","type":"hash256"}],"name":"confirm","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"execute","outputs":[{"name":"_r","type":"hash256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"kill","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"changeOwner","outputs":[],"type":"function"},{"inputs":[{"indexed":false,"name":"value","type":"uint256"}],"name":"CashIn","type":"event"},{"inputs":[{"indexed":true,"name":"out","type":"string32"},{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"}],"name":"SingleTransact","type":"event"},{"inputs":[{"indexed":true,"name":"out","type":"string32"},{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"hash256"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"}],"name":"MultiTransact","type":"event"}]); |
||||
var contract = web3.eth.contractFromAbi([ |
||||
{ |
||||
"constant":false, |
||||
"inputs":[ |
||||
{"name":"_h","type":"hash256"} |
||||
], |
||||
"name":"confirm", |
||||
"outputs":[], |
||||
"type":"function" |
||||
},{ |
||||
"constant":false, |
||||
"inputs":[ |
||||
{"name":_to,"type":"address"}, |
||||
{"name":"_value","type":"uint256"}, |
||||
{"name":"_data","type":"bytes"} |
||||
], |
||||
"name":"execute", |
||||
"outputs":[ |
||||
{"name":"_r","type":"hash256"} |
||||
], |
||||
"type":"function" |
||||
},{ |
||||
"constant":false, |
||||
"inputs":[ |
||||
{"name":"_to","type":"address"} |
||||
],"name":"kill", |
||||
"outputs":[], |
||||
"type":"function" |
||||
},{ |
||||
"constant":false, |
||||
"inputs":[ |
||||
{"name":"_from","type":"address"}, |
||||
{"name":"_to","type":"address"} |
||||
], |
||||
"name":"changeOwner", |
||||
"outputs":[], |
||||
"type":"function" |
||||
},{ |
||||
"inputs":[ |
||||
{"indexed":false,"name":"value","type":"uint256"} |
||||
], |
||||
"name":"CashIn", |
||||
"type":"event" |
||||
},{ |
||||
"inputs":[ |
||||
{"indexed":true,"name":"out","type":"string32"}, |
||||
{"indexed":false,"name":"owner","type":"address"}, |
||||
{"indexed":false,"name":"value","type":"uint256"}, |
||||
{"indexed":false,"name":"to","type":"address"} |
||||
], |
||||
"name":"SingleTransact", |
||||
"type":"event" |
||||
},{ |
||||
"inputs":[ |
||||
{"indexed":true,"name":"out","type":"string32"}, |
||||
{"indexed":false,"name":"owner","type":"address"}, |
||||
{"indexed":false,"name":"operation","type":"hash256"}, |
||||
{"indexed":false,"name":"value","type":"uint256"}, |
||||
{"indexed":false,"name":"to","type":"address"} |
||||
], |
||||
"name":"MultiTransact", |
||||
"type":"event" |
||||
} |
||||
]); |
||||
|
@ -0,0 +1,63 @@ |
||||
package logger |
||||
|
||||
import ( |
||||
"io" |
||||
"log" |
||||
"sync/atomic" |
||||
) |
||||
|
||||
// LogSystem is implemented by log output devices.
|
||||
// All methods can be called concurrently from multiple goroutines.
|
||||
type LogSystem interface { |
||||
GetLogLevel() LogLevel |
||||
SetLogLevel(i LogLevel) |
||||
LogPrint(LogLevel, string) |
||||
} |
||||
|
||||
// NewStdLogSystem creates a LogSystem that prints to the given writer.
|
||||
// The flag values are defined package log.
|
||||
func NewStdLogSystem(writer io.Writer, flags int, level LogLevel) LogSystem { |
||||
logger := log.New(writer, "", flags) |
||||
return &stdLogSystem{logger, uint32(level)} |
||||
} |
||||
|
||||
type stdLogSystem struct { |
||||
logger *log.Logger |
||||
level uint32 |
||||
} |
||||
|
||||
func (t *stdLogSystem) LogPrint(level LogLevel, msg string) { |
||||
t.logger.Print(msg) |
||||
} |
||||
|
||||
func (t *stdLogSystem) SetLogLevel(i LogLevel) { |
||||
atomic.StoreUint32(&t.level, uint32(i)) |
||||
} |
||||
|
||||
func (t *stdLogSystem) GetLogLevel() LogLevel { |
||||
return LogLevel(atomic.LoadUint32(&t.level)) |
||||
} |
||||
|
||||
// NewRawLogSystem creates a LogSystem that prints to the given writer without
|
||||
// adding extra information. Suitable for preformatted output
|
||||
func NewRawLogSystem(writer io.Writer, flags int, level LogLevel) LogSystem { |
||||
logger := log.New(writer, "", 0) |
||||
return &rawLogSystem{logger, uint32(level)} |
||||
} |
||||
|
||||
type rawLogSystem struct { |
||||
logger *log.Logger |
||||
level uint32 |
||||
} |
||||
|
||||
func (t *rawLogSystem) LogPrint(level LogLevel, msg string) { |
||||
t.logger.Print(msg) |
||||
} |
||||
|
||||
func (t *rawLogSystem) SetLogLevel(i LogLevel) { |
||||
atomic.StoreUint32(&t.level, uint32(i)) |
||||
} |
||||
|
||||
func (t *rawLogSystem) GetLogLevel() LogLevel { |
||||
return LogLevel(atomic.LoadUint32(&t.level)) |
||||
} |
@ -0,0 +1,112 @@ |
||||
package logger |
||||
|
||||
import ( |
||||
"sync" |
||||
) |
||||
|
||||
type message struct { |
||||
level LogLevel |
||||
msg string |
||||
} |
||||
|
||||
var ( |
||||
logMessageC = make(chan message) |
||||
addSystemC = make(chan LogSystem) |
||||
flushC = make(chan chan struct{}) |
||||
resetC = make(chan chan struct{}) |
||||
) |
||||
|
||||
func init() { |
||||
go dispatchLoop() |
||||
} |
||||
|
||||
// each system can buffer this many messages before
|
||||
// blocking incoming log messages.
|
||||
const sysBufferSize = 500 |
||||
|
||||
func dispatchLoop() { |
||||
var ( |
||||
systems []LogSystem |
||||
systemIn []chan message |
||||
systemWG sync.WaitGroup |
||||
) |
||||
bootSystem := func(sys LogSystem) { |
||||
in := make(chan message, sysBufferSize) |
||||
systemIn = append(systemIn, in) |
||||
systemWG.Add(1) |
||||
go sysLoop(sys, in, &systemWG) |
||||
} |
||||
|
||||
for { |
||||
select { |
||||
case msg := <-logMessageC: |
||||
for _, c := range systemIn { |
||||
c <- msg |
||||
} |
||||
|
||||
case sys := <-addSystemC: |
||||
systems = append(systems, sys) |
||||
bootSystem(sys) |
||||
|
||||
case waiter := <-resetC: |
||||
// reset means terminate all systems
|
||||
for _, c := range systemIn { |
||||
close(c) |
||||
} |
||||
systems = nil |
||||
systemIn = nil |
||||
systemWG.Wait() |
||||
close(waiter) |
||||
|
||||
case waiter := <-flushC: |
||||
// flush means reboot all systems
|
||||
for _, c := range systemIn { |
||||
close(c) |
||||
} |
||||
systemIn = nil |
||||
systemWG.Wait() |
||||
for _, sys := range systems { |
||||
bootSystem(sys) |
||||
} |
||||
close(waiter) |
||||
} |
||||
} |
||||
} |
||||
|
||||
func sysLoop(sys LogSystem, in <-chan message, wg *sync.WaitGroup) { |
||||
for msg := range in { |
||||
switch sys.(type) { |
||||
case *rawLogSystem: |
||||
// This is a semantic hack since rawLogSystem has little to do with JsonLevel
|
||||
if msg.level == JsonLevel { |
||||
sys.LogPrint(msg.level, msg.msg) |
||||
} |
||||
default: |
||||
if sys.GetLogLevel() >= msg.level { |
||||
sys.LogPrint(msg.level, msg.msg) |
||||
} |
||||
} |
||||
} |
||||
wg.Done() |
||||
} |
||||
|
||||
// Reset removes all active log systems.
|
||||
// It blocks until all current messages have been delivered.
|
||||
func Reset() { |
||||
waiter := make(chan struct{}) |
||||
resetC <- waiter |
||||
<-waiter |
||||
} |
||||
|
||||
// Flush waits until all current log messages have been dispatched to
|
||||
// the active log systems.
|
||||
func Flush() { |
||||
waiter := make(chan struct{}) |
||||
flushC <- waiter |
||||
<-waiter |
||||
} |
||||
|
||||
// AddLogSystem starts printing messages to the given LogSystem.
|
||||
func AddLogSystem(sys LogSystem) { |
||||
addSystemC <- sys |
||||
} |
@ -0,0 +1,360 @@ |
||||
package logger |
||||
|
||||
import ( |
||||
"time" |
||||
) |
||||
|
||||
type utctime8601 struct{} |
||||
|
||||
func (utctime8601) MarshalJSON() ([]byte, error) { |
||||
// FIX This should be re-formated for proper ISO 8601
|
||||
return []byte(`"` + time.Now().UTC().Format(time.RFC3339Nano)[:26] + `Z"`), nil |
||||
} |
||||
|
||||
type JsonLog interface { |
||||
EventName() string |
||||
} |
||||
|
||||
type LogEvent struct { |
||||
Guid string `json:"guid"` |
||||
Ts utctime8601 `json:"ts"` |
||||
// Level string `json:"level"`
|
||||
} |
||||
|
||||
type LogStarting struct { |
||||
ClientString string `json:"version_string"` |
||||
Coinbase string `json:"coinbase"` |
||||
ProtocolVersion int `json:"eth_version"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *LogStarting) EventName() string { |
||||
return "starting" |
||||
} |
||||
|
||||
type P2PConnecting struct { |
||||
RemoteId string `json:"remote_id"` |
||||
RemoteEndpoint string `json:"remote_endpoint"` |
||||
NumConnections int `json:"num_connections"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *P2PConnecting) EventName() string { |
||||
return "p2p.connecting" |
||||
} |
||||
|
||||
type P2PConnected struct { |
||||
NumConnections int `json:"num_connections"` |
||||
RemoteId string `json:"remote_id"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *P2PConnected) EventName() string { |
||||
return "p2p.connected" |
||||
} |
||||
|
||||
type P2PHandshaked struct { |
||||
RemoteCapabilities []string `json:"remote_capabilities"` |
||||
RemoteId string `json:"remote_id"` |
||||
NumConnections int `json:"num_connections"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *P2PHandshaked) EventName() string { |
||||
return "p2p.handshaked" |
||||
} |
||||
|
||||
type P2PDisconnected struct { |
||||
NumConnections int `json:"num_connections"` |
||||
RemoteId string `json:"remote_id"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *P2PDisconnected) EventName() string { |
||||
return "p2p.disconnected" |
||||
} |
||||
|
||||
type P2PDisconnecting struct { |
||||
Reason string `json:"reason"` |
||||
RemoteId string `json:"remote_id"` |
||||
NumConnections int `json:"num_connections"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *P2PDisconnecting) EventName() string { |
||||
return "p2p.disconnecting" |
||||
} |
||||
|
||||
type P2PDisconnectingBadHandshake struct { |
||||
Reason string `json:"reason"` |
||||
RemoteId string `json:"remote_id"` |
||||
NumConnections int `json:"num_connections"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *P2PDisconnectingBadHandshake) EventName() string { |
||||
return "p2p.disconnecting.bad_handshake" |
||||
} |
||||
|
||||
type P2PDisconnectingBadProtocol struct { |
||||
Reason string `json:"reason"` |
||||
RemoteId string `json:"remote_id"` |
||||
NumConnections int `json:"num_connections"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *P2PDisconnectingBadProtocol) EventName() string { |
||||
return "p2p.disconnecting.bad_protocol" |
||||
} |
||||
|
||||
type P2PDisconnectingReputation struct { |
||||
Reason string `json:"reason"` |
||||
RemoteId string `json:"remote_id"` |
||||
NumConnections int `json:"num_connections"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *P2PDisconnectingReputation) EventName() string { |
||||
return "p2p.disconnecting.reputation" |
||||
} |
||||
|
||||
type P2PDisconnectingDHT struct { |
||||
Reason string `json:"reason"` |
||||
RemoteId string `json:"remote_id"` |
||||
NumConnections int `json:"num_connections"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *P2PDisconnectingDHT) EventName() string { |
||||
return "p2p.disconnecting.dht" |
||||
} |
||||
|
||||
type P2PEthDisconnectingBadBlock struct { |
||||
Reason string `json:"reason"` |
||||
RemoteId string `json:"remote_id"` |
||||
NumConnections int `json:"num_connections"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *P2PEthDisconnectingBadBlock) EventName() string { |
||||
return "p2p.eth.disconnecting.bad_block" |
||||
} |
||||
|
||||
type P2PEthDisconnectingBadTx struct { |
||||
Reason string `json:"reason"` |
||||
RemoteId string `json:"remote_id"` |
||||
NumConnections int `json:"num_connections"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *P2PEthDisconnectingBadTx) EventName() string { |
||||
return "p2p.eth.disconnecting.bad_tx" |
||||
} |
||||
|
||||
type EthNewBlockMined struct { |
||||
BlockNumber int `json:"block_number"` |
||||
HeadHash string `json:"head_hash"` |
||||
BlockHash string `json:"block_hash"` |
||||
BlockHexRlp string `json:"block_hexrlp"` |
||||
BlockDifficulty int `json:"block_difficulty"` |
||||
BlockPrevHash string `json:"block_prev_hash"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *EthNewBlockMined) EventName() string { |
||||
return "eth.newblock.mined" |
||||
} |
||||
|
||||
type EthNewBlockBroadcasted struct { |
||||
BlockNumber int `json:"block_number"` |
||||
HeadHash string `json:"head_hash"` |
||||
BlockHash string `json:"block_hash"` |
||||
BlockDifficulty int `json:"block_difficulty"` |
||||
BlockPrevHash string `json:"block_prev_hash"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *EthNewBlockBroadcasted) EventName() string { |
||||
return "eth.newblock.broadcasted" |
||||
} |
||||
|
||||
type EthNewBlockReceived struct { |
||||
BlockNumber int `json:"block_number"` |
||||
HeadHash string `json:"head_hash"` |
||||
BlockHash string `json:"block_hash"` |
||||
BlockDifficulty int `json:"block_difficulty"` |
||||
BlockPrevHash string `json:"block_prev_hash"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *EthNewBlockReceived) EventName() string { |
||||
return "eth.newblock.received" |
||||
} |
||||
|
||||
type EthNewBlockIsKnown struct { |
||||
BlockNumber int `json:"block_number"` |
||||
HeadHash string `json:"head_hash"` |
||||
BlockHash string `json:"block_hash"` |
||||
BlockDifficulty int `json:"block_difficulty"` |
||||
BlockPrevHash string `json:"block_prev_hash"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *EthNewBlockIsKnown) EventName() string { |
||||
return "eth.newblock.is_known" |
||||
} |
||||
|
||||
type EthNewBlockIsNew struct { |
||||
BlockNumber int `json:"block_number"` |
||||
HeadHash string `json:"head_hash"` |
||||
BlockHash string `json:"block_hash"` |
||||
BlockDifficulty int `json:"block_difficulty"` |
||||
BlockPrevHash string `json:"block_prev_hash"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *EthNewBlockIsNew) EventName() string { |
||||
return "eth.newblock.is_new" |
||||
} |
||||
|
||||
type EthNewBlockMissingParent struct { |
||||
BlockNumber int `json:"block_number"` |
||||
HeadHash string `json:"head_hash"` |
||||
BlockHash string `json:"block_hash"` |
||||
BlockDifficulty int `json:"block_difficulty"` |
||||
BlockPrevHash string `json:"block_prev_hash"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *EthNewBlockMissingParent) EventName() string { |
||||
return "eth.newblock.missing_parent" |
||||
} |
||||
|
||||
type EthNewBlockIsInvalid struct { |
||||
BlockNumber int `json:"block_number"` |
||||
HeadHash string `json:"head_hash"` |
||||
BlockHash string `json:"block_hash"` |
||||
BlockDifficulty int `json:"block_difficulty"` |
||||
BlockPrevHash string `json:"block_prev_hash"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *EthNewBlockIsInvalid) EventName() string { |
||||
return "eth.newblock.is_invalid" |
||||
} |
||||
|
||||
type EthNewBlockChainIsOlder struct { |
||||
BlockNumber int `json:"block_number"` |
||||
HeadHash string `json:"head_hash"` |
||||
BlockHash string `json:"block_hash"` |
||||
BlockDifficulty int `json:"block_difficulty"` |
||||
BlockPrevHash string `json:"block_prev_hash"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *EthNewBlockChainIsOlder) EventName() string { |
||||
return "eth.newblock.chain.is_older" |
||||
} |
||||
|
||||
type EthNewBlockChainIsCanonical struct { |
||||
BlockNumber int `json:"block_number"` |
||||
HeadHash string `json:"head_hash"` |
||||
BlockHash string `json:"block_hash"` |
||||
BlockDifficulty int `json:"block_difficulty"` |
||||
BlockPrevHash string `json:"block_prev_hash"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *EthNewBlockChainIsCanonical) EventName() string { |
||||
return "eth.newblock.chain.is_cannonical" |
||||
} |
||||
|
||||
type EthNewBlockChainNotCanonical struct { |
||||
BlockNumber int `json:"block_number"` |
||||
HeadHash string `json:"head_hash"` |
||||
BlockHash string `json:"block_hash"` |
||||
BlockDifficulty int `json:"block_difficulty"` |
||||
BlockPrevHash string `json:"block_prev_hash"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *EthNewBlockChainNotCanonical) EventName() string { |
||||
return "eth.newblock.chain.not_cannonical" |
||||
} |
||||
|
||||
type EthNewBlockChainSwitched struct { |
||||
BlockNumber int `json:"block_number"` |
||||
HeadHash string `json:"head_hash"` |
||||
OldHeadHash string `json:"old_head_hash"` |
||||
BlockHash string `json:"block_hash"` |
||||
BlockDifficulty int `json:"block_difficulty"` |
||||
BlockPrevHash string `json:"block_prev_hash"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *EthNewBlockChainSwitched) EventName() string { |
||||
return "eth.newblock.chain.switched" |
||||
} |
||||
|
||||
type EthTxCreated struct { |
||||
TxHash string `json:"tx_hash"` |
||||
TxSender string `json:"tx_sender"` |
||||
TxAddress string `json:"tx_address"` |
||||
TxHexRLP string `json:"tx_hexrlp"` |
||||
TxNonce int `json:"tx_nonce"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *EthTxCreated) EventName() string { |
||||
return "eth.tx.created" |
||||
} |
||||
|
||||
type EthTxReceived struct { |
||||
TxHash string `json:"tx_hash"` |
||||
TxAddress string `json:"tx_address"` |
||||
TxHexRLP string `json:"tx_hexrlp"` |
||||
RemoteId string `json:"remote_id"` |
||||
TxNonce int `json:"tx_nonce"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *EthTxReceived) EventName() string { |
||||
return "eth.tx.received" |
||||
} |
||||
|
||||
type EthTxBroadcasted struct { |
||||
TxHash string `json:"tx_hash"` |
||||
TxSender string `json:"tx_sender"` |
||||
TxAddress string `json:"tx_address"` |
||||
TxNonce int `json:"tx_nonce"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *EthTxBroadcasted) EventName() string { |
||||
return "eth.tx.broadcasted" |
||||
} |
||||
|
||||
type EthTxValidated struct { |
||||
TxHash string `json:"tx_hash"` |
||||
TxSender string `json:"tx_sender"` |
||||
TxAddress string `json:"tx_address"` |
||||
TxNonce int `json:"tx_nonce"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *EthTxValidated) EventName() string { |
||||
return "eth.tx.validated" |
||||
} |
||||
|
||||
type EthTxIsInvalid struct { |
||||
TxHash string `json:"tx_hash"` |
||||
TxSender string `json:"tx_sender"` |
||||
TxAddress string `json:"tx_address"` |
||||
Reason string `json:"reason"` |
||||
TxNonce int `json:"tx_nonce"` |
||||
LogEvent |
||||
} |
||||
|
||||
func (l *EthTxIsInvalid) EventName() string { |
||||
return "eth.tx.is_invalid" |
||||
} |
Loading…
Reference in new issue