@@ -581,39 +581,29 @@ void L2Bridge::Init(Params&& pars)
581581 p1.m_Pos0 .m_Height ++;
582582 p1.m_Pos0 .m_Pos = 0 ;
583583
584- p1.m_pSkBbs = nullptr ;
585- p1.m_Channel = 0 ;
584+ p1.m_pSkBbs = &m_Node.m_Keys .m_Validator .m_sk ;
585+ p1.m_Channel = ChannelFromPeerID (m_Node.m_Keys .m_Validator .m_Addr );
586+
587+
588+ auto pRequest = new proto::FlyClient::RequestContractVar;
586589
587590 {
588591 Shaders::Env::Key_T<uint8_t > key;
589- key.m_KeyInContract = Shaders::L2Tst1_L1::Tags::s_BridgeExp;
590592 key.m_Prefix .m_Cid = pars.m_cidBridgeL1 ;
591593 key.m_Prefix .m_Tag = Shaders::KeyTag::Internal;
592594
595+ key.m_KeyInContract = Shaders::L2Tst1_L1::Tags::s_BridgeExp;
593596 Blob (&key, sizeof (key)).Export (p1.m_Key );
594- }
595-
596- m_cidBridgeL1 = pars.m_cidBridgeL1 ;
597-
598- const Rules& r = Rules::get (); // our (L2) rules
599- m_iWhiteValidator = std::numeric_limits<uint32_t >::max ();
600- uint32_t nWhite = 0 ;
601- for (const auto & addr : r.m_Pbft .m_Whitelist .m_Addresses ) // TODO read the L1 contract settings, to realize the bridge validators. It doesn't have to be equal to L2 validator whitelist
602- {
603- if (addr == m_Node.m_Keys .m_Validator .m_Addr )
604- {
605- m_iWhiteValidator = nWhite;
606597
607- p1.m_pSkBbs = &m_Node.m_Keys .m_Validator .m_sk ;
608- p1.m_Channel = ChannelFromPeerID (m_Node.m_Keys .m_Validator .m_Addr );
609-
610- break ;
611- }
612-
613- nWhite++;
598+ key.m_KeyInContract = Shaders::L2Tst1_L1::Tags::s_Validators;
599+ Blob (&key, sizeof (key)).Export (pRequest->m_Msg .m_Key );
614600 }
601+
615602 m_Extractor.Start (std::move (p1));
616603
604+ // query the current validator set of L1
605+ m_L1.m_Cid = pars.m_cidBridgeL1 ;
606+ m_Extractor.PostForeignRequest (std::move (pRequest));
617607}
618608
619609L2Bridge::~L2Bridge ()
@@ -689,6 +679,25 @@ void L2Bridge::Extractor::OnEvent(Event::Base&& evt)
689679
690680 switch (d.m_pRequest ->get_Type ())
691681 {
682+ case proto::FlyClient::Request::Type::ContractVar:
683+ {
684+ auto & r = Cast::Up<proto::FlyClient::RequestContractVar>(*d.m_pRequest );
685+ // must the the validator set
686+ auto & buf = r.m_Res .m_Value ; // alias
687+ auto & trg = get_ParentObj ().m_L1 .m_vValidators ;
688+
689+ size_t nValidators = buf.size () / sizeof (Shaders::L2Tst1_L1::Validator);
690+ trg.resize (nValidators);
691+
692+ if (nValidators)
693+ {
694+ const auto * pSrc = (const Shaders::L2Tst1_L1::Validator*) &buf.front ();
695+ for (uint32_t i = 0 ; i < nValidators; i++)
696+ trg[i] = pSrc[i].m_pk ;
697+ }
698+ }
699+ break ;
700+
692701 default :
693702 // suppress warning
694703 break ;
@@ -698,12 +707,30 @@ void L2Bridge::Extractor::OnEvent(Event::Base&& evt)
698707 }
699708}
700709
710+ bool L2Bridge::IsMyValidator (const ECC::Point& pt) const
711+ {
712+ return
713+ (m_Node.m_Keys .m_Validator .m_Addr == pt.m_X ) &&
714+ !pt.m_Y ;
715+ }
716+
717+
701718template <>
702719void L2Bridge::OnMsgEx (Shaders::L2Tst1_L1::Msg::GetNonce& msg)
703720{
704721 if (msg.m_ProtoVer != Shaders::L2Tst1_L1::Msg::s_ProtoVer)
705722 return ;
706723
724+ Shaders::L2Tst1_L1::Msg::Nonce msgOut;
725+ for (msgOut.m_iValidator = 0 ; ; msgOut.m_iValidator ++)
726+ {
727+ if (m_L1.m_vValidators .size () == msgOut.m_iValidator )
728+ return ; // I'm not a validator on L1
729+
730+ if (IsMyValidator (m_L1.m_vValidators [msgOut.m_iValidator ]))
731+ break ;
732+ }
733+
707734 Entry* pE = nullptr ;
708735 auto it = m_mapEntries.find (msg.m_pkOwner , Entry::Owner::Comparator ());
709736
@@ -735,8 +762,6 @@ void L2Bridge::OnMsgEx(Shaders::L2Tst1_L1::Msg::GetNonce& msg)
735762 pE->m_pkBbs = msg.m_pkBbs ;
736763 pE->m_skNonce .GenRandomNnz ();
737764
738- Shaders::L2Tst1_L1::Msg::Nonce msgOut;
739- msgOut.m_iValidator = m_iWhiteValidator;
740765 msgOut.m_m_Nonce = ECC::Context::get ().G * pE->m_skNonce ;
741766
742767 SendOut (Cast::Up<PeerID>(msg.m_pkBbs .m_X ), Blob (&msgOut, sizeof (msgOut)));
@@ -752,7 +777,7 @@ void L2Bridge::OnMsgEx(Shaders::L2Tst1_L1::Msg::GetSignature& msg)
752777
753778 // re-create the kernel
754779 TxKernelContractInvoke krn;
755- krn.m_Cid = m_cidBridgeL1 ;
780+ krn.m_Cid = m_L1. m_Cid ;
756781
757782 typedef Shaders::L2Tst1_L1::Method::BridgeImport Method;
758783 krn.m_iMethod = Method::s_iMethod;
@@ -794,19 +819,15 @@ void L2Bridge::OnMsgEx(Shaders::L2Tst1_L1::Msg::GetSignature& msg)
794819 uint32_t iChallenge = 1 ; // The 1st challenge is for pkOwner, then all the validators
795820 uint32_t iMyChallenge = 0 ;
796821
797- const Rules& r = Rules::get (); // our (L2) rules
798- for (uint32_t i = 0 ; i < r.m_Pbft .m_Whitelist .m_Addresses .size (); i++)
822+ for (uint32_t i = 0 ; i < m_L1.m_vValidators .size (); i++)
799823 {
800- const auto & addr = r. m_Pbft . m_Whitelist . m_Addresses [i];
824+ const auto & pk = m_L1. m_vValidators [i];
801825
802826 if (1u & msk)
803827 {
804- ECC::Point pk;
805- pk.m_X = Cast::Down<ECC::uintBig>(addr);
806- pk.m_Y = 0 ;
807828 hp << pk;
808829
809- if (i == m_iWhiteValidator )
830+ if (IsMyValidator (pk) )
810831 iMyChallenge = iChallenge;
811832
812833 iChallenge++;
@@ -837,7 +858,7 @@ void L2Bridge::OnMsgEx(Shaders::L2Tst1_L1::Msg::GetSignature& msg)
837858
838859
839860 Shaders::L2Tst1_L1::Msg::Signature msgOut;
840- msgOut.m_iValidator = m_iWhiteValidator ;
861+ msgOut.m_iValidator = iMyChallenge - 1 ;
841862 msgOut.m_k = x.m_skNonce ;
842863 SendOut (Cast::Up<PeerID>(x.m_pkBbs .m_X ), Blob (&msgOut, sizeof (msgOut)));
843864
0 commit comments