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