etcdevteam / emerald-vault-archive Goto Github PK
View Code? Open in Web Editor NEWARCHIVE. CODE MOVED TO:
Home Page: https://github.com/emeraldpay/emerald-vault
License: Apache License 2.0
ARCHIVE. CODE MOVED TO:
Home Page: https://github.com/emeraldpay/emerald-vault
License: Apache License 2.0
$ emerald balance 0xdbaebfe227e6b29fceac4f4da22d7daa72eec8a0 --chain morden
1234500000000000000
$ emerald balance 0xdbaebfe227e6b29fceac4f4da22d7daa72eec8a0 --chain morden --hex
0x1121D33597384000
$ emerald balance 0xdbaebfe227e6b29fceac4f4da22d7daa72eec8a0 --chain morden --unit ether
1.2345
--> src/rpc/http.rs:30:5
|
30 | EthGetTxByHash,
| ^^^^^^^^^^^^^^
|
= note: #[warn(dead_code)] on by default
cli
need to be able to handle connection to a remote node.
Required for transaction signing.
Rust stable 1.26
provided feture impl Trait
for generic types, it should be used to remove old approach with boxed trait object.
~/dev/etc/emerald-cli master= ⟠ emerald import --chain=mainnet path/to/key_encrypted
[ERROR] Command execution error: Invalid keystore file decoding: MissingFieldError("crypto")
~/dev/etc/emerald-cli master= ⟠ cat path/to/key_encrypted
{"version":3,"id":"asdf-asdf-asdf-asdf-asdf","address":"0x539blahblah","Crypto":{"cipher [...]
sed -i 's/Crypto/crypto/' path/to/key_encrypted
and all is ok. I guess all key/values should be case insensitive?
It should be easier to read in table-like structure:
$ emerald list --chain testnet
ADDRESS NAME
0x6475efceda36524c381fa7ea429c51c1e5d60b68 Test 1
0x83e4fc1f1922919845e5dda843c6d1191837ea6b My another account
Also, description and total count may be avoided for that simple list (easier to parse output, it's ofter required)
Currently password input for creating a new account is rendered visibly. Would it be possible to hide the input to prevent over-the-shoulder attacks?
emerald-cli/target/release travis-deploy ⟠ ./emerald new --chain testnet
! Warning: passphrase can't be restored. Don't forget it !
Enter passphrase:
foo
Created new account: 0xb0d31ea6af9390c2727023eb8ec750f0cb7268f7
&
emerald new --chain testnet --security-level high "Test account" < echo "secret passphrase"
Maybe also worth considering using a 2x-input prompt for password confirmation? eg.
Enter your new passphrase:
***
Confirm your new passphrase:
****
> Yikes! Those passphrases don't match. New account creation aborted.
Build from travis
and appveyor
should be uploaded to the etcdev builds
Required section with examples, where set emerald used inside shell scripts for set of use cases:
emerald --chain=morden transaction \
0x3fdc12e77912620c907a1c65a076b38b307968fd \
0x86da613e694670fb3a61ce0a565ab40bb27ed60d \
0x100 \
--nonce=0x1 --gas=0x2100 --gas-price=0x15115
Enter passphrase:
[ERROR] Command execution error: http://127.0.0.1:8545/: Connection refused (os error 61)
If upstream is not specified it should generate an offline transaction (i.e. put to stdout) instead of sending it right now
$ emerald transaction <....>
Enter passphrase:
testtest
Password shouldn't be visible
emerald parsetx <raw-tx> [--skip-data] [-h]
where:
--skip-data
skips data putput-h
human friendly values. Should find closes valeu unit (Ether, Mwei, Gwei, etc), for example instead of Value (wei): 18451607206952527473
should be Value (Ether): 18.4516
, for value and gas priceExample:
emerald parsetx 0xf863018301511582210094863a61ceb4694670fb0bb27da613eed60a565a0d808081a0a080c85533886b7cc2b34588812e9bf184cb7279c22b4ef78ac1f3ef2e75612a84a009b21594af0788db05f4ccdf5ccbe999e11ed8cbd110fb17d192094474681e38
Address: 0x3fd9075a076b38b3a1c6c12e77912620c07968fd
Nonce: 1
To: 0x863a61ceb4694670fb0bb27da613eed60a565a0d
Value (wei): 0
Data:
Gas limit: 8448
Gas price (wei): 86293
(notice that values are not in hex but dec)
CLI misses ability to chain selection with argument --chain
. Need to be implemented
Introduce a new option --format=<text|json>
By default the output format is text
, for a human. Another alternative would be JSON output that simplifies integration with external tools.
emerald --chain=morden list
ADDRESS NAME
0x907c6c1a17707968fd238b91263fde5a076b20c3
0x60da613e63a6180a565a0dedcebb2770fbb46946 test 2
emerald --chain=morden --format=json list
[{"address":"0x907c6c1a17707968fd238b91263fde5a076b20c3", "name": null}, {"address": "0x60da613e63a6180a565a0dedcebb2770fbb46946", "name": "test 2"}]
Just:
emerald transaction [--chain=<chain>] <from> <to> [--gas=<gas>] [--gas-price=<price>] [--data=<data>] (--nonce=<nonce> | --upstream=<upstream>)
emerald transaction [--chain=<chain>] <from> [--gas=<gas>] [--gas-price=<price>] [--data=<data>] (--nonce=<nonce> | --upstream=<upstream>)
Use 0 if not passed. It's especially important for to
parameter, because when a use wants to deploy a contract with current schema it need to figure out that zero-address (i.e. count all zeroes), it's error prone.
Also, it's better to make both parameters as named by default but keep full from-to-value as a shorthand:
emerald transaction [--chain=<chain>] <from> [--to=<address>] [--value=<value>] [--gas=<gas>] [--gas-price=<price>] [--data=<data>] (--nonce=<nonce> | --upstream=<upstream>)
emerald transaction [--chain=<chain>] <from> <to> <value> [--gas=<gas>] [--gas-price=<price>] [--data=<data>] (--nonce=<nonce> | --upstream=<upstream>)
Currently Keyfiles converted to lower case, to handle all keys while encode/decode to JSON.
This causes optional name
and description
to loose defined case
cli
need to parse enviroment variables for common arguments
Sending raw transaction is not described in documentation http://docs.etcdevteam.com/emerald-platform/emerald-cli
implementation #90
With --upstream=https://web3.gastracker.io
it produces error:
emerald balance 0x907c6c1a17707968fd238b91263fde5a076b20c3 --upstream=https://web3.gastracker.io
[INFO] Missed `--chain` argument. Use default: `mainnet`
[ERROR] Command execution error: no connection to client
Maybe because of https
It seems that JSON-RPC Method emerald_listAccounts
doesn't handle chain parameter properly
Currently it always expect hex for all value, which is no user friendly. It should parse as hex only if it has 0x
prefix.
Following should generate identical transaction value:
emerald transaction \
0x3fd9075a076b38b3a1c6c12e77912620c07968fd \
0x863a61ceb4694670fb0bb27da613eed60a565a0d \
1234567890
emerald transaction \
0x3fd9075a076b38b3a1c6c12e77912620c07968fd \
0x863a61ceb4694670fb0bb27da613eed60a565a0d \
0x499602d2
I think it would be really useful to provide some specific help information for each command (including one example with most basic possible use, and one with ultra-fancy use).
Further, to provide some kind of information about units for each required arg. For example,
~/dev/etc/emerald-cli master= ⟠ emerald transaction --help
Invalid arguments.
Usage:
emerald server [--port=<port>] [--host=<host>] [--base-path=<path>] [-v | --verbose] [-q | --quite]
emerald new --chain=<chain> ([[--security-level=<level>] [--name=<name>] [--description=<description>]] | --raw <key>)
emerald list --chain=<chain> [--show-hidden]
emerald hide --chain=<chain> <address>
emerald unhide --chain=<chain> ([-a | --all] | <address>)
emerald strip --chain=<chain> <address>
emerald import --chain=<chain> [-a | --all] [-f | --force] <path>
emerald export --chain=<chain> ([-a | --all] | <address>) <path>
emerald update --chain=<chain> <address> [--name=<name>] [--description=<description>]
emerald transaction --chain=<chain> <from> <to> <value> [--gas=<gas>] [--gas-price=<price>] [--data=<data>] (--nonce=<nonce> | --upstream=<upstream>)
emerald balance <address> [--upstream=<upstream>]
emerald -V | --version
emerald -h | --help
should give something like
emerald transaction --chain=<chain> <from> <to> <value> [--gas=<gas>] [--gas-price=<price>] [--data=<data>] (--nonce=<nonce> | --upstream=<upstream>)
--nonce=<nonce> is optional; if not provided you must ensure it will be set by your '--upstream' client
--gas=<gas> is in 0x-prefixed hex encoding
...
A couple of examples:
emerald transaction --chain=mainnet 0xblahblah 0xblahblah 100000
emerald transaction --chan=morden 0xblahblah 0xblahblah 0x539000 --gas-price=0x21000 --gas=0x2100000 --data="Happy birthday" --upstream=127.0.0.1:8545
... Because I have questions like
<gas>
in hex, wei, or ether?"<data>
is 0x
-hex-encoded? (But it would be cool if I could leave a message real easy there for my buddy like ':beers: on me')"--name
for my account instead of an address for <from>
?"Emerald-cli should provide command to add storage for custom chain.
Ex:
emerald add-storage <chain_name>
~/dev/etc/emerald-cli master= ⟠ emerald list
Invalid arguments.
Usage:
emerald server [--port=<port>] [--host=<host>] [--base-path=<path>] [-v | --verbose] [-q | --quite]
emerald new --chain=<chain> ([[--security-level=<level>] [--name=<name>] [--description=<description>]] | --raw <key>)
emerald list --chain=<chain> [--show-hidden]
emerald hide --chain=<chain> <address>
emerald unhide --chain=<chain> ([-a | --all] | <address>)
emerald strip --chain=<chain> <address>
emerald import --chain=<chain> [-a | --all] [-f | --force] <path>
emerald export --chain=<chain> ([-a | --all] | <address>) <path>
emerald update --chain=<chain> <address> [--name=<name>] [--description=<description>]
emerald transaction --chain=<chain> <from> <to> <value> [--gas=<gas>] [--gas-price=<price>] [--data=<data>] (--nonce=<nonce> | --upstream=<upstream>)
emerald balance <address> [--upstream=<upstream>]
emerald -V | --version
emerald -h | --help
~/dev/etc/emerald-cli master= ⟠ echo $EMERALD_CHAIN
mainnet
Maybe other ENV_VARS not getting set? I didn't check anything else.
Possible dup #35 ?
It would be very useful for me to be able to easily reference success/error return values.
For example below, I'm not sure if the command will return just the signed raw transaction 0xdeadbeef123....
in stdout or it it will show something more verbose that I'll need to parse, like:
$ emerald transaction new 0xabc... 0xdef... 0x1000
> Created raw signed transaction:
> 0xdeadbeef123...
$ emerald transaction new --help
emerald-transaction-new
Build new transaction
USAGE:
emerald transaction new <from> <to> <value> [ARGS]
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
ARGS:
<from> Senders address
<to> Receiver address
<value> Amount ot send
<gas> Gas limit for transaction
<gas-price> Gas price
<data> Transation data
<nonce> Nonce value for sender
Instead of building a new tx, should allow to send existing provided raw transaction and output txid (or rpc code + error):
$ emerald transaction --upstream localhost:8545 --raw 0x1234...890
0x1daca18fa64eee94fded661fdaf36cc24344e718f4fa9192e6718454617d9f15
$ cat rawtx.txt | emerald transaction --upstream localhost:8545 --raw -
0x24c7157980d9552ab67203a9840f4552b016a287c81457c1018f5c22ddcd5edc
$ cat rawtx.txt | emerald transaction --upstream localhost:8545 --raw -
Error 32000: Transaction nonce is too low
Currently it requires an IP and a port, which works fine for a local node, but doesn't work for a remote one that uses https for example. Let's use just an URL instead of IP:PORT. Like:
emerald server --upstream https://web3.gastracker.io/morden
Required easy way to install emerald-cli
using package managers on main distros (Debian, Arch, FreeBSD).
Also, required support for Linux man
command to display usage.
Just in case there's ever another testnet adopted, it can't hurt to be able to be specific.
For some users I imagine that it might be more familiar and encouraging
to be walked through transaction creation. As it is currently, the integrity and
validity of the transaction requires putting the right values in the right order,
and adding and reading the usage information to determine the availability and specs
for optional flags you might like to use, eg gas price/limit. For some, this
be a daunting challenge. Here's an idea for a friendlier way.
# Use '--interactive|-i' flag to enable interactive mode.
$ emerald transaction -i
Welcome to interactive transaction creation mode.
Here's an overview of required and available transaction values:
Transaction REQUIRED values:
- from: the sender address for the transaction. This should be in 0x-prefixed hexadecimal format.
- to: the recipient address for the transaction. This should be in 0x-prefixed hexadecimal format.
- value: the amount to transfer. You will be prompted whether your input value should be interpreted as 0x-prefixed hexadecimal, as eth, wei, or mgas.
Transaction OPTIONAL values:
- gas: the upper limit for gas the transaction is willing to pay for processing. Like 'value', you'll be able to choose hex, eth, wei, or mgas units.
- gas-price: the multiplier for the gas price. Like 'value', you'll be able to choose hex, eth, wei, or mgas units.
Transaction OPTIONAL metadata:
- note: add a note for this transaction. A note will *not* be included with the raw signed transaction or anywhere on the blockchain. This is just for personal reference.
Transaction management:
- upstream: (default: 127.0.0.1:8545) Set an HTTP-RPC endpoint for broadcasting your transaction to a node like geth.
- broadcast: (default: no) If you'd like to broadcast your transaction immediately after signing this transaction.
- keep: (default: yes) If you'd like to store your transaction for later use.
The output of this command will be a raw signed transaction sent to stdout.
At any point during this interaction you can use the following commands:
[f - edit from]
[t - edit to]
[v - edit value]
[$ - edit value units]
[g - edit gas limit]
[p - edit gas price]
[u - edit upstream endpoint]
[n - edit note]
[b - edit if should broadcast]
[k - edit if should keep]
[= - show transaction values]
[s - skip prompt]
[? - show help/usage]
[quit - exit interactive mode]
----
from:
> 0xabc1234...
to:
> 0xdef5678...
value:
> =
from: 0xabc1234
to: 0xdef5678
value:
> 1.42
value units: [hex|eth|wei|mgas]
> eth
gas:
> s
gas-price:
> s
note:
> My first interactive transaction! Cool!
upstream:
> 127.0.0.1:8546
broadcast: [yes|No]
> s # Note: skipping enables default No.
keep: [Yes|no]
> yes
You're almost done! Everything look ok?
from: 0xabc1234
to: 0xdef5678
value: eth=1.42 hex=0x1337000 wei=1420000000000000000000000 mgas=142000000000000
gas: [client default]
gas-price: [client default]
upstream: 127.0.0.1:8546
broadcast: no
keep: yes
Use 'quit' to finish, or any of the following edit commands to keep editing:
[f - edit from]
[t - edit to]
[v - edit value]
[$ - edit value units]
[g - edit gas limit]
[p - edit gas price]
[u - edit upstream endpoint]
[n - edit note]
[b - edit if should broadcast]
[k - edit if should keep]
[= - show transaction values]
[s - skip prompt]
[? - show help/usage]
[quit - exit interactive mode]
> f
from:
> 0xabc9999
from: 0xabc9999
to: 0xdef5678
value: eth=1.42 hex=0x1337000 wei=1420000000000000000000000 mgas=142000000000000
gas: [client default]
gas-price: [client default]
note: "My first interactive transaction! Cool!"
upstream: 127.0.0.1:8546
broadcast: no
keep: yes
> quit
0xrawSignedTransaction
~/Library/EthereumClassic ⟠ which emerald
/usr/local/bin/emerald
~/Library/EthereumClassic ⟠ emerald -V
v0.19.0
~/Library/EthereumClassic ⟠ emerald new --chain mainnet
! Warning: passphrase can't be restored. Don't forget it !
Enter passphrase:
Created new account: 0x2c1ed20222ef60eb4d88cc54c18319ec7fbf547d
~/Library/EthereumClassic ⟠ emerald list
ADDRESS NAME
0x2c1ed20222ef60eb4d88cc54c18319ec7fbf547d
0xc1243818f7b39454310b3b4262a2a83882e0150f testes
~/Library/EthereumClassic ⟠ emerald export 0x2c1ed20222ef60eb4d88cc54c18319ec7fbf547d ./add.json
[ERROR] Command execution error: No such file or directory (os error 2)
~/Library/EthereumClassic ⟠ emerald export 0x2c1ed20222ef60eb4d88cc54c18319ec7fbf547d $pwd/add.json
[ERROR] Command execution error: No such file or directory (os error 2)
~/Library/EthereumClassic ⟠ emerald export --chain mainnet 0x2c1ed20222ef60eb4d88cc54c18319ec7fbf547d ./add.json
[ERROR] Command execution error: No such file or directory (os error 2)
~/Library/EthereumClassic ⟠ emerald --help | grep export
emerald export [--chain=<chain>] ([-a | --all] | <address>) <path>
Which command is suitable to remove account from key storage ?
Required cli command for BIP39 mnemonic porvided by Emerald Vault
Allow user to specify a HD Path from a hardware wallet for a new transaction, for to and from parts.
emerald transaction \
hw:m/44'/60'/0'/1 \
0x0e7c045110b8dbf29765047380898919c5cb56f4 \
10 \
--nonce 1
Should ask user to sign transaction using HW Wallet:
Emerald Vault is requesting to sign following transaction:
----------------------------------------------------
FROM: m/44'/60'/0'/1
0x9cbe7c045110b8d8768915047bf2f456030899c5
TO: 0x0e7c045110b8dbf29765047380898919c5cb56f4
VALUE: 10.00 ETC
0x8AC7230489E80000 WEI
NONCE: 1
GAS: 21000
GASPRICE: 15200000000 WEI
DATA: <none>
----------------------------------------------------
Please confirm the transaction on the device.
For
emerald transaction \
0x0e7c045110b8dbf29765047380898919c5cb56f4 \
hw:m/44'/60'/0'/1 \
10 \
--nonce 1
It should just sign prepare transaction to 0x9cbe7c045110b8d8768915047bf2f456030899c5
(which is m/44'/60'/0'/1
)
How to run emerald-cli with detailed debug logs ?
I was thinking it'd be nice to have a kind of "transaction pool" for emerald.
One use case is to manage tx creation/+broadcasting (or not broadcasting, as the case may be).
Another is to store transactions that you'd like to reuse.
I imagine a scenario for this would be to be able to create and sign and index
transactions in an offline/cold setting, like on your secret computer/rasperry-pi/whatever
that you don't connect to the internet.
Here's a quick UX gist:
# Note that I'm using a made-up command 'value' with an '--eth' flag.
# The idea with this is to modularize to-hex, to-wei, from-eth, what-the-is-mgas-even
# and be able to use emerald to get the proper data with the proper format.
# Even though this 'value' command is a topic for another separate issue, I'm
# going to leave it in here for daydreaming and demonstration.
#
# Note: no '--upstream': this is an "offline"/"cold" signed tx
# Note: This success output formatting would
$ env BEERS_COST=$(emerald value --eth=1.3) emerald transaction <0xfrom> <0xto> $BEER_COST \
--note="I buy beer for Bob every Friday."
transaction@{0} from=<0xfrom> to=<0xto> value=<0x1337000000> [value.eth=1.3] note="I buy beer for Bob every Friday"
$ emerald transaction \
<0xfrom> \
<0xto> \
2.433 --value=eth
transaction@{0} from=<0xfrom> to=<0xto> value=<0x1337000000> [value.eth=1.3] note="I buy beer for Bob every Friday"
transaction@{1} from=<0xfrom> to=<0xto> value=<0x266d0> [value.eth=2.433]
# List all txs in the txpool store.
# Note: the command name here TBD: 'emerald signed'?, or 'emerald transaction list'?
# Note: List all signed and stored transactions which haven't been 'broadcasted'/exported yet
$ emerald transactions
transaction@{0} from=<0xfrom> to=<0xto> value=<0x1337000000> [value.eth=1.3] note="I buy beer for Bob every Friday"
transaction@{1} from=<0xfrom> to=<0xto> value=<0x266d0> [value.eth=2.433]
# Broadcast a tx from the txpool store.
# Note: *pops* signed tx from store and sends upstream
# Note: I use port '8546' here because for the broadcast command I'd like to
# see localhost:8545 as a default, since that plays well automatically with geth.
$ emerald broadcast transaction@{1} --upstream=127.0.0.1:8546
Successfully sent transaction:
<blah blah some details about the PIZZA transaction/return val from geth, whatever>
# List txpool stored txs again.
# Note: @1 has been popped and removed from txpool store by default. Only @0 remains.
$ emerald transactions
transaction@{0} from=<0xfrom> to=<0xto> value=<0x1337000000> [value.eth=1.3] note="I buy beer for Bob every Friday"
# Let's send the last tx.
# Note: sends upstream, but because of '--keep' does not remove from stored txpool txs
$ emerald broadcast @{1} --keep
Successfully sent transaction:
<blah blah some details about the BEER transaction/return val from geth, whatever>
$ emerald transactions
transaction@{0} <0xBeerTransactionHashOrIdentifier>
# Changed my mind, I never want to buy Bob beer again.
$ emerald transactions rm transaction@{0}
Success.
$ emerald transactions
No stored transactions yet. Use 'emerald transaction' to create one.
If I understood correctly emerald import
command would replace existent key data for address if such address already in vault. It can lead to situation when user accidentally replace working keys with another key, encrypted by another passphrase.
As a solution we can introduce additional parameters:
-f
- force to replace existent keys. User must explicitly ask to replace.
-i
- ignore existent keys. This is safe option.
What do you think ?
Need to provide transparent doc for console usage of funcitonality provided in emerald-rs
.
emerald-cli
should be used for user scrotpting.
$ emerald --chain=morden new
! Warning: passphrase can't be restored. Don't forget it !
Enter passphrase:
test
test
test
^C
It's not clear that after you've entered a password it starts to do something.
Better to show a message:
$ emerald --chain=morden new
! Warning: passphrase can't be restored. Don't forget it !
Enter passphrase:
Generating a new private key for chain Morden...
Command to read next nonce from upstream:
emerald nonce <address> [--hex]
Example:
emerald nonce 0x3fd9075a076b38b3a1c6c12e77912620c07968fd
61
emerald nonce 0x3fd9075a076b38b3a1c6c12e77912620c07968fd --hex
0x3d
$ emerald transaction --chain testnet 0xdbaebfe227e6b29fceac4f4da22d7daa72eec8a0 0xdbaebfe227e6b29fceac4f4da22d7daa72eec8a0 0x1234567000 --upstream http://ethereum.dev:8555
[ERROR] Command execution error: Invalid parameter: empty string
$ emerald transaction --chain testnet 0xdbaebfe227e6b29fceac4f4da22d7daa72eec8a0 0xdbaebfe227e6b29fceac4f4da22d7daa72eec8a0 0x1234567000 --nonce 1000000
[ERROR] Command execution error: Missed arguments
Allow to pass a raw PK from command line.
emerald-cli --raw 0x8AB57394868C31248C3A3D22DA61E6D436D3638413FB33724514E
emerald-cli --raw-file ./pk-in-hex.txt
Should be available as alternative to a pk stored in key storage, for sending/signing a transaction
~/Downloads/emerald018 ⟠ dtrx emerald-cli-osx-v0.18.1-832bba6.zip
emerald-cli-osx-v0.18.1-832bba6.zip contains one file but its name doesn't match.
Expected: emerald-cli-osx-v0.18.1-832bba6
Actual: emerald
You can:
* extract the file _I_nside a new directory named emerald-cli-osx-v0.18.1-832bba6
* extract the file and _R_ename it emerald-cli-osx-v0.18.1-832bba6
* extract the file _H_ere
What do you want to do? (I/r/h) h
~/Downloads/emerald018 ⟠ l
total 12M
-rwxr-xr-x 1 ia staff 8.6M Nov 29 01:23 emerald
-rw-r--r-- 1 ia staff 3.0M Dec 8 16:05 emerald-cli-osx-v0.18.1-832bba6.zip
~/Downloads/emerald018 ⟠ ./emerald -V
v0.17.0
~/Downloads/emerald018 ⟠ sha emerald-cli-osx-v0.18.1-832bba6.zip
SHA256(emerald-cli-osx-v0.18.1-832bba6.zip)= 626cffc48998ea008c8997b96cfa448a77d8636fb270f56ef6a50bfbaaf911bb
~/Downloads/emerald018 ⟠ sha emerald
SHA256(emerald)= 0a0c091b75d8ab1af370e053dd1efcffb1e5c55ccc86d9b30ba3150155d49c34
Currenlty emerald-cli
provides only top level help, due to limitations of docopt
crate.
Ex.: emerald --help
Required detailed help for each command, like rustup have.
Ex.: emerald list --help
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.