Skip to content

Commit b9e6e43

Browse files
consensus/clique: implement getSigner API method (ethereum#22987)
* clique: implement getSignerForBlock * consensus/clique: use blockNrOrHash in getSignerForBlock * consensus/clique: implement getSigner * consensus/clique: fixed rlp decoding * consensus/clique: use Author instead of getSigner * consensus/clique: nit nit nit * consensus/clique: nit nit nit
1 parent c49e065 commit b9e6e43

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

consensus/clique/api.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@
1717
package clique
1818

1919
import (
20+
"encoding/json"
2021
"fmt"
2122

2223
"github.com/ethereum/go-ethereum/common"
24+
"github.com/ethereum/go-ethereum/common/hexutil"
2325
"github.com/ethereum/go-ethereum/consensus"
2426
"github.com/ethereum/go-ethereum/core/types"
27+
"github.com/ethereum/go-ethereum/rlp"
2528
"github.com/ethereum/go-ethereum/rpc"
2629
)
2730

@@ -175,3 +178,51 @@ func (api *API) Status() (*status, error) {
175178
NumBlocks: numBlocks,
176179
}, nil
177180
}
181+
182+
type blockNumberOrHashOrRLP struct {
183+
*rpc.BlockNumberOrHash
184+
RLP hexutil.Bytes `json:"rlp,omitempty"`
185+
}
186+
187+
func (sb *blockNumberOrHashOrRLP) UnmarshalJSON(data []byte) error {
188+
bnOrHash := new(rpc.BlockNumberOrHash)
189+
// Try to unmarshal bNrOrHash
190+
if err := bnOrHash.UnmarshalJSON(data); err == nil {
191+
sb.BlockNumberOrHash = bnOrHash
192+
return nil
193+
}
194+
// Try to unmarshal RLP
195+
var input string
196+
if err := json.Unmarshal(data, &input); err != nil {
197+
return err
198+
}
199+
sb.RLP = hexutil.MustDecode(input)
200+
return nil
201+
}
202+
203+
// GetSigner returns the signer for a specific clique block.
204+
// Can be called with either a blocknumber, blockhash or an rlp encoded blob.
205+
// The RLP encoded blob can either be a block or a header.
206+
func (api *API) GetSigner(rlpOrBlockNr *blockNumberOrHashOrRLP) (common.Address, error) {
207+
if len(rlpOrBlockNr.RLP) == 0 {
208+
blockNrOrHash := rlpOrBlockNr.BlockNumberOrHash
209+
var header *types.Header
210+
if blockNrOrHash == nil {
211+
header = api.chain.CurrentHeader()
212+
} else if hash, ok := blockNrOrHash.Hash(); ok {
213+
header = api.chain.GetHeaderByHash(hash)
214+
} else if number, ok := blockNrOrHash.Number(); ok {
215+
header = api.chain.GetHeaderByNumber(uint64(number.Int64()))
216+
}
217+
return api.clique.Author(header)
218+
}
219+
block := new(types.Block)
220+
if err := rlp.DecodeBytes(rlpOrBlockNr.RLP, block); err == nil {
221+
return api.clique.Author(block.Header())
222+
}
223+
header := new(types.Header)
224+
if err := rlp.DecodeBytes(rlpOrBlockNr.RLP, header); err != nil {
225+
return common.Address{}, err
226+
}
227+
return api.clique.Author(header)
228+
}

internal/web3ext/web3ext.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,12 @@ web3._extend({
108108
call: 'clique_status',
109109
params: 0
110110
}),
111+
new web3._extend.Method({
112+
name: 'getSigner',
113+
call: 'clique_getSigner',
114+
params: 1,
115+
inputFormatter: [null]
116+
}),
111117
],
112118
properties: [
113119
new web3._extend.Property({

0 commit comments

Comments
 (0)