Giter VIP home page Giter VIP logo

bitshares-core's Introduction

BitShares

BitShares is a software platform designed to help coordinate voluntary free market operations amongst a set of social actors.

These social actors together maintain a replicated deterministic state machine which defines the state of a free market. This state machine unambigiously defines the ownership of resources amongst market participants, the rules by which resources are reallocated through market operations, and the history of all market operations. Social actors are free to voluntarily enter and exit the market as desired.

Replicas of the state machine are kept consistent using the Delegated Proof-of-Stake distributed consensus protocol, which depends on market operations by a special class of market participants colloquially known as shareholders. Resource ownership is secured using digital signatures and inputs to the state machine are shared amongst actors using a peer-to-peer mesh network.

Features

The system is designed to ensure the following properties:

  • Fault-Tolerance: the market should be resilient to bad actors
  • Immutability: the historical intent of all market participants should be preserved
  • Transparency: any actor can inspect the market to verify that it is operating correctly
  • Censorship Resistance: no actor can be kept from performing valid market operations
  • Flexibility: the rules of the market should be able to change given sufficient shareholder approval
  • Self-Sustainability: the market should be be able to fund its own continued operation

Additional information is available at BitShares.org and the BitShares Wiki. Community discussion occurs at BitSharesTalk.org.

Building

Different platforms have different build instructions:

Using the RPC server

For many applications, it is useful to execute BitShares commands from scripts. The BitShares client includes RPC server functionality to allow programs to submit JSON-formatted commands and retrieve JSON-formatted results over an HTTP connection. To enable the RPC server, you can edit the rpc section of config.json as follows:

  "rpc": {
    "enable": true,
    "rpc_user": "USERNAME",
    "rpc_password": "PASSWORD",
    "rpc_endpoint": "127.0.0.1:1775",
    "httpd_endpoint": "127.0.0.1:1776",

Here, USERNAME and PASSWORD are authentication credentials which must be presented by a client to gain access to the RPC interface. These parameters may also be specified on the command line, but this is not recommended because some popular multi-user operating systems (Linux in particular) allow command line parameters of running programs to be visible to all users.

After editing the configuration file and (re)starting the BitShares client, you can use any HTTP client to POST a JSON object and read the JSON response. Here is an example using the popular curl command line HTTP client:

curl --user USERNAME:PASSWORD http://127.0.0.1:1776/rpc -X POST -H 'Content-Type: application/json' -d '{"method" : "blockchain_get_account", "params" : ["dev0.theoretical"], "id" : 1}'

The POST request returns a JSON result like this (some data elided for brevity):

{"id":1,"result":{"id":31427,"name":"dev0.theoretical","public_data":{"version":"v0.4.27.1"},"owner_key":"BTS75vj8aaDWFwg7Wd6WinAAqVddUcSRJ1hSMDNayLAbCuxsmoQTf", ...},"meta_data":{"type":"public_account","data":""}}}

Since HTTP basic authentication is used, the authentication credentials are sent over the socket in unencrypted plaintext. For this reason, binding to an interface other than localhost in the configuration file is not recommended. If you wish to access the RPC interface from a remote system, you should establish a secure connection using SSH port forwarding (the -L option in OpenSSH) or a reverse proxy SSL/TLS tunnel (typically supported by general-purpose webservers such as nginx).

Please keep in mind that anyone able to connect to the RPC socket with the correct username and password will be able to access all funds, accounts and private keys in any open wallet (including wallets opened manually or by another RPC client connected to the same bitshares_client instance). Thus, your security procedures should protect the username, password, and socket accordingly (including config.json since it contains the username and password)!

Contributing

The source code can always be found at the BitShares GitHub Repository. There are four main branches:

  • master - official BitShares releases are tagged from here; this should only change for a new release
  • bitshares - updates to BitShares are staged here in preparation for the next official release
  • develop - all new development happens here; this is what is used for internal BitShares XTS test networks
  • toolkit - this is the most recent common ancestor between master and develop; forks of BitShares should base from here

Some technical documentation is available at the BitShares GitHub Wiki.

Support

Bugs can be reported directly to the BitShares Issue Tracker.

Technical support can be obtained from the BitSharesTalk Technical Support Forum.

License

The BitShares source code is in the public domain under the Unlicense. See the LICENSE for more information.

bitshares-core's People

Contributors

aautushka avatar abitmore avatar bytemaster avatar christophersanborn avatar chronoscrypto avatar cogutvalera avatar crypto-ape avatar cryptocifer avatar dev25519 avatar elmato avatar emfrias avatar iobanker avatar jmjatlanta avatar manikey123 avatar michelsantos avatar mvandeberg avatar nathanielhourt avatar openledgerapp avatar oxarbitrage avatar pmconrad avatar richardweiyang avatar ryanrfox avatar svk31 avatar syalon avatar takaaki7 avatar theoreticalbts avatar thetaconator avatar vikramrajkumar avatar wackou avatar xeroc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bitshares-core's Issues

Upstream secp256k1-zkp API has changed

From @clayop on August 7, 2015 21:55

Followed instruction in Readme.md

CMake Error in libraries/fc/CMakeLists.txt:
  Imported target "secp256k1" includes non-existent path

    "/home/clayop/graphene/libraries/fc/vendor/secp256k1-zkp/include"

  in its INTERFACE_INCLUDE_DIRECTORIES.  Possible reasons include:

  * The path was deleted, renamed, or moved to another location.

  * An install or uninstall procedure did not complete successfully.

  * The installation package was faulty and references files it does not
  provide.

Copied from original issue: cryptonomex/graphene#226

fork_database.hpp: fork_item::invalid is never used

From @bytemaster on August 18, 2015 19:32

The original purpose was to track blocks that get pushed and are then found to be invalid and then to prevent the fork database from accepting any additional blocks on top of that block.

Under BTS 0.x we had some issues where a block would get marked as invalid when it shouldn't have and then we would never be able to switch back to that fork. So there is some risk for marking things as invalid, but in theory the BTS 2 undo architecture shouldn't have the same issues.

Copied from original issue: cryptonomex/graphene#248

Test renewal of annual membership

From @theoreticalbts on July 22, 2015 15:10

Create an annual membership, renew it before expiration, make sure the date is pushed back the proper amount regardless of when the renewal occurs.

Then try renewing a lapsed annual membership. Make sure fees have reasonable semantics in the gap between expiry and renewal.

Copied from original issue: cryptonomex/graphene#180

witness_update operation needs tested

From @theoreticalbts on August 20, 2015 21:59

We need a witness_update_operation to be able to update block_signing_key and url field of a witness object.

Setting the block_signing_key to zero should not be allowed (this will be reserved for when/if we implement witness resignation). There should also be a memo field in the operation which contains the secret, encrypted to the new signing key. The memo field should be vector<char>.

Copied from original issue: cryptonomex/graphene#258

Implement unit test for witness budget running out

From @theoreticalbts on July 22, 2015 15:37

Make sure there is reasonable behavior if witness budget is equal to zero. This unit test may need to artificially change the block interval or witness budget variables by directly affecting the database, as this condition may not be possible in the real blockchain.

This may already be implemented somewhere...

Copied from original issue: cryptonomex/graphene#190

Implement unit test to change backing asset of MIA

From @theoreticalbts on July 22, 2015 15:25

MIA's can have their backing asset changed, but only when there is no supply. The unit test should verify:

  • Backing asset cannot be changed with nonzero supply
  • After the backing asset is changed, it can no longer be borrowed against the old backing
  • After the backing asset is changed, it can be borrowed against the new backing

Copied from original issue: cryptonomex/graphene#187

Review use of libsecp256k1 contexts

From @pmconrad on July 3, 2015 14:58

I stumbled across this bitcoin-core/secp256k1#254 (comment) :

That said, your question makes it clear that the intended use isn't clear. That should definitely be clarified in the header file and perhaps a README. I guess it should list this:

  • Do not create/destroy contexts for each call. Their creation is far slower than any library call, and part of their purpose is to reuse precomputed values across calls.
  • If you perform signing, you should call context_randomize after initialization of the context, and perhaps on a regularly basis (daily?).
  • When calling context_randomize pass in external entropy (perhaps from the operating system, perhaps from user input).
  • You are responsible for locking. After initialization, only context_randomize requires exclusive locked, but the caller is responsible for not calling any other functions that use the context during randomization.
  • If you do both validation and signing, you can either use a shared context for both, or separate contexts. One reason for using separate contexts if that for signing, calling context_randomize requires an exclusive lock on the context. If you need to do validation at the same time, it may be useful to separate them, so validation is not blocked by context randomization.

Apparently we need to call context_randomize regularly (for signing), with proper synchronization.

Copied from original issue: cryptonomex/graphene#131

Peer is disconnecting us because ... attempting to push a block that is too old

From @abitmore on August 22, 2015 23:19

That's probably why it's hard to get into sync after got out of sync?

2015-08-22T22:20:33 p2p:message read_loop on_closing_connectio ] Peer 45.55.6.216:1776 is disconnecting us because of an error: You offered us a block that we reject as invalid, exception: {"code":10,"name":"assert_exception","message":"Assert Exception","stack":[{"context":{"level":"error","file":"fork_database.cpp","line":69,"method":"_push_block","hostname":"","thread_name":"th_a","timestamp":"2015-08-22T22:20:33"},"format":"item->num > std::max<int64_t>( 0, int64_t(_head->num) - (_max_size) ): attempting to push a block that is too old","data":{"item->num":174057,"head":174075,"max_size":10}},{"context":{"level":"warn","file":"db_block.cpp","line":176,"method":"_push_block","hostname":"","thread_name":"th_a","timestamp":"2015-08-22T22:20:33"},"format":"","data":{"new_block":{"previous":"0002a7e8b9613cd334a36aeccdb1d32460d8fa53","timestamp":"2015-08-22T22:20:14","witness":"1.6.4","next_secret_hash":"a6b9319cdc3465202c6ee6ba20f6fcfb4eb26211","previous_secret":"d879b9f9a141a1f9edc662fad77dcfa068e6562c","transaction_merkle_root":"0000000000000000000000000000000000000000","extensions":[],"witness_signature":"2055c39c86e1dd8acc632ea55d010ce56dd01601106c3367fa5ae6b3d08d35a5567a545a0a23a1bace2bf651c049a2559ba75f8ba87b0e597fe9ca88f113a2804e","transactions":[]}}},{"context":{"level":"warn","file":"application.cpp","line":379,"method":"handle_block","hostname":"","thread_name":"th_a","timestamp":"2015-08-22T22:20:33"},"format":"","data":{"blk_msg":{"block":{"previous":"0002a7e8b9613cd334a36aeccdb1d32460d8fa53","timestamp":"2015-08-22T22:20:14","witness":"1.6.4","next_secret_hash":"a6b9319cdc3465202c6ee6ba20f6fcfb4eb26211","previous_secret":"d879b9f9a141a1f9edc662fad77dcfa068e6562c","transaction_merkle_root":"0000000000000000000000000000000000000000","extensions":[],"witness_signature":"2055c39c86e1dd8acc632ea55d010ce56dd01601106c3367fa5ae6b3d08d35a5567a545a0a23a1bace2bf651c049a2559ba75f8ba87b0e597fe9ca88f113a2804e","transactions":[]},"block_id":"0002a7e934a552405ffc797448a046e0bbf916d9"},"sync_mode":true}}]}                     node.cpp:2666

Copied from original issue: cryptonomex/graphene#262

database_fixture is ripe for refactoring

From @vikramrajkumar on June 9, 2015 17:44

Here are the problems with database_fixture:

  • Reliance on macros makes single stepping through tests difficult with GDB.
  • "trx" object being modified by macros makes it effectively a global variable. Functions / macros use trx for both input and output.
  • Many methods in .hpp could be moved to .cpp file, speed compiling, iterative development of new database_fixture method doesn't need to recompile every test .cpp file (as long as signature in header doesn't change)
  • Poor naming conventions in some places (e.g. genesis_account should be genesis_account_id)

Copied from original issue: cryptonomex/graphene#11

[Feature Suggestion] No Fee on User Side with Whitelisted UIA

From @clayop on December 6, 2016 0:15

If a UIA issuer has authority to allow or deny users with whitelisting, a possibility of spam attack can be significantly reduced and easily controlled out. In this case, a UIA issuer may want to remove transaction fees from users to facilitate UIA usage, while the issuer pays the fee through the fee pool.

There is a potential customer in Korea(a local government) and if this feature is implemented, we are going to push it more.

Copied from original issue: cryptonomex/graphene#667

Localizable exceptions

From @valzav on July 6, 2015 18:19

It would be nice to have exceptions that we can translate to other languages in GUI.
In order to do this an exception may require to have some code or symbol and parameters, e.g. exception object might look like this:
{
error: "not-valid-address",
param1: "1EDJEW3508324LJDSF908342L",
eng: "Not valid address: %1",
message: "Not valid address: 1EDJEW3508324LJDSF908342L",
stack: ...
}

Copied from original issue: cryptonomex/graphene#135

Polish delayed node

From @nathanhourt on August 17, 2015 20:49

Following up on #237, there are some limitations of the initial implementation. Primarily, that the delayed node does not handle forking right now.

Optimally, the delayed node will check that the block ID's match for a given block number between its trusted node and itself, and, if they don't, pop blocks until they do. If it runs out of undo history, it needs to resync (this is currently hard to do without restarting the process, as it's impossible to clear the object graph from memory without destroying the database). Then it will resume syncing from the trusted node as usual.

Copied from original issue: cryptonomex/graphene#240

Refactor API calls to be more future-proof

From @theoreticalbts on August 18, 2015 16:21

Implementation of cryptonomex/graphene#236 has revealed a general issue when extending API calls. When adding parameters to an API call, it has been noted that we should have a cycle of introducing a new call, deprecating the old call, waiting for web UI code to be updated, and then removing the old call.

The deprecation cycle is necessary because adding parameters to an API call breaks every API client that uses that call, even if the new parameters have default values, because the FC reflection API does not understand how to interact with default values due to underlying deficiencies in C++

In this ticket, I propose a solution to this problem: Most or all API calls should be rewritten to take a single struct, containing the values that were previously passed as separate arguments. Defaults can then be placed in the C++ struct definition, and if some fields do not occur in the JSON dictionary provided by the client, then those fields should not be assigned by the API framework and thus will have their default values.

I should test that the API framework does in fact give fields that do not exist in the JSON object their default values.

Copied from original issue: cryptonomex/graphene#245

Audit charging of per-kilobyte fees

From @theoreticalbts on July 31, 2015 15:22

Any operation with potentially unbounded size needs to charge a size fee. Determining whether an operation is variable-size is non-trivial. An operation is variable size if it contains a vector, flat_set or other potentially variable-size element.

Note that this containment may be through any number of intermediate structs. For example, any operation which contains an authority has potentially unbounded size.

We should be able to audit this in a semi-automatic way with logic similar to js_operation_serializer which traverses all operations, and noting any variable-size types found (in any number of sub-structures), allowing us to flag each operation as variable-sized (or not). We will still have to manually specify whether any base type is variable-size or not.

Copied from original issue: cryptonomex/graphene#216

Clean up plugin architecture

From @theoreticalbts on August 18, 2015 18:19

Currently our plugin architecture is not well encapsulated. Here are some problems I found:

  • We have code like this that manipulates operation_history_object in the core.
  • There is no reason to have most_recent_op in account_object as noted in the comment here.
  • The annotation subsystem is undocumented, unused and untested, but there are vestigial remnants of an early architecture where it was more widely used, such as meta_account_object.
  • The market_history and account_history plugins use the same space ID.
  • There is a comment in account_history_plugin.hpp noting that an object ID definition applies to the market history plugin!
  • The build scripts contain no provision for compile-time disabling of plugins. We should be able to build a witness_node binary with no account_history_plugin, and in fact should encourage active witnesses to run the stripped-down version without unnecessary indexes.
  • The CLI parameters contain no provision for run-time disabling of plugins. You should be able to specify which plugins you want in a config file, to enable/disable plugins without having to recompile.

Copied from original issue: cryptonomex/graphene#246

[Feature Suggestion] No Fee on User Side with Whitelisted UIA

If a UIA issuer has authority to allow or deny users with whitelisting, a possibility of spam attack can be significantly reduced and easily controlled out. In this case, a UIA issuer may want to remove transaction fees from users to facilitate UIA usage, while the issuer pays the fee through the fee pool.

There is a potential customer in Korea(a local government) and if this feature is implemented, we are going to push it more.

Note: The original issuance is here

Intermittent connection failure in app_test

From @theoreticalbts on July 14, 2015 22:24

After fixing generally obsolete app_test in cfd9dd0 I notice that every few runs, I get the following error:

$ sudo -u graphene -H tests/app_test --log_level=message
Running 1 test case...
Creating temporary files
Creating and initializing app1
Creating and initializing app2
Starting app1 and waiting 500 ms
1209829ms th_a       application.cpp:190           operator()           ] Initializing database...
1209838ms th_a       application.cpp:63            create_example_genes ] Allocating all stake to 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
1209843ms th_a       thread.cpp:95                 thread               ] name:p2p tid:139731355076352
1209845ms th_a       application.cpp:118           reset_p2p_node       ] Configured p2p node to listen on 127.0.0.1:3939
Starting app2 and waiting 500 ms
1210345ms th_a       application.cpp:190           operator()           ] Initializing database...
1210345ms th_a       application.cpp:63            create_example_genes ] Allocating all stake to 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
1210349ms th_a       thread.cpp:95                 thread               ] name:p2p tid:139731255420672
1210350ms th_a       application.cpp:107           reset_p2p_node       ] Adding seed node 127.0.0.1:3939
1210351ms th_a       application.cpp:118           reset_p2p_node       ] Configured p2p node to listen on 127.0.0.1:4040
/home/cc/graphene/src/graphene/tests/app/main.cpp(74): fatal error in "two_node_network": critical check app1.p2p_node()->get_connection_count() == 1 failed [0 != 1]
1210852ms th_a       thread.cpp:115                ~thread              ] calling quit() on p2p
1210852ms th_a       thread.cpp:160                quit                 ] destroying boost thread 139731255420672
1210890ms th_a       thread.cpp:115                ~thread              ] calling quit() on p2p
1210890ms th_a       thread.cpp:160                quit                 ] destroying boost thread 139731355076352
1210890ms p2p        thread.cpp:246                exec                 ] thread canceled: 9 canceled_exception: Canceled
cancellation reason: [none given]
    {"reason":"[none given]"}
    p2p  thread_d.hpp:463 start_next_fiber

*** 1 failure detected in test suite "Test Application"

This does not happen on every run, but usually shows up after several runs, if you don't see it after ~10 runs then I would assume your environment is unable to reproduce it.

A similar bug in the past was cryptonomex/graphene#55

Copied from original issue: cryptonomex/graphene#159

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.