github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/signer/core/auditlog.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 12:09:46</date> 10 //</624342666460532736> 11 12 13 package core 14 15 import ( 16 "context" 17 18 "encoding/json" 19 20 "github.com/ethereum/go-ethereum/accounts" 21 "github.com/ethereum/go-ethereum/common" 22 "github.com/ethereum/go-ethereum/common/hexutil" 23 "github.com/ethereum/go-ethereum/internal/ethapi" 24 "github.com/ethereum/go-ethereum/log" 25 ) 26 27 type AuditLogger struct { 28 log log.Logger 29 api ExternalAPI 30 } 31 32 func (l *AuditLogger) List(ctx context.Context) (Accounts, error) { 33 l.log.Info("List", "type", "request", "metadata", MetadataFromContext(ctx).String()) 34 res, e := l.api.List(ctx) 35 36 l.log.Info("List", "type", "response", "data", res.String()) 37 38 return res, e 39 } 40 41 func (l *AuditLogger) New(ctx context.Context) (accounts.Account, error) { 42 return l.api.New(ctx) 43 } 44 45 func (l *AuditLogger) SignTransaction(ctx context.Context, args SendTxArgs, methodSelector *string) (*ethapi.SignTransactionResult, error) { 46 sel := "<nil>" 47 if methodSelector != nil { 48 sel = *methodSelector 49 } 50 l.log.Info("SignTransaction", "type", "request", "metadata", MetadataFromContext(ctx).String(), 51 "tx", args.String(), 52 "methodSelector", sel) 53 54 res, e := l.api.SignTransaction(ctx, args, methodSelector) 55 if res != nil { 56 l.log.Info("SignTransaction", "type", "response", "data", common.Bytes2Hex(res.Raw), "error", e) 57 } else { 58 l.log.Info("SignTransaction", "type", "response", "data", res, "error", e) 59 } 60 return res, e 61 } 62 63 func (l *AuditLogger) Sign(ctx context.Context, addr common.MixedcaseAddress, data hexutil.Bytes) (hexutil.Bytes, error) { 64 l.log.Info("Sign", "type", "request", "metadata", MetadataFromContext(ctx).String(), 65 "addr", addr.String(), "data", common.Bytes2Hex(data)) 66 b, e := l.api.Sign(ctx, addr, data) 67 l.log.Info("Sign", "type", "response", "data", common.Bytes2Hex(b), "error", e) 68 return b, e 69 } 70 71 func (l *AuditLogger) EcRecover(ctx context.Context, data, sig hexutil.Bytes) (common.Address, error) { 72 l.log.Info("EcRecover", "type", "request", "metadata", MetadataFromContext(ctx).String(), 73 "data", common.Bytes2Hex(data)) 74 a, e := l.api.EcRecover(ctx, data, sig) 75 l.log.Info("EcRecover", "type", "response", "addr", a.String(), "error", e) 76 return a, e 77 } 78 79 func (l *AuditLogger) Export(ctx context.Context, addr common.Address) (json.RawMessage, error) { 80 l.log.Info("Export", "type", "request", "metadata", MetadataFromContext(ctx).String(), 81 "addr", addr.Hex()) 82 j, e := l.api.Export(ctx, addr) 83 //在这种情况下,我们实际上不记录JSON响应,这可能是非常敏感的。 84 l.log.Info("Export", "type", "response", "json response size", len(j), "error", e) 85 return j, e 86 } 87 88 func (l *AuditLogger) Import(ctx context.Context, keyJSON json.RawMessage) (Account, error) { 89 //不要记录JSON内容 90 l.log.Info("Import", "type", "request", "metadata", MetadataFromContext(ctx).String(), 91 "keyJSON size", len(keyJSON)) 92 a, e := l.api.Import(ctx, keyJSON) 93 l.log.Info("Import", "type", "response", "addr", a.String(), "error", e) 94 return a, e 95 } 96 97 func NewAuditLogger(path string, api ExternalAPI) (*AuditLogger, error) { 98 l := log.New("api", "signer") 99 handler, err := log.FileHandler(path, log.LogfmtFormat()) 100 if err != nil { 101 return nil, err 102 } 103 l.SetHandler(handler) 104 l.Info("Configured", "audit log", path) 105 return &AuditLogger{l, api}, nil 106 } 107