@@ -1758,6 +1758,71 @@ func (p *Parlia) Seal(chain consensus.ChainHeaderReader, block *types.Block, res
17581758 return nil
17591759}
17601760
1761+ func (p * Parlia ) SignBAL (blockAccessList * types.BlockAccessListEncode ) error {
1762+ p .lock .RLock ()
1763+ val , signFn := p .val , p .signFn
1764+ p .lock .RUnlock ()
1765+
1766+ data , err := rlp .EncodeToBytes ([]interface {}{blockAccessList .Version , blockAccessList .Number , blockAccessList .Hash , blockAccessList .Accounts })
1767+ if err != nil {
1768+ log .Error ("Encode to bytes failed when sealing" , "err" , err )
1769+ return errors .New ("encode to bytes failed" )
1770+ }
1771+
1772+ if len (data ) > int (params .MaxBALSize ) {
1773+ log .Error ("data is too large" , "dataSize" , len (data ), "maxSize" , params .MaxBALSize )
1774+ return errors .New ("data is too large" )
1775+ }
1776+
1777+ sig , err := signFn (accounts.Account {Address : val }, accounts .MimetypeParlia , data )
1778+ if err != nil {
1779+ log .Error ("Sign for the block header failed when sealing" , "err" , err )
1780+ return errors .New ("sign for the block header failed" )
1781+ }
1782+
1783+ copy (blockAccessList .SignData , sig )
1784+ return nil
1785+ }
1786+
1787+ func (p * Parlia ) VerifyBAL (block * types.Block , bal * types.BlockAccessListEncode ) error {
1788+ if bal .Version != 0 {
1789+ log .Error ("invalid BAL version" , "version" , bal .Version )
1790+ return errors .New ("invalid BAL version" )
1791+ }
1792+
1793+ if len (bal .SignData ) != 65 {
1794+ log .Error ("invalid BAL signature" , "signatureSize" , len (bal .SignData ))
1795+ return errors .New ("invalid BAL signature" )
1796+ }
1797+
1798+ // Recover the public key and the Ethereum address
1799+ data , err := rlp .EncodeToBytes ([]interface {}{bal .Version , block .Number (), block .Hash (), bal .Accounts })
1800+ if err != nil {
1801+ log .Error ("encode to bytes failed" , "err" , err )
1802+ return errors .New ("encode to bytes failed" )
1803+ }
1804+
1805+ if len (data ) > int (params .MaxBALSize ) {
1806+ log .Error ("data is too large" , "dataSize" , len (data ), "maxSize" , params .MaxBALSize )
1807+ return errors .New ("data is too large" )
1808+ }
1809+
1810+ pubkey , err := crypto .Ecrecover (crypto .Keccak256 (data ), bal .SignData )
1811+ if err != nil {
1812+ return err
1813+ }
1814+ var pubkeyAddr common.Address
1815+ copy (pubkeyAddr [:], crypto .Keccak256 (pubkey [1 :])[12 :])
1816+
1817+ signer := block .Header ().Coinbase
1818+ if signer != pubkeyAddr {
1819+ log .Error ("BAL signer mismatch" , "signer" , signer , "pubkeyAddr" , pubkeyAddr , "bal.Number" , bal .Number , "bal.Hash" , bal .Hash )
1820+ return errors .New ("signer mismatch" )
1821+ }
1822+
1823+ return nil
1824+ }
1825+
17611826func (p * Parlia ) shouldWaitForCurrentBlockProcess (chain consensus.ChainHeaderReader , header * types.Header , snap * Snapshot ) bool {
17621827 if header .Difficulty .Cmp (diffInTurn ) == 0 {
17631828 return false
0 commit comments