Skip to content

Commit f1dbbed

Browse files
committed
L2 bridge: using propoer L1 validaor set (not whitelist of L2) to co-sign L1 bridging txs
1 parent 5a2195d commit f1dbbed

File tree

3 files changed

+63
-39
lines changed

3 files changed

+63
-39
lines changed

node/bridge.cpp

Lines changed: 54 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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

619609
L2Bridge::~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+
701718
template <>
702719
void 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

node/bridge.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,14 +296,19 @@ namespace beam {
296296

297297
Entry::Owner::Map m_mapEntries;
298298
Entry::Mru::List m_Mru;
299-
ContractID m_cidBridgeL1;
300-
uint32_t m_iWhiteValidator;
299+
300+
struct L1
301+
{
302+
ContractID m_Cid;
303+
std::vector<ECC::Point> m_vValidators;
304+
} m_L1;
301305

302306
void Delete(Entry&);
303307
void ShrinkMru(uint32_t);
304308
void SendOut(const PeerID&, const Blob&);
305309

306310
static BbsChannel ChannelFromPeerID(const PeerID&);
311+
bool IsMyValidator(const ECC::Point&) const;
307312

308313
struct GetNonce;
309314
struct GetSignature;

wallet/unittests/wallet_test.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3316,10 +3316,8 @@ namespace
33163316

33173317
manSender.m_Args["action"] = "deploy";
33183318

3319-
std::sort(pars.m_RulesL2.m_Pbft.m_Whitelist.m_Addresses.begin(), pars.m_RulesL2.m_Pbft.m_Whitelist.m_Addresses.end());
3320-
3321-
for (uint32_t i = 0; i < pars.m_RulesL2.m_Pbft.m_Whitelist.m_Addresses.size(); i++)
3322-
manSender.m_Args["validator_" + std::to_string(i)] = pars.m_RulesL2.m_Pbft.m_Whitelist.m_Addresses[i].str() + "00";
3319+
for (uint32_t i = 0; i < L2Params::s_Validators; i++)
3320+
manSender.m_Args["validator_" + std::to_string(i)] = pars.m_pValidatorAddress[i].str() + "00";
33233321

33243322
manSender.m_Args["hUpgradeDelay"] = "1";
33253323
manSender.m_Args["nMinApprovers"] = "1";

0 commit comments

Comments
 (0)