dogecoin / libdohj Goto Github PK
View Code? Open in Web Editor NEWJava library for adding altcoin support to bitcoinj
License: Apache License 2.0
Java library for adding altcoin support to bitcoinj
License: Apache License 2.0
I sent 48 Doge to a test address: DBKQ84frjBWhapiYngWAeSco2W7RvcQAjS
After calling wallet.toString()
I see the coins a PENDING:
[22:24:14 INFO]: >>> PENDING:
[22:24:14 INFO]: 48.00 BTC total value (sends 0.00 BTC and receives 48.00 BTC)
[22:24:14 INFO]: confidence: Seen by 1 peer (most recently: 2020-08-19T21:24:49Z). Pending/unconfirmed. Source: NETWORK
[22:24:14 INFO]: eabee907e3726cc6ac6da16ae03b0052f6abad481317f3c2d55cdb3dae490b0f
[22:24:14 INFO]: updated: 2020-08-19T21:24:49Z
[22:24:14 INFO]: purpose: UNKNOWN
[22:24:14 INFO]: in PUSHDATA(72)[304502210089cd1246a351001acf54d86e7045d910a83e51079174ed71ddefa5d307671d7902205bc3a6da89321617dd0ba9b3dec479ed7d20c1e3bbbb20cbf8dd913f287f873a01] PUSHDATA(33)[022cdea10fa631ae81abd61a92e821e600945761a75218e82ff10c618cba81c3f1]
[22:24:14 INFO]: unconnected outpoint:38564028beb45b00f50be784a0890e642618789ef22ff69b195abd42f4eebb74:22
[22:24:14 INFO]: out DUP HASH160 PUSHDATA(20)[43c3977ce7d731dcdc6f341cdf7f78f795584ad7] EQUALVERIFY CHECKSIG 48.00 BTC
[22:24:14 INFO]: P2PKH addr:DBKQ84frjBWhapiYngWAeSco2W7RvcQAjS
[22:24:14 INFO]: out DUP HASH160 PUSHDATA(20)[601602fa80becc35bd05aff775ff43819dbee33e] EQUALVERIFY CHECKSIG 9.20961993 BTC
[22:24:14 INFO]: P2PKH addr:DDu9n4yb9sD6haQKs1WP3UiFpKyc9THm6a
[22:24:14 INFO]:
wallet.getBalance()
returns 0 ...
Hello!
I've been playing around with adding Namecoin support to libdohj. I don't have any code to release yet, but I have a quick question about an issue that I'm running into.
When libdohj processes this Namecoin MainNet block: https://namecoin.webbtc.com/block/5fb89c3b18c27bc38d351d516177cbd3504c95ca0494cbbbbd52f2fb5f2ff1ec , I get the error "MergedMiningHeader missing from parent coinbase". This is block height 19414. Namecoin MainNet's first auxpow block was at height 19200, so it looks like a lot of auxpow blocks passed verification before this one failed. I notice that while the previous block does contain the string "fabe6d6d" in the hex representation of its auxpow coinbase (which is the merged mining header), this block does not (although there is auxpow data present and the auxpow bit is set in the block version).
I then looked at the C++ source code for both Namecoin Core and Dogecoin Core. The libdohj auxpow verification code is pretty similar to both of the C++ implementations, except that I cannot find this particular error in either of the C++ implementations. Dogecoin Core instead uses the error "Aux POW chain merkle root must start in the first 20 bytes of the parent coinbase", which only is raised under a subset of circumstances. See https://github.com/dogecoin/dogecoin/blob/master/src/auxpow.cpp#L107 for the relevant function of Dogecoin Core, and https://github.com/dogecoin/libdohj/blob/master/src/main/java/org/bitcoinj/core/AuxPoW.java#L238 for the equivalent function in libdohj.
So, I'm a little bit confused on what the purpose is of this check in libdohj. Is this a consensus difference between libdohj and Dogecoin Core, which Dogecoin has just been lucky enough to not run into in the production blockchain?
Cheers.
-Jeremy Rand, namecoin.org
I get this error
[18:33:19] [Server thread/WARN]: org.bitcoinj.wallet.UnreadableWalletException: Unknown network parameters ID org.dogecoin.production [18:33:19] [Server thread/WARN]: at org.bitcoinj.wallet.WalletProtobufSerializer.readWallet(WalletProtobufSerializer.java:416) [18:33:19] [Server thread/WARN]: at org.bitcoinj.wallet.WalletProtobufSerializer.readWallet(WalletProtobufSerializer.java:391) [18:33:19] [Server thread/WARN]: at org.bitcoinj.wallet.Wallet.loadFromFileStream(Wallet.java:1606) [18:33:19] [Server thread/WARN]: at org.bitcoinj.wallet.Wallet.loadFromFile(Wallet.java:1512) [18:33:19] [Server thread/WARN]: at net.waals.dogecraft.DogeCraft.onEnable(DogeCraft.java:29) [18:33:19] [Server thread/WARN]: at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:263) [18:33:19] [Server thread/WARN]: at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:352) [18:33:19] [Server thread/WARN]: at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:417) [18:33:19] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_15_R1.CraftServer.enablePlugin(CraftServer.java:462) [18:33:19] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_15_R1.CraftServer.enablePlugins(CraftServer.java:376) [18:33:19] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_15_R1.CraftServer.reload(CraftServer.java:811) [18:33:19] [Server thread/WARN]: at org.bukkit.Bukkit.reload(Bukkit.java:576) [18:33:19] [Server thread/WARN]: at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:27) [18:33:19] [Server thread/WARN]: at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:149) [18:33:19] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_15_R1.CraftServer.dispatchCommand(CraftServer.java:711) [18:33:19] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_15_R1.CraftServer.dispatchServerCommand(CraftServer.java:696) [18:33:19] [Server thread/WARN]: at net.minecraft.server.v1_15_R1.DedicatedServer.handleCommandQueue(DedicatedServer.java:436) [18:33:19] [Server thread/WARN]: at net.minecraft.server.v1_15_R1.DedicatedServer.b(DedicatedServer.java:400) [18:33:19] [Server thread/WARN]: at net.minecraft.server.v1_15_R1.MinecraftServer.a(MinecraftServer.java:984) [18:33:19] [Server thread/WARN]: at net.minecraft.server.v1_15_R1.MinecraftServer.run(MinecraftServer.java:824) [18:33:19] [Server thread/WARN]: at java.base/java.lang.Thread.run(Thread.java:834)
I tried to compile this library against bitcoinj-0.14-SNAPSHOT
(from their current master branch, 4112ed8
) and i get a ton of errors, see https://gist.github.com/patricklodder/59466aeb6686a4564fb0
steps to reproduce:
bitcoinj:
git checkout 4112ed8
mvn clean install
libdohj:
git checkout 0f9910c
mvn -DskipTests clean package
Am i missing something or is this just not ready yet?
Is the library available in the maven central repository?
Currently, bitcoinj statically sets and reads NetworkParams.PROTOCOL_VERSION
in many places such as PeerGroup
. I did a quick patch to both bitcoinj and libdohj to be able to connect to 1.8.x nodes, basically implementing NetworkParams.getProtocolVersion()
and overriding that in AbstractDogecoinParams
.
Do you have a smarter way of doing this without having to patch bitcoinj?
bitcoinj 0.15 made changes to classes like NetworkParameters
that seem incompatible with libdohj. For example I'm getting the following error message when trying to use Namecoin parameters (over in ConsensusJ):
Failed to instantiate [org.bitcoinj.core.NetworkParameters]: Factory method 'networkParameters' threw exception; nested exception is java.lang.NoSuchFieldError: bip32HeaderPub
Dogecoin Regtest should also be added to the project as DogetcoinRegtestParams.java
I'm adding this here in case someone has this lying around, if not I'll add it myself in the coming week.
Relevant file to get parameters from:
https://github.com/dogecoin/dogecoin/blob/master/src/chainparams.cpp
I tried to start download blockchain in testnet. However it just keep throwing exceptions and do not start to download blockchain.
2021-02-08 15:50:00.776 INFO 14168 --- [eerGroup Thread] o.b.c.PeerSocketHandler : [116.62.229.19]:44556 - java.nio.channels.CancelledKeyException
2021-02-08 15:50:02.774 WARN 14168 --- [eerGroup Thread] o.b.n.ConnectionHandler : Error writing message to connection, closing connection
java.nio.channels.CancelledKeyException: null
at sun.nio.ch.SelectionKeyImpl.ensureValid(SelectionKeyImpl.java:74) ~[?:?]
at sun.nio.ch.SelectionKeyImpl.interestOps(SelectionKeyImpl.java:93) ~[?:?]
at org.bitcoinj.net.ConnectionHandler.setWriteOps(ConnectionHandler.java:106) ~[bitcoinj-core-0.15.6.jar:?]
at org.bitcoinj.net.ConnectionHandler.writeBytes(ConnectionHandler.java:152) [bitcoinj-core-0.15.6.jar:?]
at org.bitcoinj.core.PeerSocketHandler.sendMessage(PeerSocketHandler.java:92) [bitcoinj-core-0.15.6.jar:?]
at org.bitcoinj.core.Peer.ping(Peer.java:1569) [bitcoinj-core-0.15.6.jar:?]
at org.bitcoinj.core.Peer.ping(Peer.java:1560) [bitcoinj-core-0.15.6.jar:?]
at org.bitcoinj.core.PeerGroup$12.run(PeerGroup.java:1554) [bitcoinj-core-0.15.6.jar:?]
at com.google.common.util.concurrent.MoreExecutors$ScheduledListeningDecorator$NeverSuccessfulListenableFutureTask.run(MoreExecutors.java:644) [guava-30.0-android.jar:?]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [?:?]
at java.util.concurrent.FutureTask.runAndReset$$$capture(FutureTask.java:305) [?:?]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java) [?:?]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) [?:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) [?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) [?:?]
at org.bitcoinj.utils.ContextPropagatingThreadFactory$1.run(ContextPropagatingThreadFactory.java:51) [bitcoinj-core-0.15.6.jar:?]
at java.lang.Thread.run(Thread.java:832) [?:?]
Does dogecoin have its own branding for libdohj? I don't see the resources overridden from the bitcoin ones here in this repository? Also shouldn't the payment extension proto file be a part of the parameters for each coin that wants to integrate, since the genesis block is hardcoded inside of it?
Does this work as a litecoin standalone android wallet aswell or is the idea that it would serve as ACCT between doge and ltc and any other coins?
The examples use dogecoinj but the package installed is libdohj. This is confusing...
Hello!
I might have found a consensus bug between Dogecoin Core and libdohj. I'm not totally confident that it's a bug, and it's entirely plausible that I'm just doing something stupid, but I figured I'd check where you want me to report possible consensus bugs, since sometimes such bugs are exploitable.
Thanks. (And sincere apologies if I'm wasting your time with something that's not a consensus bug, which is totally possible.)
I get this error when I build this dependency. I get 404 error when I click on those links.
* What went wrong:
Execution failed for task ':app:mergeDebugNativeLibs'.
> Could not resolve all files for configuration ':app:debugRuntimeClasspath'.
> Could not find com.github.dogecoin:libdohj:0.15.9.
Searched in the following locations:
- https://dl.google.com/dl/android/maven2/com/github/dogecoin/libdohj/0.15.9/libdohj-0.15.9.pom
- https://repo.maven.apache.org/maven2/com/github/dogecoin/libdohj/0.15.9/libdohj-0.15.9.pom
- https://jcenter.bintray.com/com/github/dogecoin/libdohj/0.15.9/libdohj-0.15.9.pom
Required by:
project :app
In class org.libdohj.params.AbstractDogecoinParams.java, method createGenesis, the byte array of string "04ffff001d0104084e696e746f6e646f" is retrieved.
In dogecoin code, it is pszTimestamp, which is Nintodo, while in java during decode, I get Nintodo but prefix with some funny charatcters.
Could you please update me as how did you get "04ffff001d0104084e696e746f6e646f" from Nintondo?
It would be great because I am trying to extend this feature for my test project as proof of concept of porting c++ crypto to java code.
Thank you.
Hi,
I have one suggestion: If you write your examples, please change the pom.xml file this way you can use it from everywhere. Not only if you are using the project in the same file path as libdohj.
I currently has no idea how to use your library with maven.
I'm truely not familar with maven, but I googled some tutorials how to use git repositorys as dependency, but they didn't work...
So it would be nice if I could copy your examples and they would work out of the box...
T
According to the following site:
https://litecoin.info/Transaction_fees
The minimum non-dust output of litecoin is 0.001 LTC.
In the AbstractLitecoinParams.java file this parameter is set to Coin.COIN:
@Override
public Coin getMinNonDustOutput() {
return Coin.COIN;
}
Which is 1 LTC:
/**
* The number of satoshis equal to one bitcoin.
*/
private static final long COIN_VALUE = LongMath.pow(10, SMALLEST_UNIT_EXPONENT);
/**
* One Bitcoin.
*/
public static final Coin COIN = Coin.valueOf(COIN_VALUE);
Note: in Doge it's also set to 1 Doge (litecoin probably copy-pasted this), in namecoin it's set to the bitcoin default Transaction.MIN_NONDUST_OUTPUT;
which is 2730 satoshi.
Proposal:
@Override
public Coin getMinNonDustOutput() {
return Coin.valueof(100000);
}
Can anyone confirm this interpretation?
Should the other values in that table be checked as well?
why this address startwith '9r' ,What type of address is this!
Hi Guys,
I can't send multiple spends. If I do it, I got a InsufficientMoneyException. I think I need not to tell you, that I have enough coins on that wallet.
I'm using this library for dogecoin, but that shouldn't be the reason.
The number of transactions that work is different. Sometimes works just one. Sometimes two or three. But never more.
I tried to rise the fee to 1Coin/kb . But that didn't change anything.
Its not so cool because my program should send multiple transactions at once.
T
Hello, I have intgerated library with bitcoinj and libdohj. But when I am starting walletAppKit to sync chain, my syncing is stuck at
2021-09-05 22:51:10.028 INFO 4146 --- [ioClientManager] org.bitcoinj.core.PeerGroup : Not yet setting download peer because there is no clear candidate.
2021-09-05 22:51:14.656 INFO 4146 --- [andler timeouts] org.bitcoinj.core.PeerGroup : [174.88.141.32]:22556: Peer died (11 connected, 0 pending, 12 max)
Can anybody help ?
Please add support for P2SH and bech32 address types for Litecoin. I wish I had the knowledge to do so. Maybe you can use this.
P2SH:
val key = ECKey.fromPrivate(BigInteger("12"))
val redeemScript: Script = ScriptBuilder.createP2WPKHOutputScript(key)
val script = ScriptBuilder.createP2SHOutputScript(redeemScript)
val scriptHash = ScriptPattern.extractHashFromP2SH(script)
LegacyAddress.fromScriptHash(params, scriptHash).toString()
bech32:
SegwitAddress.fromKey(params, key).toString()
All address types:
MKyc39yFiUtVBFkE7Av1iuU5GHX9eHYRrx
LfNppYBGy9fdDzFbcddJKYR2e6ZZqCfsnW
ltc1qm5gqhe7e46jhyy2ca00x66slmrlljwa340ldnq
I have set up dogecoin-core node and configured it. Could anyone, please, show example how to use the libdohj with it ?
BIP91 fix => if it's litecoin, always give the real bits, not only the baseversion ones.
See https://github.com/bitcoinj/bitcoinj/blob/v0.14.2/core/src/main/java/org/bitcoinj/core/StoredBlock.java#L131
This method is invoked by bitcoinj's blockstores (eg LevelDBBlockStore) before storing a block, so AuxPow is missing from blocks stored in blockstores.
Hi,
I added libdohj-core-0.14-SNAPSHOT.jar & below dependencies
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>com.lambdaworks</groupId>
<artifactId>scrypt</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.bitcoinj</groupId>
<artifactId>**bitcoinj-core**</artifactId>
<version>**0.14.2**</version>
</dependency>
</dependencies>
Now receive coins working but send not working i.e tx hash show tx not found on blockchain.
Please check below log.
2018-08-01 13:23:58,172 ERROR [org.bitcoinj.core.Context] (EJB default - 3) Performing thread fixup: you are accessing bitcoinj via a thread that has not had any context set on it.
2018-08-01 13:23:58,172 ERROR [org.bitcoinj.core.Context] (EJB default - 3) This error has been corrected for, but doing this makes your app less robust.
2018-08-01 13:23:58,172 ERROR [org.bitcoinj.core.Context] (EJB default - 3) You should use Context.propagate() or a ContextPropagatingThreadFactory.
2018-08-01 13:23:58,172 ERROR [org.bitcoinj.core.Context] (EJB default - 3) Please refer to the user guide for more information about this.
2018-08-01 13:23:58,172 ERROR [org.bitcoinj.core.Context] (EJB default - 3) Thread name is EJB default - 3.
2018-08-01 13:23:58,173 INFO [com.eno.doge.DOGEConfig] (EJB default - 3) DOGEConfig_sendCoin:Balance=1005.00 BTC
2018-08-01 13:23:58,386 INFO [org.bitcoinj.crypto.KeyCrypterScrypt] (EJB default - 3) Deriving key took 206.7 ms for 16384 scrypt iterations.
2018-08-01 13:23:58,387 INFO [org.bitcoinj.wallet.Wallet] (EJB default - 3) Completing send tx with 1 outputs totalling 3.00 BTC and a fee of 2.00 BTC/kB
2018-08-01 13:23:58,398 INFO [org.bitcoinj.wallet.Wallet] (EJB default - 3) with 996.55 BTC change
2018-08-01 13:23:58,421 INFO [org.bitcoin.Secp256k1Context] (EJB default - 3) java.lang.UnsatisfiedLinkError: no secp256k1 in java.library.path
2018-08-01 13:23:58,436 INFO [org.bitcoinj.wallet.Wallet] (EJB default - 3) completed: a2838d507fcf1df990cf0017e00d73a4ebb2cd57b2f69df75bfd5660144b8717
in PUSHDATA(71)[3044022047c0b6134e0a93cdea2a490ace87773da901a1f89e5300b76d59da7ae3c2a6d7022003f568d96638d4d7a8a3f7cc3019e0663c8526e872e5ebd912e904d184804ea301] PUSHDATA(33)[02072314acce50e737791e490bff7ff44a66a325680d00f60898674a191e355f96] 1000.00 BTC
outpoint:459bf5db26759e08f515b36caf284258776219c676f796f8a760aa3fc86fd140:0 hash160:d0108b2243988bb583e731ed0d03e25c85038f48
out DUP HASH160 PUSHDATA(20)[143754b58fcbf5504ad7f4833c2b62d5b2867c80] EQUALVERIFY CHECKSIG 996.55 BTC
out HASH160 PUSHDATA(20)[f1fcaab99bddd4171a1756850d95510c4bc05355] EQUAL 3.00 BTC
fee 2.01793721 BTC/kB, 0.45 BTC for 223 bytes
prps USER_PAYMENT
2018-08-01 13:23:58,437 INFO [org.bitcoinj.wallet.Wallet] (EJB default - 3) commitTx of a2838d507fcf1df990cf0017e00d73a4ebb2cd57b2f69df75bfd5660144b8717
2018-08-01 13:23:58,438 INFO [org.bitcoinj.wallet.Wallet] (EJB default - 3) marked 459bf5db26759e08f515b36caf284258776219c676f796f8a760aa3fc86fd140:0 as spent by a2838d507fcf1df990cf0017e00d73a4ebb2cd57b2f69df75bfd5660144b8717
2018-08-01 13:23:58,438 INFO [org.bitcoinj.wallet.Wallet] (EJB default - 3) 459bf5db26759e08f515b36caf284258776219c676f796f8a760aa3fc86fd140 prevtx <-unspent ->spent
2018-08-01 13:23:58,439 INFO [org.bitcoinj.wallet.Wallet] (EJB default - 3) ->pending: a2838d507fcf1df990cf0017e00d73a4ebb2cd57b2f69df75bfd5660144b8717
Can anyone help to find issue ?
I'm was trying to parse this block (not the only block this happens on and i suspect it happens on every block, but I get other errors as well): https://chain.so/block/DOGE/93a207e6d227f4d60ee64fad584b47255f654b0b6378d78e774123dd66f4fef9
and I got this error:
org.bitcoinj.core.VerificationException: Could not verify block 93a207e6d227f4d60ee64fad584b47255f654b0b6378d78e774123dd66f4fef9
v6422786 block:
previous block: a7f7608564c0dceef9b31727737deb0a993ea1c86b20b2b82df202ad29a54df2
merkle root: b05f1fc14419b84487ffaed409f80d7d3cfac4278b8c79c116e38fa92ce1a068
time: [1443439703] 2015-09-28T11:28:23Z
difficulty target (nBits): 453187912
nonce: 0
with 7 transaction(s):
7ed90038f8b4a63c9f5fec18775738a000552d5622e76b838b61ab8bc1c93edb: Unknown confidence level.
== COINBASE TXN (scriptSig PUSHDATA(3)[8fa70d] PUSHDATA(15)[e4b883e5bda9e7a59ee4bb99e9b1bc] PUSHDATA(32)[5b323031352d30392d32385431313a32383a32342e3937303432363335325a5d]) (scriptPubKey PUSHDATA(33)[0214a5f15a73686b64cf27405e018e2f06e0501b52f4ff98282badd9d6948fb57d] CHECKSIG)
[..]
at org.bitcoinj.core.AbstractBlockChain.add(AbstractBlockChain.java:295)
at org.bitcoinj.core.Peer.processBlock(Peer.java:841)
at org.bitcoinj.core.Peer.processMessage(Peer.java:358)
at org.bitcoinj.core.PeerSocketHandler.receiveBytes(PeerSocketHandler.java:182)
[..]
Caused by: org.bitcoinj.core.VerificationException: Aux POW wrong index
at org.bitcoinj.core.AuxPoW.checkProofOfWork(AuxPoW.java:370)
at org.bitcoinj.core.AltcoinBlock.checkProofOfWork(AltcoinBlock.java:246)
at org.bitcoinj.core.Block.verifyHeader(Block.java:638)
at org.bitcoinj.core.AltcoinBlock.verifyHeader(AltcoinBlock.java:274)
[..]
The cause is this check: AuxPoW.java#L363-L373
which seems to be the same implementation as auxpow.cpp#L84-L90
with the exception of the cpp implementation being an unsigned int as opposed to a (signed) Long.
Any ideas?
Please can you help us in creating java Library for our coin.
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.