crytic / etheno Goto Github PK
View Code? Open in Web Editor NEWSimplify Ethereum security analysis and testing
License: GNU Affero General Public License v3.0
Simplify Ethereum security analysis and testing
License: GNU Affero General Public License v3.0
Manticore 0.2.2 was just released with Etheno support, so update our dependency on it in setup.py
, the Docker script, and documentation.
Once trailofbits/manticore#1369 is resolved, reimplement our hack workaround to override Manticore's logging framework.
Add a command line option to provide a user-provided build command (default being truffle
).
Getting the following when running etheno --geth -j genesis.json
Traceback (most recent call last):
File "/Users/nettrino/venvs/etheno/bin/etheno", line 8, in <module>
sys.exit(main())
File "/Users/nettrino/venvs/etheno/lib/python3.9/site-packages/etheno/__main__.py", line 204, in main
private_key=decode_value(pkey)))
File "/Users/nettrino/venvs/etheno/lib/python3.9/site-packages/etheno/utils.py", line 46, in decode_value
elif v.startswith('0x') or (frozenset(['a', 'b', 'c', 'd', 'e', 'f']) & frozenset(v)):
AttributeError: 'NoneType' object has no attribute 'startswith
The genesis.json file used is
{
"config":{
"chainId": 1337,
"homesteadBlock": 0,
"eip150Block": 0,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0
},
"alloc": {
"0x72f52e17469e13b9D0D3aAA5922A597eFCdaF27e": {
"balance": "100000000000000000000"
}
},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x20000",
"extraData" : "",
"gasPrice": "0xc000310480",
"gasFeeCap": "0xc000083d40",
"gasTipCap": "0xc0003c00b0",
"gasLimit" : "0x4bb14a0",
"nonce" : "0x0000000000000042",
"mixhash" :
"0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" :
"0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
Add a command line argument to specify a custom Echidna test contract.
To avoid insufficient gas errors, have Echidna call eth_estimateGas
before constructing a transaction in the emit_transaction
function.
In some cases, truffle tests fail in etheno, but work in ganache. To reproduce:
yarn
)ganache --deterministic --gasLimit 10000000
yarn test
. All the tests will pass. for instance:
Contract: BFactory
Factory
✓ BFactory is bronze release
✓ isBPool on non pool returns false
✓ isBPool on pool returns true
✓ fails nonAdmin calls collect (42ms)
✓ admin collects fees (477ms)
✓ nonadmin cant set blabs address
✓ admin changes blabs address (51ms)
etheno --ganache --ganache-args "--deterministic --gasLimit 10000000" -x out.json
yarn test
. Some of the tests will fail: Contract: BFactory
Factory
✓ BFactory is bronze release
✓ isBPool on non pool returns false
✓ isBPool on pool returns true
1) fails nonAdmin calls collect
> No events were emitted
✓ admin collects fees (339ms)
2) nonadmin cant set blabs address
> No events were emitted
✓ admin changes blabs address (56ms)
Add an argument to load contract state from an existing chain and mirror it across all clients.
If you try to use etheno with balance-core, you will get an error:
$ etheno --truffle --ganache -p 7545 -i 5777 -x export.json
INFO [09-21|10:37:35][Ganache@7546] Ganache CLI v6.10.2 (ganache-core: 2.11.3)
INFO:Ganache@7546:Ganache CLI v6.10.2 (ganache-core: 2.11.3)
INFO [09-21|10:37:35][Ganache@7546] Error: Callback was already called.
INFO:Ganache@7546:Error: Callback was already called.
INFO [09-21|10:37:35][Ganache@7546] at /home/g/Code/balancer-core/node_modules/ganache-cli/build/ganache-core.node.cli.js:19:276
INFO:Ganache@7546: at /home/g/Code/balancer-core/node_modules/ganache-cli/build/ganache-core.node.cli.js:19:276
INFO [09-21|10:37:35][Ganache@7546] at s.<anonymous> (/home/g/Code/balancer-core/node_modules/ganache-cli/build/ganache-core.node.cli.js:19:2238)
INFO:Ganache@7546: at s.<anonymous> (/home/g/Code/balancer-core/node_modules/ganache-cli/build/ganache-core.node.cli.js:19:2238)
INFO [09-21|10:37:35][Ganache@7546] at s.emit (events.js:314:20)
INFO:Ganache@7546: at s.emit (events.js:314:20)
INFO [09-21|10:37:35][Ganache@7546] at s.destroy (/home/g/Code/balancer-core/node_modules/ganache-cli/build/ganache-core.node.cli.js:39:744240)
INFO:Ganache@7546: at s.destroy (/home/g/Code/balancer-core/node_modules/ganache-cli/build/ganache-core.node.cli.js:39:744240)
INFO [09-21|10:37:35][Ganache@7546] at finish (_stream_writable.js:670:14)
INFO:Ganache@7546: at finish (_stream_writable.js:670:14)
INFO [09-21|10:37:35][Ganache@7546] at processTicksAndRejections (internal/process/task_queues.js:80:21)
INFO:Ganache@7546: at processTicksAndRejections (internal/process/task_queues.js:80:21)
geth
does no longer support the --rpc
argument since v1.10.9
(Sept 29, 2021 - relevant commit ethereum/go-ethereum@9a0df80) and it should be replaced with --http
.
Line 92 in 46e162e
The current geth
version is v1.10.14
Add support for clients that do not have any local accounts. Do this by dynamically converting calls to eth_sendTransaction
to eth_sendRawTransaction
by having Etheno sign the transaction.
Automatically reproduce this bug using differential testing openethereum/parity-ethereum#9746
Create a minimal example that demonstrates it.
We currently just log the raw transaction data. We're already compiling the Echidna fuzz contract, so it wouldn't be too hard to extract the ABI and decode the resulting transactions.
First of all, thanks for developing this awesome tool 🙇🏻♂️
I tried running the steps on quickstart, but I got the following error when running the example:
etheno@dafa852d5dc7:~/examples/BrokenMetaCoin$ etheno --truffle --ganache --manticore --manticore-script ExploitMetaCoinManticoreScript.py
Traceback (most recent call last):
File "/home/etheno/.local/bin/etheno", line 33, in <module>
sys.exit(load_entry_point('etheno==0.2.4', 'console_scripts', 'etheno')())
File "/home/etheno/.local/bin/etheno", line 25, in importlib_load_entry_point
return next(matches).load()
File "/home/etheno/.local/lib/python3.6/site-packages/importlib_metadata/__init__.py", line 168, in load
module = import_module(match.group('module'))
File "/usr/lib/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/home/etheno/.local/lib/python3.6/site-packages/etheno/__main__.py", line 23, in <module>
from .manticoreclient import ManticoreClient
File "/home/etheno/.local/lib/python3.6/site-packages/etheno/manticoreclient.py", line 25, in <module>
import manticore.utils
File "/home/etheno/.local/lib/python3.6/site-packages/etheno/manticoreclient.py", line 20, in manticoreimport
return oldimport(name, *args, **kwargs)
File "/home/etheno/.local/lib/python3.6/site-packages/manticore/__init__.py", line 10, in <module>
from .ethereum.manticore import ManticoreEVM
File "/home/etheno/.local/lib/python3.6/site-packages/etheno/manticoreclient.py", line 20, in manticoreimport
return oldimport(name, *args, **kwargs)
File "/home/etheno/.local/lib/python3.6/site-packages/manticore/ethereum/__init__.py", line 3, in <module>
from .manticore import ManticoreEVM, config
File "/home/etheno/.local/lib/python3.6/site-packages/etheno/manticoreclient.py", line 20, in manticoreimport
return oldimport(name, *args, **kwargs)
File "/home/etheno/.local/lib/python3.6/site-packages/manticore/ethereum/manticore.py", line 15, in <module>
from ..core.manticore import ManticoreBase, ManticoreError
File "/home/etheno/.local/lib/python3.6/site-packages/etheno/manticoreclient.py", line 20, in manticoreimport
return oldimport(name, *args, **kwargs)
File "/home/etheno/.local/lib/python3.6/site-packages/manticore/core/manticore.py", line 29, in <module>
from .worker import (
File "/home/etheno/.local/lib/python3.6/site-packages/etheno/manticoreclient.py", line 20, in manticoreimport
return oldimport(name, *args, **kwargs)
File "/home/etheno/.local/lib/python3.6/site-packages/manticore/core/worker.py", line 5, in <module>
from ..utils.log import register_log_callback
ImportError: cannot import name 'register_log_callback'
Record and compare execution times for different JSON RPC calls. Normalize execution time for transactions by gas usage.
The will_start_run
callback was renamed to will_run
in Manticore 0.3.0. Need to add a check for the Manticore version and dynamically set the callback name. This will partially address #62.
Hi.
I've been having problems with exporting my deployment transactions using Hardhat. It turns out this is because the etheno logging system depends on a eth_getTransactionReceipt
for it's exporting plugin (EventSummaryExportPlugin
). Hardhat does not request this receipt by default for function calls, so only contract deployments are being logged. Truffle does request this by default for both functions and deployments. I have not tested it in any other frameworks.
When I specifically request a receipt in the hardhat deploy script I can get it to work using the following code:
const tx = await simple.doSomething(); // function call
const receipt = await tx.wait(); // request receipt
Right now this is something that has to be remembered every time to keep an accurate etheno export. People new to etheno will probably not know this at all. I think it would be an nice improvement if etheno can support this out of the box. Without the need for manually requesting the receipt.
I have been tinkering with the etheno code a bit, looking for a fix. I've come up with 2 ideas for a possible fixes. Each have their own problems though, i'm hoping you guys can shed some light on this.
eth_sendRawTransaction
because you dont need to know the address of a deployed contract (which you can only know afterwards). The problem here is that currently "gas used" is also being logged. This is something you can't know in advance either, right? Is it important to keep logging this?eth_getTransactionReceipt
at all. Etheno could just call this itself after every transaction. This would be the most robust fix in my opinion. The problem here is that we cannot do this right away, because the transaction is still being mined. So using the after_post
hook for this if impossible. Correct me if i'm wrong. We'd have to have another kind of hook, or can we use evm_mine
for this?I'd be interested in putting a bit of time into this. So far i've been looking at this for about 2-4 hours. I expect one of these fixes to take another 4-8 hours (if they turn out to be possible).
Let me know what you think and if this would be elligible for a bounty. Thanks.
It seems like it would be feasible to use a subset of Etheno's functionality with Bitcoin clients, but I wonder what the steps toward achieving that would be?
A Bitcoin client, like an Ethereum one, has a JSON-RPC interface for receiving commands, including commands to submit transactions embedded with scripts (in an "assembly"/bytecode form only). Like Ethereum, a Bitcoin blockchain begins with a "genesis block." Bitcoin doesn't have the concept of "gas," but the rest seems similar enough to pose this feature request.
Given that the analysis tools (Echidna, Manticore) can't do anything with Bitcoin Script yet, the first goal seems to be using Etheno's JSON-RPC multiplexing for differential testing of Bitcoin clients.
Notional CLI use:
etheno --bitcoin-core --bitcoin-core-args blabla
The next desirable feature for testing Bitcoin clients might be to extend Echidna to be able to mutate a Bitcoin script.
Add an option to save logs to a file. Split the logs into separate files for each source. Also add an option to suppress log output for the console based on origin.
Support for the Parity client.
Currently they fail to compile on the latest versions of solc
.
We can reduce the Docker image size still by incorporating Echidna's new Dockerfile and applying its concepts to other installs. We also need to set up GitHub Actions to upload the image to Dockerhub rather than relying on Dockerhub to build it.
Provide a means to export raw JSON RPC calls, e.g., as a JSON list.
Hello,
I'm an aspiring bug bounty hunter, looking to get into smart contract hacking. I'm especially interested in automated fuzzing/testing, this is what led me to your awesome tools :)
So far i've been looking at:
While looking at real life smart contract bug bounty programs I noticed things tend to get big pretty quickly, into dozens or even more than a hundred smart contracts working together.
This led me to Etheno and here I ran into some roadblocks. While trying to get the examples working in the docker images i got adviced to explain my expectations here.
So, my plan:
I'm trying to set up a testing environment where I can run tools like Echidna/Manticore 24/7. My plan of attack would be to search for a couple of essential/sensitive parts of code in the contracts. First by looking at what at the main idea of the project, looking for ways to game the system etc. Second by looking at all the contracts manually one by one, looking for interesting pieces of code.
After this I can write tests for Echidna/Manticore and run them indefinetly, until i have another project figured out and ready to test.
The main hurdle i'm currently facing is trying to figure out how to set up all the smart contracts in such a way that i'm able to test/fuzz them as a whole. The examples I found are with 1 or 2 contracts, i'm looking for at least 10-20 (for a start).
I know there is a "multi abi" option in Echidna, but I have not been able to find any examples or further documentation about this. Etheno seems to be the most promising solution to me. It seems to have support for the Truffle migrations system, so I imagine I could set up all my smart contracts using Truffle scripts and have Etheno prepare them for testing.
Anyway, without making my post even longer than it already is, please let me know if i'm on the right track and where to go from here.
Some questions:
Thanks.
I tried etheno --truffle --ganache -p 7545 -i 5777 -x export.json mentioned here.
But there is no data in export.json.
Version info:
Etheno: ToB/v0.2.3/source/Etheno
Truffle: v5.1.59 (core: 5.1.59)
Solidity: - ^0.4.18 (solc-js)
Node: v10.19.0
Web3.js: v1.2.9
Here is my truffle-config.js
const HDWalletProvider = require('truffle-hdwallet-provider');
const infuraKey = "ktSpeXTL5DRPjaJ087hh";
const fs = require('fs');
const mnemonic = fs.readFileSync(".secret").toString().trim();
module.exports = {
// See <http://truffleframework.com/docs/advanced/configuration>
// to customize your Truffle configuration!
compilers: {
solc: {
version: "^0.4.18"
}
},
networks: {
development: {
host: "127.0.0.1",
port: 7545,
network_id: "5777",
}
}
}
Use Echnida's new raw transaction creation capability to fuzz clients
To release Etheno:
git checkout master
git pull origin master
etheno --version
should show expected versiongit tag -a 0.2.xx -m "Etheno 0.2.xx"
git push origin 0.2.xx
or git push origin --tags
git clone [email protected]:trailofbits/etheno.git
(If you use your normal copy the distribution file may include unexpected files)python setup.py sdist
# this creates the distribution file in dist/ folder** Uploading to pypi is not reversible please try it out on test.pypi.org first **
6a. [ ] Push to test pypi and test it
- twine upload --repository-url https://test.pypi.org/legacy/ dist/*
- Check you see the correct version at https://test.pypi.org/project/etheno
- Install it from test pypi (ideally on a fresh box):
- pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple etheno
6b. Optional. If no access to test pypi. Do a fresh install in a virtualenv.
- virtualenv --python=python3.7 temp
- source temp/bin/activate
- Untar the distro file you are about to upload
- python setup.py install
- Check everything looks good
twine upload dist/*
Use the Github diff links to see all the commits between the last release and now, e.g. 0.1.0...HEAD
Start with the categories of changes from keepachangelog
Types of changes
Added for new features.
Changed for changes in existing functionality.
Deprecated for soon-to-be removed features.
Removed for now removed features.
Fixed for any bug fixes.
Security in case of vulnerabilities.
and start categorizing features/commits from the diff into those
Enable Etheno to perform automated differential testing of clients by comparing the gas costs of transactions, execution traces, and changes to storage. Real-world use of this feature will likely depend on the features added by Issue #2.
Add support for emitting EVM traces. Integrate this feature into the differential tester to automatically compare the traces of all transactions.
For some reason, running Etheno with Geth v1.8.17, Geth will never mine any of Etheno's submitted transactions. Figure out why. Currently Etheno only supports Get v1.8.2.
Running the quickstart steps fails with
etheno@dc0445745920:~/examples/BrokenMetaCoin$ etheno --truffle --ganache --manticore --manticore-max-depth 2 --manticore-script ExploitMetaCoinManticoreScript.py
INFO [06-24|17:28:46][Ganache@8546] Ganache CLI v6.4.4 (ganache-core: 2.5.6)
INFO [06-24|17:28:46][Ganache@8546]
INFO [06-24|17:28:46][Ganache@8546] Available Accounts
INFO [06-24|17:28:46][Ganache@8546] ==================
INFO [06-24|17:28:46][Ganache@8546] (0) 0x85a246e29e22828237a9ea13fcb9d60041c23478 (~100 ETH)
INFO [06-24|17:28:46][Ganache@8546] (1) 0x2d2d139f2f3e02664ad36353eefc099d4e91fe64 (~100 ETH)
INFO [06-24|17:28:46][Ganache@8546] (2) 0xb1a560774f9d94be11cdedf165f9ef152a64b42a (~100 ETH)
INFO [06-24|17:28:46][Ganache@8546] (3) 0xd7e277eea93a9632ca9ec299da8cd5d163028e66 (~100 ETH)
INFO [06-24|17:28:46][Ganache@8546] (4) 0x478de08556fa99d5be40b87bd89fcf477099a121 (~100 ETH)
INFO [06-24|17:28:46][Ganache@8546] (5) 0x418f723c1325cdbb073098faa72e02eb05c4412e (~100 ETH)
INFO [06-24|17:28:46][Ganache@8546] (6) 0xdb2bfca2ee3744f90008c7f451f7304104179a2b (~100 ETH)
INFO [06-24|17:28:46][Ganache@8546] (7) 0xa67019ae82ed7ab8a0c2903dba8471c6ba9e3841 (~100 ETH)
INFO [06-24|17:28:46][Ganache@8546] (8) 0xc19804764bf11d5c8ce31008ef28183b83a72341 (~100 ETH)
INFO [06-24|17:28:46][Ganache@8546] (9) 0x422bc0d18ed94b5413a09ea89d7f5fbc807b626b (~100 ETH)
INFO [06-24|17:28:46][Ganache@8546]
INFO [06-24|17:28:46][Ganache@8546] Private Keys
INFO [06-24|17:28:46][Ganache@8546] ==================
INFO [06-24|17:28:46][Ganache@8546] (0) 0x3c0211c0fa7c402565dfb04548e00ccba9bd020a00ea6aa0ac60f1967380529c
INFO [06-24|17:28:46][Ganache@8546] (1) 0xebf76ee055116cd4135333cc32722ee710b74d7c46612f047b7e210ac6dc19f1
INFO [06-24|17:28:46][Ganache@8546] (2) 0xaaa3d2690c1aa663b2a825928de0096fa50cd3369d2c137e7e26754754e3b9f4
INFO [06-24|17:28:46][Ganache@8546] (3) 0x8159ae0d52c8b3f57e92160bd80257c2b09c8bd89cd33568e7cac3b8c76c66e1
INFO [06-24|17:28:46][Ganache@8546] (4) 0x6527b0a6fac5823810eef0d46c327313124118779cd20f6a4791a7961fc0bd10
INFO [06-24|17:28:46][Ganache@8546] (5) 0x6d898caf9ddeb5f5a3c970067278a60eb101e687ef9d2985cbbc658267a9cb04
INFO [06-24|17:28:46][Ganache@8546] (6) 0xaea9a5c6f4d9bfc042a05492eb576d35be611e2b9fdfe6b117397986a607e138
INFO [06-24|17:28:46][Ganache@8546] (7) 0x26bb57c1feb9ab38a804aa47f964e38d9f892174c1865693b820d7626072aaae
INFO [06-24|17:28:46][Ganache@8546] (8) 0xa21992695e7db0beb102bedd6a8943830338192ba574313791b456e250a39e45
INFO [06-24|17:28:46][Ganache@8546] (9) 0x9a022d24a7985a7798f67ae41926a69a2409b3aaacff0d5fe1b5c9759fd8a278
INFO [06-24|17:28:46][Ganache@8546]
INFO [06-24|17:28:46][Ganache@8546] Gas Price
INFO [06-24|17:28:46][Ganache@8546] ==================
INFO [06-24|17:28:46][Ganache@8546] 20000000000
INFO [06-24|17:28:46][Ganache@8546]
INFO [06-24|17:28:46][Ganache@8546] Gas Limit
INFO [06-24|17:28:46][Ganache@8546] ==================
INFO [06-24|17:28:46][Ganache@8546] 6721975
INFO [06-24|17:28:46][Ganache@8546]
INFO [06-24|17:28:46][Ganache@8546] Listening on 127.0.0.1:8546
INFO [06-24|17:28:46][Ganache@8546] eth_accounts
ERROR [06-24|17:28:46][Etheno] The version of Manticore installed is 0.3.0, but the minimum required version with Etheno support is 0.2.2. We will try to proceed, but things might not work correctly! Please upgrade Manticore.
WARNING [06-24|17:28:46][Manticore][manticore][core][manticore] There is no event named will_start_run for callback on plugin StopAtDepth
INFO [06-24|17:28:46][Manticore][manticore][core][manticore] Deprecated!
Etheno Started! Running Truffle...
Etheno v0.2.0
* Serving Flask app "etheno.etheno" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:8545/ (Press CTRL+C to quit)
INFO [06-24|17:28:50][Truffle] Warning: Both truffle-config.js and truffle.js were found. Using truffle-config.js.
INFO [06-24|17:28:50][Truffle]
INFO [06-24|17:28:50][Truffle] Compiling your contracts...
INFO [06-24|17:28:50][Truffle] ===========================
ERROR [06-24|17:28:59][Etheno] Truffle exited with code 1
127.0.0.1 - - [24/Jun/2019 17:28:59] "GET /shutdown HTTP/1.1" 200 -
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
self.run()
File "/usr/lib/python3.6/threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "/home/etheno/.local/lib/python3.6/site-packages/etheno/__main__.py", line 302, in truffle_thread
'logger': logger.EthenoLogger(os.path.basename(args.manticore_script.name), parent=manticore_client.logger)
File "ExploitMetaCoinManticoreScript.py", line 8, in <module>
contract_account = list(manticore.contract_accounts.values())[2]
IndexError: list index out of range
Enable Etheno to multiplex transactions across multiple blockchains/networks by maintaining a mapping of equivalent contract addresses and dynamically rewriting transactions to honor the correct addresses for the recipient client.
Etheno already runs a webserver, so add an option to serve a webpage that dynamically loads all of the log files.
May I know the suitable node version for using Etheno together with Ganache cli? According to the description in Etheno reame.md, I set the node version to node v.12.22.11. And I install ganache-cli to this node. However when I input the command "etheno --ganache" in the terminal, there would always be error as shown in the screenshot below:
I tried different version of Ganache-cli, but the same error keeps occurring. May I know what the problem is?
P.S. When I activate the Ganache-cli in node 12 by running "ganache-cli", there would also be error. So I also tried node v.16.14.0, the Ganache-cli can be activated, but when using together with Etheno, the same error occurs.
I am using etheno
v0.2.3 and ganache-cli
v6.12.2.
When I use `etheno --ganache --ganache-args "--mnemonic " always get different accounts (with the same mnemonic of course).
Some contracts depend on specific conditions on the timestamp/block number, but etheno does not export that information in the JSON file. This makes the use of the JSON file unreliable to reproduce the exported transactions elsewhere.
Create a JSON-based DSL for summarizing contract creations and transactions (e.g., for input to Echidna and Manticore) and add an option to Etheno to output it. Similar to #57, but resolve things like created contract addresses, &c.
Confirm that contracts are created at the same address between clients. Will need to take into account synchronized clients somehow.
Move Manticore to extras_require
and throw an error with installation instructions if the user tries to do something with Etheno that requires Manticore.
The Manticore version check warns of an older version of Manticore, even when running the latest.
Currently, if a client returns an HTTP error for a JSON RPC call, things break. Handle this more gracefully.
Add support for rewriting and re-signing raw transactions that contain addresses that need to be rewritten.
If Etheno does not have the necessary private key, throw an exception.
Instead of copying all of the log files to the log dir at shutdown, give clients and plugins their own working directory in which to save files.
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.