1st Year Anniversary, Change the way we store enrollments, etc.

1st Year Anniversary, Change the way we store enrollments, etc.

by Rooney

Monthly Report May 2020


Once again, May was a fantastic month for the AGORA team. The team was hard at work contributing to the AGORA codebase as well as making substantial contributions to the Alpine Linux codebase. We are still hard at work getting Quorum Balancing properly configured and in a shippable state. Once the team finalizes a full-scale implementation of the Quorum Balancing algorithm we can then shift our focus to other larger pieces of larger validator functionality. In addition to making progress on Quorum Balancing, we are also continuing to develop the Administrative Interface, and a few other issues related to how we handle pre-images. The following is a summary last months development activity and items that are currently still in development:

Core Development in May:
Monthly Activity:
Last month we had 82 pull-requests and 52 active issues. Of which:

  • 11 pull request proposed
  • 71 pull requests merged
  • 27 new issues
  • 25 issues closed

Functionality Developed:

Change the way we store enrollments #735

This feature was developed by Jay during the first part of May. Currently, we add Enrollment to the EnrollmentManager when they are received but before they are validated:

/// PUT: /enroll_validator

public void enrollValidator (Enrollment enroll) @safe


log.trace(“Received Enrollment: {}”, prettify(enroll));

if (this.enroll_man.add(this.ledger.getBlockHeight(),






After consensus is made. Doing it this way has a few issues:

  • It is impossible to replace an enrollment unless the user changes their key (with this comes a 2 week waiting period).
  • This table is never cleaned up.
  • We mix the data we use before and after consensus, which is error-prone.
  • addValidatedBlock does not add Enrollments, only updates their height, which means catch-up is broken.

It would be best to have those two data sets apart, and only have active enrollments in the EnrollmentManager. The separation should probably be similar to the transaction pool / UTXO set.

Definition of Done:

  • Make the way to store Enrollments like the way similar to the transaction pool / UTXO set.
  • Clean up the table when enrollment has expired.

Please refer to the Github link below for more information.

Split up Full Node and Validator functionality into two separate classes #586

This feature was developed by Andrej during the first part of May. Currently, the Node class contains functionality for both a Full Node and a Validator. The nominator instance should not be visible for Full Nodes, because they are not part of consensus.

Ideally, we would have something like this:

module agora.node.FullNode;
import agora.api.FullNode;
class FullNode : API { … }

module agora.node.Validator;

import agora.api.Validator;
import agora.node.FullNode;

class Validator : FullNode, API { … }

Notice how Validator is a ‘FullNode’ and provides additional functionality through the agora.api.validator API interface. Also notice that: API in the agora.node.FullNode and agora.node.Validator modules are different. One refers to the one in agora.api. ’FullNode’ and another refers to agora.api.Validator.

Definition of Done:

  • Split the classes into two
  • Each class should ideally live in its own module, e.g. FullNode.d, Validator.d
  • Based on the configuration of the node, either FullNode or Validator should be instantiated when we want to start a node.
  • Fields which only belong in the Validator class should not be present in the FullNode class. For example, the Nominator instance should only be visible in the Validator class.
  • The test-suite has tests for both FullNode and Validator. It should be possible to instantiate a mixed set of nodes (some are FullNode, some are Validator) and make the tests still work.

Please refer to the Github link below for more information.

Add utilities which verify vtables match on D & C++ sides #323

This feature was developed by Michael during the first part of May. It’s very easy to accidentally forget to prototype a method on the D side, causing the vtable to mismatch. This manifests in what appears to be weird memory corruption bugs, but in reality, the stack trace (e.g. via LLDB) will tell us if the call stack makes sense, or if the wrong method was called. We should have some utility code that verifies this, just like the current layout/size checks.

Please refer to the Github link below for more information.

Implement ‘enum’ formatting in Oceans formatter #725

This feature was developed by Michael during the first part of May. Since Ocean dropped D1 compatibility, it’s now possible to do this and would simplify our life a bit.

Definition of Done:

enum Foo







import ocean.text.convert.Formatter;



assert(format(“{} {} {} {}”, Foo.A, Foo.B, Foo.C, Foo.D) == “Foo.A Foo.B Foo.C Foo.D”);
Foo invalid1 = cast(Foo) 42;
assert(format(“{}”, invalid1) == “cast(Foo) 42”);


Please refer to the Github link below for more information.

Add validation checking code for pre-images being revealed #694

This feature was developed by Jay in the middle of May. In the current implementation of managing enrollments and pre-images, there is no code for checking the validity of pre-images. The end result is to have a validator set check the validity of the pre-images being received from several validators.

Definition of Done:

  • The validator set checks incoming pre-images with enrollment data

How to implement:

  • The validator set hashes a random seed of an enrollment by the difference in the height between the random seed and the incoming pre-image, and compares the hash value and one of the pre-image.
  • The Enrollment structure must have the height of its random seed for checking the validity.

Please refer to the Github link below for more information.

Implement range support in `ocean.text.convert.Formatter` #718

This feature was developed by Michael in the middle of May. Agora uses a library called Ocean to print logs during operation. Ocean does not support the ‘Range’ type so we cannot understand the ‘Range’ type output. The goal is to make sure we are able to understand the ‘Range’ type output.

Please refer to the Github link below for more information.

Apply the sliding window concept for managing pre-images #767

This feature was developed by Jay in the middle of May. Currently, node use somewhere around 100,000 pre-images created, and the pre-images are matched each with the height of a block. One area of improvement has been identified in regards to matching each pre-image with a blocks height. This alternative is to apply the sliding window concept. This concept allows for pre-images to be retrieved based on the round and cycle.

Definition of Done:

  • To manage pre-images based on cycle and round
  • To determine the current round and cycle when restoring all the information when a node needs to restore all the information.
  • To use a PreImageCache in managing pre-images.

Please refer to the Github link below for more information.

Network manager needs to be reworked #587

This feature was developed by Andrej in the middle of May. When we initially implemented this the goal was to support Full Nodes (first milestone). Full Nodes connect to a minimum number of clients via the min_listeners config option.

Validators should not have this config option. The minimum number of clients it connects to is the number of nodes in its quorum configuration. They do not care about connecting to random Full Nodes, it is Full Nodes which care about connecting to Validators & other Full Nodes.

There are various sets inside, and it’s all a bit too complicated to reason about:

  • todo_addresses
  • known_addresses
  • connecting_addresses

In addition to that, some of the initialization in start() should be moved to the constructor so the class is always in a ready-to-go state. Otherwise, it’s possible some incoming requests are routed to the NetworkManager while start() hasn’t yet been called, which leaves it in an inconsistent state.

Please refer to the Github link below for more information.

Reveal pre-images on a timer #582

This feature was developed by Henry at the end of May. Instead of having the pre-image reveal happen on putTransaction, it should be done via a timer.

Currently this is done here:


Lines 252 to 260 in 0cdc928

if (this.enroll_man.needRevealPreimage(this.ledger.getBlockHeight()))

PreimageInfo preimage;
if (this.enroll_man.getNextPreimage(preimage))


This can be trivially done via Vibe.d’s setTimer function.

It is currently not implemented in LocalRest, but since we have non-blocking ‘sleep’ and ‘runTask’ as primitives, it should be trivial to implement it.

Please refer to the Github link below for more information.

Generate build artifacts to inspect PR failures #745

This feature was developed by Mathias at the end of May. This issue is extremely straightforward.

For example, we should be able to do the following after this is completed:

  • Inspect the object files when there are linker issues
  • Inspect any core dumps when our tests crash

Please refer to the Github link below for more information.

Ongoing Validator Development:


BOSAGORA 1st Year Anniversary

BOSAGORA celebrated 1st year anniversary last May 16. During the past 1 year, we achieved many things including airdrop to existing holders at the same time when the project started, listing in global exchange, and unfolded various marketing activities to maintain beginner’s mindset which was a promise to the community. Also, we disclosed monthly expenditure details to conserve transparency. BOSAGORA could reach this far thanks to the support and trust of the community. As we have done so far, we will keep trying our best to reap the fruit based on transparent communication.

BOA, Available at CoolWallet S

Since the MOU with CoolBitX in last May, it has become possible to use BOA tokens in the hardware wallet CoolWallet S. Therefore, BOA holders around the world can use the CoolWallet S to store BOA tokens more safely and conveniently. It’s easy to store BOA tokens in CoolWallet S. Simply transfer the BOA tokens from other exchanges or wallets to CoolWallet S and you can check the BOA tokens in your CoolWallet S.

And the safety of the wallet has also increased. Thanks to CoolBitX’s crypto-asset anti-money laundering solution(Signa Bridge), it is possible to securely share the information of the sender and recipient during cryptocurrency transactions, making it more secure than other hardware wallets. As a result, BOA token holders can store BOA without worry.

Quiz Event to Celebrate Partnership with CoolBitX

Many people from communities at home and abroad participated in the CoolWallet S quiz event, and we sent winners CoolWallet S with the BOSAGORA logo printed on them. Since then, many people have left a review of CoolWallet S along with an evidence photo.

Besides this, we are preparing a partnership for mutual development with a global certification company and an edu-tech company. BOSAGORA will proceed with the development of the main net while continuing to discover beneficial partnerships for the BOSAGORA ecosystem after the main net release.

‘Let COVID-19 Go’ Campaign to Overcome Corona era Ended Successfully

Many members of BOSAGORA community participated in the ‘Let COVID-19 Go’ campaign by keeping up with hygiene and refraining from going to gatherings. It drew much attention with 100 new community members being added within a short period by existing members inviting their friends. BOSAGORA will continue taking initiative as a project acting together with the community to overcome the corona era.

BOSAGORA Selected Ambassadors by Country

We recruited global ambassadors assigned to supporting global community activities. This led BOSAGORA to efficiently promote itself by producing content regarding development, partnership activities, and others produced internally in each local language. In the first phase, we will deliver our contents vividly to local community members in cooperation with renowned communities in Turkey, Japan, Russia, Spain, Southeast Asia, and expand this further to other countries later on.

Ambassador by country
🇹🇷Turkish Community:
🇯🇵Japanese Community:
🇷🇺Russian Community:
🇪🇸Spanish Community:
🌏Southeast Asian Community: @nanochatroom

Global AMAs

BOSAGORA held AMAs in May. During the last AMA, participants asked in-depth questions based on development material we released such as questions related to ‘validator’ and ‘flash layer’ under continuous development, and questions of how we are going to overcome the corona era as a project countering corona by holding a various participatory campaign. With these two AMAs in May, 100 new members were added to Twitter and Telegram each as part of the signals showing that the project is drawing continuous attention.

BOSAGORA is Now a Signatory to ‘Blockchain Bill of Rights’ of World Economic Forum

World Economic Forum announced “Blockchain Bill of Rights”. It urges every government, institute, company, and individual to plan, develop and utilize Blockchain service as per what is written in this bill in order to provide more transparent, convenient, considerate service to the public in line with the foundational values for a decentralized future.

BOSAGORA has become its first signatory from Korea amongst blockchain projects.

Development Status at a Glance, Website Renewal

We disclosed detailed development records on the technology page on our homepage to share development status in accordance with maintaining ‘transparency’. On technology page of renewed BOSAGORA homepage, you may find out important updates over development, development progress by importance, and entire development history at a glance to share all development information transparently. As a result, one can check all information related to BOSAGORA Development including the most important development schedule, progress status, and detailed contents of them at GitHub.

Hankook Blockchain News(HKBnews) Starts to Serially Publish BOSAGORA Column

Tech Trends, the column of BOSAGORA, briefing status, and technology of blockchain and cryptocurrency industry from a view of global coin project, started being contributed to Korea Blockchain News under the name of BOSAGORA column from June 8. BOSAGORA column is composed of contents drawing attention such as the importance of implementing democracy in the cryptocurrency industry, next-generation Censorship Resistance, and Smart Contract.

Here is the full article from Korea Blockchain News BOSAGORA column:

BOSAGORA Column List (Provisional)

#1 The State of Blockchain & Cryptocurrency in 2020
#2 Now is the Time for a Truly Decentralized Blockchain
#3 Blockchain for good: changing the narrative
#4 Can we Finally Achieve Democracy in the Crypto Industry?
#5 Why SCP is the Future of Blockchain Protocol?
#6 Loyal Holders in Cryptocurrency Industry: What Are They Waiting for?
#7 Revive Cryptocurrency with Democracy
#8 Censorship Resistance 2.0
#9 Intelligence for Humanity
#10 The only way cryptocurrency can contribute to the world
#11 Era of Smart Contract Blockchain Ecosystem
#12 Why is ‘trust’ in blockchain a big issue?

Please join our communication channels as follows!

BOSAGORA Official Announcement:




Related Stories