Uncharted Waters

After I posted “Become our angels” on my Facebook, I have received some unexpected responses. I have not received some expected responses. This is so interesting.

In fact, what we are doing is like a private crowdfunding.

I love to play a PC game called Uncharted Waters. I love to use a character called Ali Vezas. He was a poor guy in Istanbul. So he asked the people he knew in the town for a fundraiser to support his journey as a merchant. What you need to do is to talk to everyone in the town. You can take a look see what Ali has encountered…

First thing first, your ship was broken. You need to persuade the repairer to delay his fee as an investment (Oh! Investment by sweat!):

Your partner questioned about the start-up capital. Yeah, we can’t trade without any money!

Some people hate you so much that he would not deal with you like forever and in whatever circumstances:

And there are people who “always thought you’d make something of yourself someday.”:

And yes, even a little bit would help us to get started. So don’t be shy if you want to support us with just a little bit of money:

You should always ask yourself, “Why people have to trust me?”:

Even your dream girl will invest in you! (Disclosure by Terence: this has not happened on me, not yet)

Of course, you are staking your reputation and your relationships when you ask for investment from family & friends. Will you stake your relationship with your dream girl?

What funny? We have experienced the same as Ali…

Desmo and Phanero (English)

The dual-tokens model of Forbole Blockchain

(中文按此) In the world of proof-of-work blockchains such as Bitcoin and Ethereum, if you would like to mine the tokens, you have to invest in your computing power and consume electricity, These are the costs you need to bear, in reward for Bitcoin or Ether. If you have committed wrong calculation or other wrong-doing or misbehavior, you will suffer a loss as you have used your computing power and electricity but have not gained the reward. This is the Law of Equivalent Exchange.

What if we no longer need mining by adopting proof-of-stake consensus? Who’s gonna do the calculation? How? What if they have done something wrong?

Base on Cosmos, we adopted a dual-tokens model, The first one is Desmo [ˈdɛsmɒ]. Holder of Desmo can stake their Desmo in return for the eligibility to validate the transaction on Forbole Blockchain, and hence can earn transaction fee in terms of Desmo or Phanero. As such, one can view Desmo as a long-term asset that can generate income. If the computing power of a Desmo holder is not qualified to become such a validator, he can delegate his Desmo to other and gain a share of transaction fee. Desmo is the token we will issue in our crowdsale campaign..

Desmo is designed as a long-term asset such that we will have enough qualified people to validate the transactions and hence maintain the governance of our blockchain. So Desmo should not be relied upon as a trading tokens as this will encourage Desmo holders to use Desmo for short-term purpose instead of participating the governance of the blockchain. We need to have a more liquid token which is suitable for short-term purpose, and this is Phanero [fəˈnærəʊ]. There will not be any crowdsale of Phanero. Users can gain Phanero by making contributions to Forbole (except if our proposed hard spoon on Steem will take place).

Simply put. Desmo is like investment properties which can generate income. This will discourage you to do short-term trading or speculation on Desmo. But if the holders are all holding Desmos, there will not have enough Desmos for people to trade or utilize. That’s why we need a more liquid Phanero which will act like a monetary asset to provide liquidity to our blockchain ecosystem.

On Forbole Blockchain, we have Desmo for long-term purposes and Phanero for short-term purposes. They make our tokenomics more complete.


Our private pre-sale of Desmo has started. Please refer to our Whitepaper for more details. We are also opened for discussion of hybrid investment using future equity (SAFE) + tokens. Please send message to our co-founder Terence Lam if you are interested.
Desmo and Phanero (中文)

​為何 Forbole 採雙代幣模式?​

(English here) 在 Bitcoin 或 Ethereum 等的工作量證明 (PoW) 掘礦世界,若你想參與掘礦,你就需投資於提昇運算力及消耗電力來為區塊鏈計數,這是你需付出的成本,用於換來可能掘到的 Bitcoin 或 Ether,若你計錯數或做錯事,你就會受到白白浪費了運算力及電力但掘不到幣的懲罰,等價交換是也!

但若區塊鏈不使用掘礦的方式,而是用權益證明 (PoS),誰去計數?怎樣計數?計錯了怎辦?

所以我們參考了 Cosmos 的方式,採用了雙代幣模式。首先是 Desmo [ˈdɛsmɒ],持有 Desmo 的人,通過將 Desmo 抵押,就能獲得審批區塊鏈交易的職能,通過審批交易來獲取更多的代幣 (Desmo 及 Phanero),即 Desmo 是一種長綫生財工具,若自己的電腦規格不勝任此職能,亦可以將持有的 Desmo 委托他人,以換取交易收益分成。我們的代幣眾籌將會發行 Desmo。

但由於 Desmo 應該作為長綫生財工具,以確保我們有足夠多的人審批交易,維持區塊鏈上的管治,所以 Desmo 本身不應該被依賴作為交易的代幣,這會令 Desmo 持有人以 Desmo 作短期目的而不是用於維護區塊鏈,我們需要有一種具備更大流通性,適合短期操作的代幣,這就是 Phanero [fəˈnærəʊ]。Phanero 並不會通過眾籌發行,而是由用戶通過對區塊鏈作出貢獻而換取 (除了我們初擬的 Steem 的 hard spoon 將會執行)。

再簡單點說,Desmo 像投資性物業,你持有它就能收租,所以你不會輕易作短期買賣操作,但如果人人都持有 Desmos,巿面就會不夠 Desmo 給他人買賣或使用,所以我們有要像流動​貨幣的 Phanero,為我們的區塊鏈生態帶來流動性。

我們的布樂區塊鏈上,有適合長綫的 Desmo 及適合短綫的 Phanero,令我們的經濟體更完善。


我們的 Desmo 代幣私人預售已靜稍稍展開,詳情請參閱我們的 Forbole 白皮書初稿。除了預購 Desmo,我們亦歡迎你洽談以未來股權 (SAFE) + 代幣的方式來參與我們的區塊鏈世界,如有興趣請 PM 我們的聯合創始人 Terence
Decentralization_diagram

去中心化與去中間化

Decentralization_diagram去中心化與去中間化,我總是覺得兩者是不一樣,亦總是覺得兩者有很強關聯。我認為,大家應先想清楚,為何我們的世界會有中間商存在?我的看法是,這是因為資訊及資源不對稱,有少部份人知道大部份人所不知道的東西,或有少部份人擁有大部份人所沒有的資源,這令大部份人需要倚靠這少部份人以完成一些目的。

若這看法成立,區塊鏈帶來的去中心化變革,並不會帶來去中間化,而且從某些角度看,還會產生新一批的中間商,因為區塊鏈是非常新的事物,亦需要不低的技術門檻,社會嚴重缺乏對區塊鏈的認識,但又有龐大需求,這就會產生新的資訊及資源不對稱,大部份人要搞區塊鏈,就要通過一些懂 (或裝懂) 的人去搞,這就產生新一批的中間商,大家現在看到的 ICO 顧問、ICO 營銷公司等,其實就是新一代中間商,雖然我討厭將 ICO 視為區塊鏈的全部,但無可否認這是普羅大眾認識區塊鏈的一個窗口。

中間商並不會因技術發展而消失,因為只要有人的社區,資訊及資源不對稱就會永遠存在,亦令中間商永遠會存在,在一個領域的中間商被科技所淘汰了,往往就會有新的中間商應運而生。

Kwun Hong Kong

A step-by-step guide to join Cosmos Hub testnet

Updated to testnet Gaia-6002. For those who have run a previous testnet before, please visit the upgrading guide. This guide is working as a reference for new comers. For latest updated information of the testnet, please visit the official testnet documentation.

As a supporter to the Cosmos Network, we have joined the Cosmos Hub testnet as a validator. Although the documentation for joining the testnet is very clear, I saw that many of the validators found it difficult to setup a validator node smoothly. I try to write down the steps with explanations on how we connect to the gaia-6002 testnet and hope it can help those who want to join the network.

Before you start, join the validator chat.

Step 1. Setup a Server

First, you have to setup a server. You are supposed to run your validator node all time, so you will need a server in datacenter to keep it running. Any cloud services like AWS, GCP, DigitalOcean will do.

Cosmos SDK is written in Go. It should work on any platform which can compile and run programs in Go. However, I strongly recommend running the validator node on a Linux server. I have tried to run the validator node on Windows. I could compile the codes smoothly but there were some problems when running the program. The example below will all be done on a Linux server.

Here is the configuration of the server we are using.

  1. No. of CPUs: 2
  2. Memory: 4GB
  3. Disk: 40GB SSD
  4. OS: Ubuntu 18.04 LTS
  5. Allow all incoming connections from TCP port 46656 and 46657

Notes on the configurations. 
1. Multicore is important, regardless the less CPU time usage
2. As of the time of this article update, gaiad uses around 2GB of memory. It may grow a bit along with the chain grows due to a memory leak issue on IAVL tree and with more peers connected. 4GB should be enough for now.
3. The chain data grows around 1GB every day on testnet. 40GB should be enough for running the testnet.

Once your new server is running, login to the server and upgrade your packages.

$ sudo apt update
$ sudo apt upgrade -y

Install some developer tools packages.

$ sudo apt install -y git gcc make

Step 2. Install Go and setup correct environment variables

Use snap to get the latest Go package. This will give you the latest stable Go no matter which Ubuntu version you are using.

$ sudo snap install --classic go

Now, you should be able to run Go. You should have Go 1.10.x installed.

$ go version
go version go1.10.3 linux/amd64

Edit your .profile in your home directory. Add $GOPATH and edit $PATH environment variables. It lets your system reference to the correct binary when during compilation.

$ nano $HOME/.profile

Add the following two lines at the end of the file.

GOPATH=$HOME/go
PATH=$GOPATH/bin:$PATH

Save the file and exit the editor. Then run the following to make your bash reload your profile configurations.

$ source $HOME/.profile

Now you should see something like this if you echo your $GOPATH and $PATH variables

$ echo $GOPATH
/home/forbole/go
$ echo $PATH
/home/forbole/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Step 3. Get Cosmos SDK and build gaia

Now you have Go setup correctly. The next step is to get the codes that you need to compile and run.

$ go get github.com/cosmos/cosmos-sdk
package github.com/cosmos/cosmos-sdk: no Go files in /home/forbole/go/src/github.com/cosmos/cosmos-sdk

The “package … no Go file …” statement just mention that there is no Go files in the directory. It’s not any error and you can go ahead.

Then change to the directory of the cosmos-sdk

$ cd $GOPATH/src/github.com/cosmos/cosmos-sdk

Checkout the version of the testnet. It’s currently running v0.18.0-rc0.

$ git checkout v0.19.0

And then you can build the binary by running the followings commands.

$ make get_tools
$ make get_vendor_deps
$ make install

If your environment variables have set up correctly, you should not get any errors by running the above 3 commands.

Now check your gaiad version.

$ gaiad version
0.19.0-0866494c

Step 4. Get the genesis.json and connect to the testnet

We need the gaia-6002 genesis file in order to connect to the testnet. The file is already included in the Cosmos SDK repo. We first need a configuration skeleton for placing the genesis.json in the correct place.

Create a configuration directory in your home and generate some some required files.

$ mkdir -p $HOME/.gaiad/config
$ gaiad unsafe_reset_all

This will create .gaiad/config directory in your home directory with the following files.

~/.gaiad/config$ ls
config.toml  genesis.json  priv_validator.json

Then you can copy the genesis.json file of the gaia-6002 to your configuration directory.

$ cp $GOPATH/src/github.com/cosmos/cosmos-sdk/cmd/gaia/testnets/gaia-6002/genesis.json \
$HOME/.gaiad/config/genesis.json

Make sure the genesis.json file in your configuration directory is overwritten with the gaia-6002 genesis.json file, you will see the first few lines of the file look like this.

$ cat $HOME/.gaiad/config/genesis.json
{
    "genesis_time": "2018-06-16T18:29:12.38288148Z",
    "chain_id": "gaia-6002",
    "consensus_params": {

Next, edit some configurations which let you have an identity and be able to connect to some peers on gaia-6002.

$ nano $HOME/.gaiad/config/config.toml

On line 11, there is a “moniker” field. Change it to any name you like. It’s your name on the network.

moniker = “forbole-validator”

Then, put the following seed node to the file. A seed node is a node that will actively find peers on the network, connect and disconnect, letting your nodes connect to more peers. It is on line 70 of the config.toml.

seeds = “[email protected]:46656”

You should also add some persistent peers to the file. Add the following peers to line 74.

persistent_peers = “[email protected]:46656,[email protected]:46656,[email protected]:46656,[email protected]:46656,[email protected]:46656,[email protected]:46656”

You can run the node in background logging all output to a log file.

$ gaiad start &> gaia.log &

All output will be logged in the gaia.log file. You can keep checking the output using tail -f.

$ tail -f gaia.log

To check if your node is connected to the testnet, you can run this.

$ gaiacli status

You should be seeing a returned JSON with your node status including node_infosync_info and validator_info. If you see this, then you are connected.

Step 5. Prepare keys for your validator and get some steaks

Alright, you are now connected to the testnet. To be a validator, you will need some steaks (yes, the staking coin on testnet is steak 🥩). You first need to generate a pair of private and public keys for sending and receiving coins, and bonding stake. During the previous init operation, you have already created a key pair with a chosen name. You can check that by running this.

$ gaiacli keys list
NAME: ADDRESS:      PUBKEY:
forbole cosmosaccaddr169cyjqe72sru6fgud4wce83kuc9rmwh3rqtlpy cosmosaccpub1zcjduc3q0ka0xw0w43pztdxcxuhq2qj5ydtkh4yx59g6k5dc58d2xgkh5lzs5ekm66

In case you would like to create another key to work on, run the following command to generate a new key pair.

$ gaiacli keys add <your_key_name>

<your_key_name> is any name you pick to represent this key pair. You have to refer to this <your_key_name> later when you use the keys to sign transactions. It will ask you to enter your password twice to encrypt the key. You also need to enter your password when you use your key to sign any transaction.

The command returns the address, public key and a seed phrase which you can use it to recover your account if you forget your password later. Keep the seed phrase in a safe place in case you have to use them.

The address showing here is your account address. Let’s call this <your_account_address>. It stores your assets. You can now check your account with the command.

This <your_account_address> is a bech32 address with cosmosaccaddr as a prefix. The bech32 format is for the users to identify which key and address we are referring to. You may read this as “Cosmos Account Address”.

$ gaiacli account <your_account_address>

After running this, you will see the following error.

ERROR: Error{1:9, — = Error = —
Message: No account with address cosmosaccaddr1r746rk50kzahzxjpymqfpg6cwmnk9a0jj75v8v was found in the state.
Are you sure there has been a transaction involving it?
Cause: <nil>
T: 0x9
Msg Traces:
— = /Error = —
}

Yes, there is an error but this is a normal response when you don’t have any coin in the account. Simply to say, you have created the key locally but nobody notice this address on the chain yet. Once there is a transaction to this address, the account is created on the chain and you can check your account balance again with the command with a more meaningful response. It works just like you open an account at the bank. When you open an account, the teller assigns you a new account number. The account will be activated after you deposit some money to it.

So where to get some bloody juicy steaks? Get 1 steak and 10 faucetTokens from https://faucetcosmos.network/.

After the transaction complete you can check your account again and there will be some coins for your next operation.


Step 6. Run a validator node

Validators are actors on the network committing new blocks by submitting their votes. It refers to the node itself, not a single person or a single account. In the Cosmos whitepaper, it says,

The protocol requires a fixed known set of validators, where each validator is identified by their public key.

Therefore, the public key here is referring to the node public key, not the public key of the address you have just created.

To get the node public key, run the following command.

$ gaiad tendermint show_validator

It will return a bech32 public key with cosmosvalpub as a prefix like this. You may read this as “Cosmos Validator Public Key”.

cosmosvalpub1zcjduc3qd3d5lrenvpplxq92nmy6hc30pms866kjz9ks6304eys2vjq3l5usgmcrn4

Let’s call it <your_node_pubkey>.

The next step you have to declare a validator candidate. The validator candidate is the account which stake the coins. So the validator candidate is an account this time.

To declare a validator candidate, run the following command.

$ gaiacli stake create-validator --amount=1steak --pubkey=<your_node_pubkey> --address-validator=<your_account_address> --moniker=<your_name> --chain-id=gaia-6002 --sequence=0 --name=<your_key_name>

Make sure the —pubkey used here is <your_node_pubkey> which is the nodee public key and —address-validator used is <your_account_address> which holds coins. If the transaction goes well, you have declared a validator candidate with 1 bonding steak on your validator node.

You may think the account address and the validator node public key are two different things and you can declare more candidates with the same public key. This is not allowed as 1 validator node public key can only declare 1 validator candidate. I tried and the transaction went through. This is currently a bug.

You can check to see if your validator candidate is in the validator set by running this command.

$ gaiacli stake validators

Your validator node address can be found in $HOME/.gaiad/config/priv_validator.json file.

$ cat $HOME/.gaiad/config/priv_validator.json

The first value of this JSON is your validator node address. If your validator node address can be found in the validator set, you have done everything ok. If not, please check the above commands and see if you have missed anything. The most common mistake is the mixing up of the use of node public key and account address while declaring candidacy.

The Tendermint team has built a validator monitor to keep tracking the performance of the validators. You can see your validator node address with the uptime of the latest 100 committed blocks.

You may also visit the Cosmos Explorer to learn more about the status of the network.

As long as you understand which account address and validator node public key to be used, you know how to delegate and unbond coins from the validator candidate.

Step 7. Sentry node architecture (optional but recommended)

In the Validator FAQ, it suggests validators to setup a sentry node architecture to protect the validator node from DDOS. Sentry nodes are like avatars of the validator nodes. They work similar to reverse proxy of a webapp. The sentry nodes are also full nodes and connect to the external network while connecting your validator node in the internal network. The validator node can still communicate with the network without exposing itself to the external network.

This can be done simply by editing the the $HOME/.gaiad/config/config.tomlfile on both the validator node and the sentry full node.

The following are the steps to setup the sentry node architecture.

1. Run another full node as a sentry node (step 1–4, you don’t need any coins here) in the same internal network of the validator node

2. On the sentry node, edit $HOME/.gaiad/config/config.toml. Put the validator node ID to the private_peer_ids. For example,

private_peer_ids = "5a533005d74b40ab954b33029a5682ec8794d014"

The node ID can be found by running the following command.

$ gaiad tendermint show_node_id

3. On the validator node, disallow all incoming connections in the firewall. Only allow incoming connection on 46656/tcp from the internal IP of the sentry node.

4. On the validator node, edit $HOME/.gaiad/config/config.toml. Remove all existing peer information from persistent_peers and put the node information of your sentry node in the format of [email protected]:PORT here.

persistent_peers = "[email protected]:46656"

And the validator node should set pex to false.

pex = false

5. Restart both nodes.

If both the validator node and sentry node can sync with the network and validator node can keep an uptime on the validator monitor, your setup is working fine.

In case if you have lost your voting power

Sometimes, you may see your validator uptime become 0 on the validator monitor page. This happens when the validator has missed voting at least 50 blocks in the last 100 blocks. The validator will be automatically revoked and the voting power become 0. The shares of the validator are unbonded in order to not affecting the running of the network. If this happens, check your validator information and see if your validator was revoked.

$ gaiacli stake validator <your_account_address>
Validator
Owner: <your_account_address>
Validator: <your_node_pubkey>
Shares: Status Unbonded,  Amount: 9800/10
Delegator Shares: 1000/1
Description: {forbole   }
Bond Height: 72953
Proposer Reward Pool:
Commission: 0/1
Max Commission Rate: 0/1
Comission Change Rate: 0/1
Commission Change Today: 0/1
Previously Bonded Stares: 0/1

You will see that the shares are unbonded and the amount is a fraction. You delegated coins to the validator and they were converted as shares of the total voting power. The shares become a fraction is because the validator is slashed due to not voting the blocks as a penalty. Originally 1000 steaks were converted to 1000 shares but it has become slashed to 980 shares in this example.

For more details about slashing and inflation of the staking, please refer to the Staking module specifications. (Please note that the doc at the writing time is not fully reflecting the staking logic of gaia-6002 as the Tendermint team has fixed some bugs of staking and updated some logic regarding this. You may read this issue comments for the changes.)

To make your validator have voting power again. You can unrevoke it.

$ gaiacli stake unrevoke <your_account_address> --chain-id=gaia-6002 --name=<your_key_name>

Upgrading your node to a new version

The Tendermint team will update the testnet software from time to time. You should update to the latest software when there is a new release. To upgrade your node, run the following commands.

$ cd $GOPATH/src/github.com/cosmos/cosmos-sdk
$ git fetch --all
$ git checkout <latest_release_tag>
$ make get_vendor_deps
$ make install

Check the version of your newly compiled binaries. You should see a new version with the latest release tag.

$ gaiad version
0.19.0-0866494c

Look for the PID (Process ID) of the running gaiad and kill it.

$ pgrep gaiad
25942

The number next to your username is the PID, kill the job and then start gaiadagain.

$ kill 25942
$ gaiad start &> gaia.log &

If everything is fine, you are connecting to the testnet with the updated software.


Make life easier

If you run this with a few days, you will find that the log size is extremely huge as by default, gaiad output all information, debug and error messages for now.

I have written an installation script which runs all the setups of the required environement. It will install gaiad as a sysmted service. With the service, you can start, restart and stop gaiad as system service. All output will be managed by systemd-journald for ease of journal management. Read the man page of journalctl for how to read the output of the services.

Installation script

Upgrade script

You can run the following commands after the installation.

$ sudo service gaiad start
$ sudo service gaiad restart
$ sudo service gaaid stop

The config and data files will be stored at /opt/gaiad/ and they belong to user gaiad. Feel free to tune the scripts to match your own requirements. The systemd unit file installed with the above script let the service have open file limit being set to 4096, which solve the issue when a validator node crashed due to opening to many files. The default open file limit on Ubuntu is 1024.


P.S. This post is a result from what I have learnt and the comments from all the validators in the validator chat. If you like it, please do join the validator chat and thank all the validators.

Your recommendations can change the lives of others

Thanks all of you who have accepted my connecting request on LinkedIn. Small blockchain startups like us need support from people like you.

Do you have this experience: You seized an opportunity because someone has recommended you. Do you know how a recommendation can change the life of other? I am one of the beneficiaries. My graduate job was confirmed because of a recommendation by my university tutor.

The tutor has already forgotten she had made such recommendation. But the student would never forget. This recommendation has changed my life direction. This was the first summer after the SARS outbreak in Hong Kong, and I got the job as a commercial banking trainee in one of the largest local banks in Hong Kong with a monthly salary of HK$10,000, while at that time the salary of a trainee in Big4 was HK$9,800. The salary of my roommate as an audit trainee in a small CPA firm was HK$6,000. The unemployment rate was as high as over 7%.

No matter you are a fresh graduate, a young professional, a startup or a small business, all you need is an opportunity.

To help other people to succeed, you can give opportunities to them. If you don’t have opportunities to give, you can also help them to seize other opportunities by recommending them to others.

That’s why we started Forbole (deck is here), a decentralized ecosystem based on recommendations, referrals, and rewards.

We are not another ICO project. We just don’t have deep pockets to launch an ICO at the moment. Instead, we are preparing for our membership pre-sale, in the form of utility token crowdfunding. To achieve this, I cordially invite you to join our community on Telegram.

Stay tuned!

The Ponzi scheme nature of ICO

We are planning for an ICO. As an early-stage startup that won’t have much resources, I have to decide what we can do. First of all, I need to know what areas we have to cover and the expenses associate to them. I found this great article by Kirill Shilov which told us about what should be included and expected regarding an ICO marketing plan:

When you add up the expense items you need to pay for an ICO, the total costs eat up a large portion of a small size series A funding.

Think about it. Originally we wanted to use ICO to disrupt traditional VC financing. But now we have to raise fund from VC such that we can raise more fund from ICO.

By small size series A funding I mean a size of USD2 million. According to the above article and some other sources I found who are doing ICO advisory services, companies should prepare a budget of around USD0.5 million to do an ICO.

This is like a multilevel marketing scheme. For those companies who will never deliver the prototype (not to say an official product), this is, in fact, a Ponzi scheme: you use the fund from the upper layers (those angels and VCs who invest in equity) to sell the dreams to lower layers (those whales who invest in token private sale), and then use the fund from lower layers to sell the dreams to an even lower layers (smaller crypto investors who participate ICO).

If you impose more regulations on ICO, the side-effect is ICO will become a more and more centralized fundraising method: only projects who have raised series-A are able to afford to do an ICO.

Is this what the believers of decentralization want to see?

Forbole Cosmos Network

為何我們選用 Cosmos,而不是以太坊

(English here) 我們的商務社交網絡的開發已進行了一段時間。近期我向一些商務人脈展示項目的最小可行產品 (MVP),當聽了我的介紹後,有位朋友問我,「這是不是另一個在以太坊 (Ethereum) 的項目?」,我就回應「絕對不是。」布樂 (Forbole) 是以 Cosmos SDK  開發,布樂將能串連不同的重視用戶貢獻的區塊鏈項目。

一個去中心化的生態

布樂是一個商務社交網絡,它將會有很多用戶原生內容 (UGC) 及互動。我們的目標是要創建一個去中化的生態,它將記錄用戶在網絡上的互動投入,並給予投入的用戶相應的貢獻分數。在我們於 2017 下半年開始開發工作之時開始,直至現在,以太坊是最常見的開發去中化應用 (ÐApps) 的平台。但作為以太坊上的開發編程語言 Solidity 卻有局限性,而以太坊虛擬機 (EVM) 上的交易速度亦越來越慢,所以我們就決定自建區塊鏈,讓用戶們能更多的參與生態的管治機制。在眾多不同的區塊鏈技術中,我們選擇了 Cosmos。Cosmos SDK 提供了一系列的工具讓開發者建立自己的區塊鏈。這些工具突破了以太坊的局限。Cosmos 令我們可以建立真正屬於自己的加密代幣 (cryptocurrency) 及管治模塊,令布樂能真正的成為一個去中心化的社區。

採用權益証明的共識引擎

Cosmos SDK 則是建立在 Tendermint 這個共識引擎。大部份傳統的區塊鏈社區與比特幣及以太坊,是採用工作量證明 (Proof-of-Work, PoW) 作為共識機制,但這機制的弊端多年來都被人詬病,例如,隨著社區越來越大,PoW 所耗的能源就越來越多,交易速度亦越來越慢。試想像下,社交網絡上有海量的內容,若其在在一個去中化系統上需要數分鐘以至數小時來完成數據交易,這顯然不是像布樂這樣的社交網絡所能接受的。而 Tendermint 則是一個具拜占庭容錯 (BFT) 特點的權益証明共識算法,它能每秒處理數千宗數據交易。

區塊鏈互聯網 (Internet of Blockchains, IBC)

Cosmos 容許不同的使用 IBC 通訊協議的區塊鏈相連,所以 Cosmos 將會是一個由多個區塊鏈組成的互聯網。通過創建區域 (Zones),不同的區塊鏈系統都能夠安插在 Cosmos 樞紐 (Hub),並相互交易各自的代幣,這代表了我們不再需要依賴容易被入侵的中心化交易所來交易代幣,而代幣在交易後能直接存入我們各自的受保護的錢包。通過使用 Cosmos SDK,我們將能夠開發一條區塊鏈,將不同的區域 (Zones) 連繫到 Cosmos 樞紐,從而實現去中心化的代幣交易所。布樂將容許更多的項目創建自己的代幣,並以真正的去中化的方式交易,而不容依賴目前收取高昂費用的中心化交易平台。

開發員友善的設計

與需要用 Solidity 去寫智能合同來開發去中心化應用的以太坊不同,Cosmos SDK 是一個助應用開發員發揮的最好的開發框架。通過 Cosmos SDK 來開發,我們毋須理會複雜的點對點網絡協議、共識算法或網絡安全等事宜,這些統統都由 Tendermint 處理好。我們只需要專心於應用的用戶體驗及商業邏輯。模塊化設計亦有助我們更容易部署推出應用的更新功能。Cosmos SDK 及 Tendermint 是以 Go 這個由 Google 發明的既容易又高效的程序語言所寫,這令開發員能短時間內掌握如何使用 Cosmos SDK 進行區塊鏈的開發。Cosmos SDK 及 Tendermint 通過「應用 – 區塊鏈界面」 (ABCI) 來通訊,通過這界面,開發員能用使用任何語言來開發區塊鏈應用。例如,若你用 Cosmos SDK 進行開發卻不用 Go 這編程語言,你仍能通過 IBC 來將你的應用連結至 Cosmos 網絡; 又例如,你可以使用 Lotion (一個 Javascript 框架) 來開發區塊鏈應用,並以 ABCI 來與 Tendermint 通訊。通過這樣的架構,區塊鏈應用的開發將會有更多不受局限的可能性,擁有不同技能的開發員都能參與 Cosmos 網絡,從而令它成為一個更好的區塊鏈社區。


Forbole is now under rapid development. With the continuous growth of Cosmos Network, we believe Forbole will be a successful blockchain application which helps everybody does business in a more reliable and efficient way. You can now join us by supporting our crowd funding campaign.

Forbole Cosmos Network

Why we choose Cosmos over Ethereum

We have started developing our business social network for a while. I recently showed our MVP to some business connections. After my introduction, a friend asked, “Is it another project running on Ethereum?”. “Definitely not.”, I answered. Instead, Forbole is developed with Cosmos SDK. Here are the reasons.

A Decentralized Ecosystem

Forbole Network is a business social network. There will be a lot user generated contents and user engagements. We aim to create a decentralized ecosystem which quantifies user engagements. Although Ethereum is the most popular platform for building ÐApps, the limited functionalities of Solidity and slow transaction speed on EVM cannot fulfill our requirements. So we decided to build our own blockchain with better performance while users can join and become parts of the governance.

Among various blockchain technologies, we chose Cosmos SDK. Cosmos SDK provides a set tools for developers to build their own blockchains. With these tools, we can build whatever applications we like without the limitation of the current Ethereum network. It lets us create our own tokens and governance modules which can truly make Forbole a decentralized community.

Proof-of-Stake Consensus Engine

Cosmos SDK is built on Tendermint as the backbone consensus engine. In the traditional blockchain communities like Bitcoin and Ethereum, they use Proof-of-Work (“PoW”) as the consensus mechanism. PoW has been criticized from time to time . As the communities grow, its energy consumption skyrockets while the transaction time is getting slower.

It takes minutes or even hours to record a social network engagement on Ethereum, and it is not acceptable for a social network like Forbole. Tendermint is using a classic BFT and Proof-of-Stake algorithms which can handle up to thousands of transactions per second.

Internet of Blockchains (IBC)

Cosmos is a network of blockchains. It allows different blockchains talk in the IBC protocol to be connected together to form an Internet of Blockchains. Zones can be created to plug any blockchain systems to the Cosmos Hub and exchange tokens among different blockchains. In that sense, we no longer need a centralized exchange to trade tokens, which is subject to hacks and theft. By using Cosmos SDK, we can develop a blockchain to be connected to different zones and the Cosmos Hub to create a truly decentralized token exchange.

Developer Friendly Design

On Ethereum, we have to develop ÐApp with Smart Contracts written in Solidity. With Cosmos SDK, we don’t have to consider those complicated P2P network protocol, consensus algorithms or cyber security issues. These are all done by the Tendermint backbone. We can focus on the user experience and the business logic of the application. Module based design also allows us to deploy updates and new features easily.

Tendermint and Cosmos SDK are originally developed with Go, which is a simple and efficient programming language created by Google. Developers can adapt for Cosmos SDK easily and build a blockchain in a short time.

Tendermint and Cosmos SDK communicated via Application-Blockchain Interface (“ABCI”). With this interface, developers can build blockchain applications with any programming languages. If you don’t use Cosmos SDK with Go, you can still connect your application to the Cosmos Network via IBC. For example, you can build a blockchain application with Lotion, a JavaScript framework which communicates with Tendermint via ABCI. With this architecture, it opens up unlimited possibilities for blockchain applications development. Developers with different skill sets can contribute to the Cosmos Network and hence the community can grow.


Forbole is now under rapid development. With the continuous growth of Cosmos Network, Forbole will be a successful blockchain application which helps everybody does business in a more reliable and efficient way.

Unsplash Startup Glasses Documents

再談未來股權簡單協議

(Chinese version will be added in the future.)

要了解未來股權簡單協議 (Simple Agreement for Future Equity, “SAFE”),大家要先大概了解一下初創融資,因為事情其實都是逐步演變出來。

估值大家都買過股票吧?正常大家買公司的股票,會看公司的估值多少錢,或許會用巿盈率 (PE),或許會用巿賬率 (PB),又或者會看股息率,諸如此類。但初創公司呢?莫說它們大部份沒有盈利,連經營現金流都未有,甚至只有一個 idea 的階段,又當如何估值呢?所以一般天使輪或種子輪的融資,直接地用發新股的方式是不現實的。所以這個階段的融資,一般是以可換股票據 (Convertible Notes,”CN”) 來完成。就是先是債權,日後可以按預先協議好的估值來轉換為股票。一開始時融資就是借款,有到期日,有利息,投資者先以債主的身份收利息,並享受作為債權持有人的優先索償地位,到項目發展到一定階段,能較可靠地估值,或根據一些協議好的條款,CN 持有人就可以將 CN 轉換為股權,由債權持有人變為股東。

因為它提供的便利,CN 就成為了初創融資的主流方式。

但隨著初創融資越來越盛行,開始有人認為 CN 都不是最方便的初創融資方法。主要原因是,CN 條款的複雜性,並非一般投資者或初創能自行應付,若委托律師,律師費可能已要幾十萬,相對一般才幾百萬的初創融資規模,幾十萬的律師費的比例實在太高。另外,CN 的複雜性及連帶的後果 (例如作為債權持有人,可以對借款人清盤,但這真的是各持份者的初衷嗎?) 令 CN 的談判需要用很長時間,若涉及眾多潛在投資者,所需的時間就更會以倍數上升,創始人耗費大量精力於談判條款細節,又是否大家所樂見?

曾孵化 Dropbox、Airbnb 及 Stripe 等著名獨角獸的初創加速器 Y-Combinator (“YC”) 就此提出了一個疑問 – 在初創融資階段,是否真的有必要討論這諸多細節?到真的進行千萬級別的股權融資時,自然就會委托專業人士來搞定條款,何需在種子輪或天使輪時浪費這些精力?若初創在股權融資前就失敗了,天使投資人拿著字典厚的條款又有何用?所以 YC 草擬了只有幾頁的 SAFE,用來取代 CN,希望簡化初創融資的談判過程。以 SAFE 的精神,雙方最重要需要談的只有兩樣,就是投資金額,及估值上限 (Valuation Cap),越高的估值上限,日後能轉換到的股票數目就越少,這令初創能在不同階段訂立不同的估值上限,例如只有 idea 的時候,及已做了原型的時候,就應該有不同的估值上限,因為前者比後者的風險高,若在 idea 階段就夠膽投的投資人,就應享受更低的估值上限,這樣分段地按不同條款達成融資的做法,就是 YC 創辦人、矽谷著名天使投資者 Paul Graham 所說的「高分辨率融資」(high resolution fundrasiing)。

高分辨率融資,就是我們 Forbole 選擇使用 SAFE 的主要原因,自去年 10 月開始至今,我們完成 4 個不同估值上限的 SAFE 的小規模天使融資。而我們作為香港土生土長的初創,亦很樂意引入 SAFE 這種融資方式,因為我們都希望令香港初創環境變得更好。

目前無論是英語還是華語世界,對 SAFE 的討論都很有限。你在網絡上能找到的討論 SAFE 的文章,來來去去都是那幾個來源,負評主要是圍繞另一著名天使投資人 Fred Wilson 的質疑,他尤其質疑高分辨率融資帶來的問題。但我個人認為,其他文章引用 Fred Wilson 的看法來投射於 SAFE 是斷章取義,Fred Wilson 的看法並非針對 SAFE,而是針對所有高分辨率融資帶來的問題,而我認為 Fred Wilson 指的問題,根本就跟高分辨率融資無關,而是跟溝通不足有關。我會在下一篇文章介紹 SAFE 的重點條款時,再分享有關看法。