the objective is to approach infinite data scale and data reliability as a network while requiring very small data storage obligations for a device. the total amount of storage available on the network to store transactions, and it's related data, must exceed what a single device is capable of providing. this is accomplished by spreading data across fragmented copies (shards) of the entire network data set.
many shards will be available, and depending on the amount of network data and the number of nodes on the network, additional shards can be added and recognized by the network at any time. there are two types of shards:
protocol shards: protocol shards will contain groups of records that share the same transaction_id value. nodes will be required to host at least one protocol shard, which will be assigned during node installation. the node will announce it's protocol shards to other nodes so they know who to ask for data from a specific shard. nodes can choose to host additional protocol shards for economic opportunity. when data is being synched to the node, it is only interested in records associated with shard.shard_id where status = 1.
custom shards: custom shards allow any node to create their own shard to contain transaction data or transaction_output_attribute data. this extends the capability of millix to be able to store large pieces of data with a transaction or to act as an economic incentive to store data redundantly across multiple nodes. for example, an organization can create and host custom shards to store their transactions on known nodes operating at performance levels that meet their specific operational goals.
as it is not obligatory for nodes to store custom shards, it is up to the custom shard creator to provide or attract and incentivize other nodes to store the shard. this can be accomplished with the node_attribute table. any node that connects to a node that is hosting a custom shard can see opportunities to participate in. this enables a decentralized data storage market economy.
creating a shard
any node can create a new protocol shard or custom shard by inserting to their local shard and shard_attribute table. no permission or authority is required to create new shards. since the shard tables are not synced to nodes, this by itself doesn't inform the network about the shard. it's not until the shard is selected to be supported by a node (initially this must be the node that created the shard as it is the only node with visibility to the node) that the existence of the shard becomes visible to other nodes.
to avoid shard_id conflict, the shard_id is a payload hash of the shard definition including a signature (shard_key) from the node originating the shard. although someone operating two nodes could use the same private key to create the same shard definition at the same time on two devices, the impact would be meaningless. there would be two shard records of equal definition and shard_id but a unique key index on table shard.shard_id would prevent duplicate records, and the sequence of the discarded record would not matter.
announcing a shard
the catalog of available shards and their attributes can propagate through the network via the node_attribute table. every time a node connects to another node, they view the node_attribute records for that node and can store it in their local node_attribute table.
assigning a shard to a node
every node is assigned to a protocol shard and has the obligation of storing the raw transaction details associated to that shard_id. millix aspires to have redundant copies of every transaction since genesis. a baseline protocol shard disk size needs to be established (20 gb?), as well as the minimum number of nodes that is acceptable to be assigned to each protocol shard (20 public nodes with different IP?). using the baseline assumptions and the state of the network, users can determine when new protocol shards are needed.
when a new shard is created it must be supported by a critical mass of public nodes (10?) before it is eligible to be the assigned shard for newly installed nodes. perhaps new node are not assigned a protocol shard until they have a history of node connections and can consider the shards available and eligible to be assigned to itself.
deactivating a shard
when a shard reaches its stated maximum number of records or disk space it is set to status = 0 by each node supporting it. the state will be propagated via node_attribute and, once propagated fully, no nodes will consider the deactivated shard when randomly selecting a shard to associate to a transaction or as an assigned shard on a new node installation.
shard
shard_id (hash of node_id_origin, shard_date, shard_type, node_signature)
shard_name
shard_type
schema_name
schema_path
is_required
record_count
disk_size
updated
node_id_origin
shard_date
node_signature (signed with private key)
status (1=active, 0=inactive or static
create_date
shard_attribute_type
attribute_type_id
attribute_type
status
create_date
example attribute type
fee_ask_request_byte
fee_offer_byte_minute
fee_offer_request_byte
record_count_max
disk_size_max
audit_point_*
consensus_*
shard_attribute
shard_attribute_id
shard_id
attribute_type_id
value
status
create_date
transaction tables
shard_id is denormalized across all the shard eligible tables to allow record navigation in any direction, to any related table, from any selected row. add the following columns:
audit_point.shard_id
audit_verification.shard_id
transaction.shard_id
transaction_input.shard_id
transaction_output.shard_id
transaction_output_attribute.shard_id
transaction_parent.shard_id
transaction_signature.shard_id
when a transaction_id is inserted to a shard, all the associated records must also be inserted and present on the same shard.
table node_attribute_type
example value : "shard_protocol"
table node_attribute
example value : [{"shard_id":"hxR8TT1fupW","transaction_count":"102,254,665","updated":"2019-12-31 23:15:01","is_assigned":"1","fee_ask_request_byte":"20"}]
in the example above a node is announcing to other nodes that it is assigned to, and obligated to store data for, a specific shard. it also indicates how many records it has for the shard and when it was last updated. this allows nodes to determine whether the shard is well populated and current. the node is also indicating that it will accept a fee of 20 millix per byte to provide data from the shard.
table node_attribute_type
example value : "shard_custom"
table node_attribute
example value : [{"shard_id":"jcT9YY2giqe","transaction_count":"94,524","updated":"2019-11-30 05:40:40","record_byte_max":"999,999,999,999" "fee_offer_byte_minute":"5","fee_offer_request_byte":"30","fee_ask_request_byte":"40"}]
in the example above a custom shard creator is offering other node operators 5 millix per byte per minute to host data, an additional 30 millix per byte requested as needed and, conversely, they are charging 40 millix per byte to any node requesting the data. they are also indicating the maximum number of bytes they are willing to store or send in a single transaction. if the data represented a song, they would be paying 30 millix per byte to retrieve the data from a custom shard operator and charging 40 millix per byte to serve the data, representing a gross margin of 10 millix per byte per download.
genesis
the millix genesis occurred prior to the implementation of sharding. a placeholder shard_id was associated with transactions prior to shard implementation. genesis unit input assembled:
{
"transaction_input_list": [
{
"type": "issue",
"input_position": 0,
"address_base": "14DMBS4PED8tJvgHF2HEStEeBYN7KYuEmt",
"address_version": "0a0",
"address_key_identifier": "14DMBS4PED8tJvgHF2HEStEeBYN7KYuEmt"
}
],
"transaction_output_list": [
{
"address_base": "14DMBS4PED8tJvgHF2HEStEeBYN7KYuEmt",
"address_version": "0a0",
"address_key_identifier": "14DMBS4PED8tJvgHF2HEStEeBYN7KYuEmt",
"amount": 9000000000000000,
"output_position": 0
}
],
"transaction_signature_list": [
{
"address_base": "14DMBS4PED8tJvgHF2HEStEeBYN7KYuEmt",
"address_attribute":
{
"key_public": "uJEhoYRCPV2JntC3wKABzFz7YUcwdEbBhzmjV5WLaPME"
},
"signature": "5R1YRkzkJke5BFPAY36TMLh3N25Zpnr3WCsj5Nb7gQZgtkfC2DUR7ATRDd9Vg4ZxNcRFwHnZTPmciUG6ACncETyL"
}
],
"payload_hash": "2RCzRWM4BqbEikNfVYqKoZjKRY4sBkhVTX63EFT1AupA15LyV8",
"transaction_date": "2020-01-20T16:33:07.000Z",
"node_id_origin": "14hs4GfYcJfFcRtpUeRYdsCRCmPaT1zH3o",
"shard_id": "qGuUgMMVmaCvqrvoWG6zARjkrujGMpzJmpNhBgz1y3RjBG7ZR",
"version": "0a0",
"transaction_id": "2VngVznbdiQ5tqfWqn2NMP8DijqCbLX79Gygo9yYRVFU6iN35h",
"transaction_parent_list": []
}
shard info:
{
node_id_origin: '14hs4GfYcJfFcRtpUeRYdsCRCmPaT1zH3o',
shard_date: 1579537987,
shard_type: 'protocol',
node_signature: '2VDxBSW3RXXVCbfUf7CLpnS6c7uGey9ZizcDxieWsbRP5EifcJxz9i8KyJQJPaEz6DsDCxrfpMnHWn4KG8gLR2vV',
shard_id: 'qGuUgMMVmaCvqrvoWG6zARjkrujGMpzJmpNhBgz1y3RjBG7ZR'
}
millix is an open source cryptocurrency project. millix is fully decentralized, designed for simplicity, transacts at very high speed and very large scale.
work began on the project in spring of 2018 by a diverse group of developers and business professionals. their motivation to create a cryptocurrency protocol with the use case potential of millix came from their backgrounds building:
social network platforms
content management systems
e-commerce systems
data distribution systems
online financial services
communication services
affiliate marketing
manufacturing and logistics operations
gaming platforms
accounting and legal practices
fundamentally, there was a recognition that
which influenced the following set of first principles:
currencies should not be created with debt
currencies should operate at infinite scale
the cost of securing value can't exceed the value it secures
a currency's market value should be proportionate to its fundamental value
participants that increase fundamental value should be compensated
currencies should function without carrying the weight of previous transactions
currencies should work the same throughout the spectrum of transaction values
modern currencies should be at least as simple to use as primitive currencies
simplicity at the edge is only possible with equal simplicity in the foundation
to the extent there is an inverted correlation between utility and a store of value, millix is not intended to compete with the use case or feature set of blockchain projects. the utility that comes from scale and speed has been prioritized, leading to the principles and methodologies described above.
learn more: meet the millix team
case study: the speed and scale of millix
Developers: millix certification for technical and non-technical careers
the total allocation of 9,000,000,000,000,000 mlx (nine quadrillion millix) were created in a genesis event on January 20th , 2020. millix is not being offered directly for sale. instead it will be distributed to participants who support and improve the millix ecosystem.
participants running millix software constantly receive millix for performing protocol related tasks that improve the millix ecosystem, such as storing transaction data and verifying transactions.
the economy is envisioned to allow any participant to incentivize any computing activity by any other participant via fees.
unlike blockchain cryptocurrencies, millix is built on the logic of Directed Acyclic Graph (DAG) for transaction speed and capacity that increases as more transactions and users are added.
millix is original work and was not built on a copied code base of existing work. millix has no points of centralization. millix has no designed bottlenecks. millix has no hierarchy of participants of capabilities. millix data is natively sharded.
learn more: how does millix data sharding work
learn more: the millix toolbox of trust
learn more: how do transactions work
learn more: how do transactions get verified
the initial millix road map consisted of the following themes:
base organization and functionality
connecting millix protocol to machines for large scale transactions
large scale transaction speed and storage
a community of earning
store and own your personal data
developers: contribute to the millix project
millix is available to download for windows, mac, and linux at millix.org/client.