ava-labs / avalanche-docs Goto Github PK
View Code? Open in Web Editor NEWProtocol documentation for the Avalanche network.
Home Page: https://docs.avax.network/
License: BSD 3-Clause "New" or "Revised" License
Protocol documentation for the Avalanche network.
Home Page: https://docs.avax.network/
License: BSD 3-Clause "New" or "Revised" License
The avalanchego-installer.sh
is a heavenly gift, all right. However, it creates a .avalanchego/configs/node.json
config file which includes a "http-host": ""
directive. This opens port 9650 on the Internet. I know validators should protect their servers using any flavor of iptables to weed out unwanted requests. It's not always the case, however. It happened to me (messed up my setup), it happened to someone else on Discord today (wasn't even aware of the situation). This is dangerous for the network, and I suggest removing this line from the script.
Consequences: logs show a bunch of
Apr 02 03:53:23 avalanche avalanchego[1914078]: INFO [04-02|03:53:23.300] Submitted transaction hash=0xdb8ef72c29e74edd7a7a5548e0b01c127c85809e842b322e93a5114068679e21 from=0x000010ED59bCb8FAC3AECb568aefBf8b49daEA02 nonce=121 recipient=0x000010ED59bCb8FAC3AECb568aefBf8b49daEA02 value=0 type=2 gasFeeCap=63,363,090,303 gasTipCap=63,363,090,303 gasPrice=63,363,090,303
then a bunch of
Apr 02 04:22:42 avalanche avalanchego[1914078]: WARN [04-02|04:22:42.967] Served eth_call conn=103.100.174.14:61740 reqid=924 execTime="948.173µs" procTime="949.241µs" totalTime="949.722µs" err="execution reverted: INSUFFICIENT_OUTPUT" errdata=0x08c379a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000013494e53554646494349454e545f4f555450555400000000000000000000000000
health.health
give "healthy": false
, node is benched. Restart the service, but false
again is a matter of hours at most, rinse, repeat, until the directive is deleted from the config file or the validator sets up a correct iptables configuration.
Hi, from this consensus document https://docs.avax.network/learn/platform-overview/avalanche-consensus/#validators
It is said
To become a validator, a node must bond (stake) something valuable (AVAX). The more AVAX a node bonds, the more often that node is queried by other nodes. When a node samples the network it's not uniformly random. Rather, it's weighted by stake amount.
As per my understanding, the newTx’s gossip is an independent process, it's not sampled the weight of the stake amount, right? Actually, I have read the source code, it's sampled by
peers := n.samplePeers(subnetID, validatorOnly, numValidatorsToSend, numNonValidatorsToSend, numPeersToSend)
So as long as I am a validator, suppose the chance of receiving newTx is the same, no matter how much I staked, right?
In terms of consensus, the validator is weight-sampled. But newTx propagation path is not the same as the consensus path, some validator not even know the tx yet, how can they make the decision to include it or not?
In our create a new blockchain tutorial it's not clear that your validator must be validating the default subnet before creating your own subnet and adding a validator and blockchain.
Make the docs more clear when there are implicit and understood steps happening. Link out to the tutorials that cover those core and understood steps just so people who don't know the platform as well as us don't get tripped up on something which we consider super basic and obvious.
Today the node is over 310G in size, is this correct?
I am following the official guide named “Deploying Subnet with EVM Based Blockchain using AvalancheJS”
The screenshot of the error message:
The error message:
/Users/usr/node_modules/avalanche/dist/common/jrpcapi.js:64
throw new Error(resp.data.error.message);
^
Error: couldn't issue tx: flow check failed: tx produces more unlocked "BUuypiq2wyuLMvyhzFXcPyxPMCgSp7eeDohhQRqTChoBjKziC" (1000000) than it consumes (0)
(I'm not sure if this is the right repository for this, because I couldn't find the relevant documentation here but here it goes)
The syntax of --http-host
command-line parameter for avalanchego is unclear in the docs: https://docs.avax.network/build/references/command-line-interface
--http-host
or comma separating hosts etc? (Doesn't seem possible)I would've sent a PR request if I could find the docs.
Hello !
I wanted to use /ext/bc/X/events
websocket endpoint to listen transactions on multiple addresses.
https://docs.avax.network/build/avalanchego-apis/exchange-chain-x-chain-api#events
I receive only the txID
but I don't know from which exact address submitted it came from.
Exemple ws message received:
{"txID":"22HWKHrREyXyAiDnVmGp3TQQ79tHSSVxA9h26VfDEzoxvwveyk"}
{"txID":"22HWKHrREyXyAiDnVmGp3TQQ79tHSSVxA9h26VfDEzoxvwveyk", "fromAddress": "X-fuji...."}
With this output, I know the address who receives the coins :)
Do you think it would be possible ?
Thank for your great work 🙏
Will there be a macOS version of the documentation on how to set up monitoring for an Avalanche node described here?
The existing spec is quite out of date... For example it references a few messages that no longer exist:
It also seems to be missing... A few messages...
It also seems to use SubnetID
where it should be using ChainID
The documentation about logging at https://docs.avax.network/build/references/avalanchego-config-flags disagrees with the help given by running "avalanchego --help".
The loglevel "trace" is missing.
Also according to "--help" the loglevel defaults to "debug", not "Info".
Hi,
I would like to use the script you did to auto fund c-chain addresses with truffle but I get an error :
Error: problem parsing address 'X-custom18jma8ppw3nhx5r4ap8clazz0dps7rv5u9xde7p': expected hrp "local" but got "custom"
The truffle-config.js
:
const Web3 = require('web3')
const HDWalletProvider = require('@truffle/hdwallet-provider')
const protocol = 'http'
const ip = '127.0.0.1'
const port = 9650
Web3.providers.HttpProvider.prototype.sendAsync = Web3.providers.HttpProvider.prototype.send
const provider = new Web3.providers.HttpProvider(`${protocol}://${ip}:${port}/ext/bc/C/rpc`)
const privateKeys = [
'0x56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027',
'0x7b4198529994b0dc604278c99d153cfd069d594753d471171a1d102a10438e07',
'0x15614556be13730e9e8d6eacc1603143e7b96987429df8726384c2ec4502ef6e',
'0x31b571bf6894a248831ff937bb49f7754509fe93bbd2517c9c73c4144c0e97dc',
'0x6934bef917e01692b789da754a0eae31a8536eb465e7bff752ea291dad88c675',
'0xe700bdbdbc279b808b1ec45f8c2370e4616d3a02c336e68d85d4668e08f53cff',
'0xbbc2865b76ba28016bc2255c7504d000e046ae01934b04c694592a6276988630',
'0xcdbfd34f687ced8c6968854f8a99ae47712c4f4183b78dcc4a903d1bfe8cbf60',
'0x86f78c5416151fe3546dece84fda4b4b1e36089f2dbc48496faf3a950f16157c',
'0x750839e9dbbd2a0910efe40f50b2f3b2f2f59f5580bb4b83bd8c1201cf9a010a',
]
module.exports = {
networks: {
development: {
provider: () => {
return new HDWalletProvider({
privateKeys: privateKeys,
providerOrUrl: provider,
})
},
network_id: '*',
gas: 3000000,
gasPrice: 225000000000,
},
},
}
The command I run:
truffle exec fund-cchain-addresses.js --network development
Details:
I manually run a local test network
Don't hesitate if you need more details ✌️
Thanks,
I see that there is a guide to set up a Ledger Nano S/X with Avalanche. However in the guide it states:
The Avalanche Ledger wallet app is currently available via Ledger Live in Experimental Mode.
Why is this? Is enabling Avalanche to work with ledger in the standard mode (non-expiremntal mode) a feature request I should be requesting from Ledger or here?
Thank you!
Hi,
Do u have any plan to finish turkish documentation? I already translate some parts but Turkish branch of this repo is not seems like in your priority. I want to contribute Turkish branch, so if you have any milestones for Turkish branch can you share?
Best Regards.
Information about the structure of this Tx is not present in the doc https://docs.avax.network/build/references/platform-transaction-serialization
The URL in the tutorial does not work. It is:
and should be:
Hello,
first of all I want to thank you for the great documentation. It is really a joy reading through this!
I read through the Avalanche Consensus
chapter today and struggle with understanding one of the steps of the Working Example
section.
I hope it is okay to contact you this way - it would be really nice if you could help me with clearing up my misunderstanding.
In the middle of the example, the node learns about a transaction Y' which conflicts with transaction Y
.
The example then states In this case, two of them say that they prefer Y' and two of them say that they do not prefer Y'
I do not understand why some of the validators would answer that they do not prefer Y' in this case.
Figure 10 in the consensus whitepaper (https://www.avalabs.org/whitepapers) states that a validator will respond with a yes vote for a transaction T, if every ancestor T' is preferred among competing transactions.
As far as I understand the example, the transaction Y' has the ancestors W and V (and other accepted ancestors that were omitted from the example).
Both, W and V should be prefered because the do not have any competing transactions in the examnple as far as I see.
What is the reason for these validators to answer that they do not prefer Y'?
Thanks a lot in advance!
This issue issue covers a followup to the initial documentation page for the Rust SDK simple VM. The initial draft is code heavy and should reference code blocks via GitHub where possible and add more details explanations on the actual implementation details.
ref, #1071
For a transaction like VrnMtekJ691UoddiqUkiy3j9VoKgk71SP8TvmH43PJcNy6GVr in testnet, explorer can show transaction time on page.
But in the docs (like avm.getTx method), I couldn't find where to get transaction time.
Is there a place that I can get transaction time ?
I've deployed an avalanche node on the Fuji network, and imported dashboard from https://github.com/ava-labs/avalanche-docs/tree/master/dashboards , but some panels are not working. I looked at the metrics, and didn't find a avalanche_C_blks_accepted_count
for example. The same issue for many other metrics.
There is no information about Unsigned Tx - AdvanceTime on this page : https://docs.avax.network/build/references/platform-transaction-serialization#unsigned-basetx
It is not clear what happens if you lose your node staker.crt and starker.key keys and your node crashes irrecoverably. Do you only lose your staking rewards or do you also lose all of the avax you staked?
In one answer, we say that token balances are held in smart contracts, but in the other, we say that balances aren't held in a smart contract. Which is it?
Originally posted by @danlaine in #237 (comment)
Searching APIs on the docs site brings up a specific API path that leads to a page with no content:
First result:
https://docs.avax.network/apis/avalanchejs/modules/src_apis_socket/
A lot of other search results link to similar types of pages instead of the content a user would likely be looking for as the first result as well. For example, searching metrics brings up this where the first result has no real content and the second is (to me) the most likely thing a user would be looking for. Would it be possible to remove these pages that don't have any content from the search results?
It doesn't seem like the docs website renders any syntax highlighting for Rust code. For example, see https://docs.avax.network/subnets/create-a-simple-rust-vm. Currently all the Rust code there has no syntax highlighting, making it harder to read for developers.
Syntax highlighting does render as expected in this repository on GitHub.
See FormidableLabs/prism-react-renderer#85 (comment) for some information on how to possibly add Rust support.
I have a set of smart contracts that work very well with ganache. Now I am trying to run them with avalanche and I am following the documentation in:
https://docs.avax.network/build/tutorials/smart-contracts/using-truffle-with-the-avalanche-c-chain
I am using Avast like written in the doc, even in other places it says Avast is deprecated, however, the documentation with truffle is set for avast. When I try to use the network with the command:
npx truffle console --network development
I get the error:
Error: ProviderSubprovider - specified provider does not have a sendAsync method
at new ProviderSubprovider (/home/user/node_modules/web3-provider-engine/subproviders/provider.js:12:34)
at new HDWalletProvider (/home/user/node_modules/@truffle/hdwallet-provider/src/index.ts:255:31)
at Object.provider (/home/user/truffle-config.js:69:16)
at Object.getProvider (/home/user/node_modules/truffle/build/webpack:/packages/provider/index.js:20:1)
at Object.create (/home/user/node_modules/truffle/build/webpack:/packages/provider/index.js:13:1)
at TruffleConfig.get [as provider] (/home/user/node_modules/truffle/build/webpack:/packages/config/dist/configDefaults.js:213:1)
at Object.detect (/home/user/node_modules/truffle/build/webpack:/packages/environment/environment.js:19:1)
at Object.run (/home/user/node_modules/truffle/build/webpack:/packages/core/lib/commands/console.js:47:1)
at Command.run (/home/user/node_modules/truffle/build/webpack:/packages/core/lib/command.js:172:1)
at Object.586806 (/home/user/node_modules/truffle/build/webpack:/packages/core/cli.js:57:1)
at __webpack_require__ (/home/user/node_modules/truffle/build/webpack:/webpack/bootstrap:18:1)
at __webpack_require__.x (/home/user/node_modules/truffle/build/webpack:/webpack/bootstrap:36:1)
at Function.__webpack_require__.x (/home/user/node_modules/truffle/build/webpack:/webpack/runtime/startup chunk dependencies:36:1)
at /home/user/node_modules/truffle/build/webpack:/webpack/startup:3:1
at Object.<anonymous> (/home/user/node_modules/truffle/build/cli.bundled.js:640:12)
at Module._compile (internal/modules/cjs/loader.js:701:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
at Module.load (internal/modules/cjs/loader.js:600:32)
at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
at Function.Module._load (internal/modules/cjs/loader.js:531:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:754:12)
at startup (internal/bootstrap/node.js:283:19)
I am using Ubuntu 20.04
Truffle v5.4.10 (core: 5.4.10)
Solidity - 0.8.7 (solc-js)
Node v10.15.3
Web3.js v1.5.2
What I am doing wrong?
thanks in adavance
Hi, this official tutorial introduced a method for monitoring one node metrics, but what if I have multi nodes?
The dashboard needs a drop-down menu to select host. Something like
Otherwise, say I have 4 nodes, so I need 4x of those same dashboard:
I was trying to map what was coming out of avalanchego's IPC socket for the PChain by reading this page : https://docs.avax.network/build/references/platform-transaction-serialization
But I could not map the bytes I was getting and the tx format mentioned in that page .
After reading the code of Ortelius, I think that there is some missing piece of information in the documentation .
There are no mentions of 'Block' and how we should parse them in that page .
sudo apt-get install grafana doesnt work
had to use
sudo snap install grafana
When working through the guide, after funding, I get this error.
allenharper@Allens-Mac truffle % truffle exec fund-cchain-addresses.js --network development
Using network 'development'.
Exporting 1000 AVAX to each address on the C-Chain...
23xvbLVDTfv73hi7FZfSAA2mEVZiBccMsSBsd5KBM3EQV488Jk
Importing AVAX to the C-Chain...
Please wait
YmTA3qCLiF4nMPRM6L5HQbetQ7znYBuRoSm31Y4yCh8KPZmQ5
allenharper@Allens-Mac truffle % truffle console --network development
truffle(development)> accounts
[
'0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC',
'0x9632a79656af553F58738B0FB750320158495942',
'0x55ee05dF718f1a5C1441e76190EB1a19eE2C9430',
'0x4Cf2eD3665F6bFA95cE6A11CFDb7A2EF5FC1C7E4',
'0x0B891dB1901D4875056896f28B6665083935C7A8',
'0x01F253bE2EBF0bd64649FA468bF7b95ca933BDe2',
'0x78A23300E04FB5d5D2820E23cc679738982e1fd5',
'0x3C7daE394BBf8e9EE1359ad14C1C47003bD06293',
'0x61e0B3CD93F36847Abbd5d40d6F00a8eC6f3cfFB',
'0x0Fa8EA536Be85F32724D57A37758761B86416123'
]
truffle(development)> await web3.eth.getBalance(accounts[0]);
'50000001000000000000000000'
truffle(development)> await web3.eth.getBalance(accounts[1]);
'1000000000000000000'
truffle(development)> migrate --network development
Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.
Starting migrations...
======================
> Network name: 'development'
> Network id: 43112
> Block gas limit: 8000000 (0x7a1200)
1_initial_migration.js
======================
Deploying 'Migrations'
----------------------
Error: *** Deployment Failed ***
"Migrations" -- cb is not a function.
at /usr/local/lib/node_modules/truffle/build/webpack:/packages/deployer/src/deployment.js:365:1
at processTicksAndRejections (internal/process/task_queues.js:95:5)
at Migration._deploy (/usr/local/lib/node_modules/truffle/build/webpack:/packages/migrate/Migration.js:70:1)
at Migration._load (/usr/local/lib/node_modules/truffle/build/webpack:/packages/migrate/Migration.js:56:1)
at Migration.run (/usr/local/lib/node_modules/truffle/build/webpack:/packages/migrate/Migration.js:217:1)
at Object.runMigrations (/usr/local/lib/node_modules/truffle/build/webpack:/packages/migrate/index.js:150:1)
at Object.runFrom (/usr/local/lib/node_modules/truffle/build/webpack:/packages/migrate/index.js:110:1)
at Object.run (/usr/local/lib/node_modules/truffle/build/webpack:/packages/migrate/index.js:87:1)
at runMigrations (/usr/local/lib/node_modules/truffle/build/webpack:/packages/core/lib/commands/migrate/run.js:80:1)
at Object.module.exports [as run] (/usr/local/lib/node_modules/truffle/build/webpack:/packages/core/lib/commands/migrate/run.js:44:1)
at Command.run (/usr/local/lib/node_modules/truffle/build/webpack:/packages/core/lib/command.js:189:1)
truffle(development)>
The tutorial says the prefix should be: 0x1AAvalanche Signed Message:\n
The documentation says that the prefix should be a single byte 0x1a (which you can write as"\x1a"
in a string) and not 4 bytes ("0x1a"
).
https://docs.avax.network/specs/abigen
Would be good to specify that this is in https://github.com/ava-labs/coreth - was not obvious to me and I had to rely on github search to find it.
In the main README.md document: https://github.com/ava-labs/avalanche-docs#snowman-consensus-protocol the link https://github.com/ava-labs/avalanche-docs/blob/master/#avalanche-consensus-protocol is broken. Should it be https://github.com/ava-labs/avalanche-docs/#avalanche-consensus-protocol?
Similarly, in the platform overview README.md document: https://github.com/ava-labs/avalanche-docs/tree/master/learn/platform-overview#platform-chain-p-chain, the link https://github.com/ava-labs/avalanche-docs/blob/master/#snowman-consensus-protocol is broken. Should it be https://github.com/ava-labs/avalanche-docs/#snowman-consensus-protocol?
The releases on https://github.com/ava-labs/avalanchego/releases come with PGP signatures which should be verified by the installer script.
Unfortunately the public keys are nowhere to be found, thus I can't add that myself.
Hi, for IPC params, in doc https://docs.avax.network/build/references/avalanchego-config-flags/#ipcs
IPCS
--ipcs-chain-ids (string)
Comma separated list of chain ids to connect to (e.g. 11111111111111111111111111111111LpoYY,4R5p2RXDGLqaifZE4hHWH9owe34pfoBULn1DrQTWivjg8o4aH). There is no default value.
--ipcs-path (string)
The directory (Unix) or named pipe prefix (Windows) for IPC sockets. Defaults to /tmp.
doc only have two fields, but actually, there are three fields defined in the program, the IPCDefaultChainIDs
param is not covered in doc. If I don't give it a value, there's no IPC file generated.
This is a doc request.
When state transition function needs to change, how to prepare / schedule a mandatory upgrade on an EVM based chain to avoid backend error and mismatch of block hashes
In the documentation for the AVM Transaction Format, the field CodecID
is misplaced at the Signed Transaction.
Currently, a Signed Transaction
includes a field CodecID
in the avalanche documentation. This is incorrectly placed, the CodecID
actually belongs to an Unsigned Transaction
, and needs to be included when signing the transaction to produce a list of Credentials
.
See:
The CodecID
is part of an Unsigned Transaction
, and not a Signed Transaction
.
I noticed this issue while implementing my own rust avalanche wallet, the CodecID
has to be included in the signed message to be accepted. A quick look at the avalanche js source code also revealed that the CodecID
is a part of an Unsigned Transaction
there, so this is most likely an issue with the documentation.
Currently, if you run avalanchego-installer.sh
then it stops the service even if the service's version is the same as the latest release version on github. It would be nice to be able to run avalanchego-installer.sh
as a cron job once a day or so, to get automatic updates without stopping the service for no reason. Thus I propose that upon detecting a running avalanche service, the update script should retrieve its version and compare it to the latest release version from github; if they are the same, then it should exit successfully while taking no further action. The script already has a --reinstall
parameter if someone wants to run the script regardless of whether this check passes.
Hi Team!
Since many protocols are putting BLS12 to use for digital signatures.
I want to verify BLS 12 based signature from Avalanche smart contract.
Hoping for some positive inputs/response on this.
Information about the structure of this Tx is not present in the doc https://docs.avax.network/build/references/platform-transaction-serialization
Hi guys, the last paragraph in this document mentioned how to get avax, but it's in x-chain
now the x-chain's private key is known, the question is how to convert x-chain private key to c chain private key, so I can control and send fund in c chain address to c chain address via metamask?
The guides of the dev toolchains Truffle, Hardhat and Foundry are structured very differently, which makes it hard to compare the different tools and choose the appropriate setup.
I will submit a pull request with a standardized format for the guides
The Using Hardhat with Avalanche C-Chain Guide (new beta docks link here) suggests using Node version 14.17.0, but this appears to be outdated:
$ npm install avalanche@latest
npm WARN notsup Unsupported engine for [email protected]: wanted: {"node":">=16.13.0"} (current: {"node":"14.17.0","npm":"6.14.13"})
It's here in this repo.
Current LTS appears to be Node 16.*
Environment: Ubuntu 20.04
Since this commit, the installer can no longer find the latest version of avalanchego to install
This page has an outdated example: https://docs.avax.network/quickstart/create-a-local-test-network
The following example is probably outdated if I'm not missing something:
cd ${HOME}/go/src/github.com/ava-labs/avalanche-network-runner
go install -v ./cmd/avalanche-network-runner
The contents of the cmd folder as of today are:
drwxrwxr-x 2 4096 Tem 21 22:56 control
drwxrwxr-x 2 4096 Tem 21 22:56 ping
-rw-rw-r-- 1 877 Tem 21 22:56 root.go
drwxrwxr-x 2 4096 Tem 21 22:56 server
There is no file named avalanche-network-runner. In addition, event when I install root.go I can't find the avalanche-network-runner command anywhere in my system.
Thank you.
It would be really nice to document Genesis configuration part, especially allocations. Right now, it is necessary to read code in order to understand how properly configure validators for custom network.
E.g. I'm trying to solve this error message:
panic: runtime error: index out of range [1] with length 1
goroutine 1 [running]:
github.com/ava-labs/avalanchego/genesis.FromConfig(0xc0001aa360)
/root/go/src/github.com/ava-labs/avalanchego/genesis/genesis.go:369 +0x1438
...
My investigation leads me to this code in genesis/genesis.go
:
allNodeAllocations := splitAllocations(skippedAllocations, len(config.InitialStakers))
endStakingTime := genesisTime.Add(time.Duration(config.InitialStakeDuration) * time.Second)
stakingOffset := time.Duration(0)
for i, staker := range config.InitialStakers {
nodeAllocations := allNodeAllocations[i]
Which, in its turn, leads me to the code where allocations from the config are being split according to nodes weights. That code I can't understand in 10 minutes. Especially this part seems to be strange:
currentNodeAllocation = append(currentNodeAllocation, currentAllocation)
allNodeAllocations = append(allNodeAllocations, currentNodeAllocation)
It looks like any element of allNodeAllocations
is a list of only 1 element which defeats the purpose of splitting.
Most likely I'm missing something about it.. Could you document how allocations must be configured in Genesis, please?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.