Please login or register.
Login with username, password and session length

HEAT Forum

April 23, 2018, 02:16:45 PM
News: 2017-10-10 Heatledger 2.0 with Heatwallet 2.2.0 released! NOTE: Balance leasing and hard fork at block 777777 https://github.com/Heat-Ledger-Ltd/heatwallet/releases

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Messages - verymuchso

Pages: [1] 2 3
1
HEAT 2.5.0 FULL CLIENT - WINDOWS & LINUX

Hard fork set for block 1,245,000 which is somewhere around next Friday (April 6th).

Download available:

https://github.com/Heat-Ledger-Ltd/heatwallet/releases/tag/v2.5.0

HEAT WALLET 2.5.0

This desktop wallet release embeds the 2.5.0 server version which is a mandatory update. If your wallet does not use the built in server (default behavior of the wallet is to connect to a remote API node) you could still use that but you'll lack the client side (UI) improvements.

Includes

Windows and Linux versions.
Mac OS version will follow.

Updates

Apart from the all important embedded server update this release contains dozens of fixes and improvements among some of the more notable are:

  • Visual warning when sending to non existing accounts
  • Visual warning when sending to accounts without public key
  • Correct display of virtual balance in account explorer (virtual balance includes trades based on unconfirmed transactions)
  • Asset Exchange websocket order books updates got fixed, updates as well when no new order is added but just on trades
  • You can switch to beta network from the about dialog now (beta net toolbar color is red) (for developers and beta net testers)
  • Recipient auto complete includes all numeric account ids now

Heatledger 2.5.0

This is a mandatory update, all nodes on the network need to run this version or higher.

Nodes below 2.4.0 will automatically be blacklisted by this version.

Nodes on 2.4.0 will remain working untill we reach block 1,245,000 as of when
a hardfork will take place.

This version will perform a one time scan of the blockchain on startup.

## Installation

To install and run heatledger you need Java JDK 1.8 or higher installed, note that
JDK is different from standard java distributions.

On ubuntu we use sudo apt-get install default-jdk package. For other platforms
please look here http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

For configuration settings see the conf/heat-default.properties files in the installation folder.

## Whats in this release

### No more forks

First and foremost this release fixes the occasional forks that occurred and which
required node operators to do the regular rescans of the blockchain. Those rescans
are not needed anymore as HEAT is now considered stable.

### Stable Storage Engine

HEAT is different from other crypto currencies because of its special custom
build storage engine. Our unique storage engine is what allows us to scale in
size and speed. Building this engine however proved more difficult than
using a one size fits all - off-the shelf - storage engine like every other
crypto out there.

Our hard work however paid off which leads us to this stable and mature 2.5.0
release.

### Benchmark

This version supports benchmark mode which allows you to participate in the
upcoming HEAT Benchmark Competition. Instructions for this will follow but
participating requires at the very least that you run a HEAT server. Once you
run a HEAT server on main net it will be easy to run a second HEAT server
on the same machine but on benchmark net.

### High Speed Binary API

We are moving away from JSON as a transport mechanism and are instead adopting
the binary AVRO encoding from HADOOP. One of the parts that makes it possible
to run a benchmark server which does many thousands of transactions a second
over the internet is the use of binary data over websockets.  
 
This version has that new RPC mechanism to which you can talk from your browser,
mobile or NodeJS app. Interfacing with HEAT is made possible through our
officially supported HEAT-SDK https://www.npmjs.com/package/heat-sdk.

### Adjustable Fees (spam protection)

Transaction fees can be remotely raised or lowered by the developers without the
need to update the software. An incubation period of 24 hours is observed before
the new fees take affect. This allows us to already lower the fees and raise
them again in case of misuse.

This is a temporary measure. Once block file splitting is enabled we dont care
about this anymore since the chain can grow indefinitely from then on.

We will start lowering the fees after the hard fork.  

### Mem Pool Fixes

While technically a part of the storage engine, it is worth mentioning that the
unconfirmed transaction pool had a bug fixed which caused unconfirmed transactions
to be improperly rolled back. Leading to forks due to balance differences between
nodes.

### Adjust heat.maxApiRecords

Use this setting to raise the number of rows returned from the various API's.

### Virtual Order Matcher

This is enabled again by default, the virtual matcher matches orders and generates
trades in real-time based on unconfirmed transactions.

### Numeric Account Ids

Numeric account ids are included in account search and in every autocomplete
now when sending transactions.

2
General HEAT Discussion / HEAT LEDGER 2.5.0
« on: March 30, 2018, 06:48:01 PM »
HEAT 2.5.0 MANDATORY UPDATE - PLEASE EVERYONE UPDATE.

Hard fork set for block 1,245,000 which is somewhere around next Friday (April 6th).

Download available:

https://github.com/Heat-Ledger-Ltd/heatledger/releases/tag/v2.5.0

Heatledger 2.5.0

This is a mandatory update, all nodes on the network need to run this version or higher.

Nodes below 2.4.0 will automatically be blacklisted by this version.

Nodes on 2.4.0 will remain working untill we reach block 1,245,000 as of when
a hardfork will take place.

This version will perform a one time scan of the blockchain on startup.

## Installation

To install and run heatledger you need Java JDK 1.8 or higher installed, note that
JDK is different from standard java distributions.

On ubuntu we use sudo apt-get install default-jdk package. For other platforms
please look here http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

For configuration settings see the conf/heat-default.properties files in the installation folder.

## Whats in this release

### No more forks

First and foremost this release fixes the occasional forks that occurred and which
required node operators to do the regular rescans of the blockchain. Those rescans
are not needed anymore as HEAT is now considered stable.

### Stable Storage Engine

HEAT is different from other crypto currencies because of its special custom
build storage engine. Our unique storage engine is what allows us to scale in
size and speed. Building this engine however proved more difficult than
using a one size fits all - off-the shelf - storage engine like every other
crypto out there.

Our hard work however paid off which leads us to this stable and mature 2.5.0
release.

### Benchmark

This version supports benchmark mode which allows you to participate in the
upcoming HEAT Benchmark Competition. Instructions for this will follow but
participating requires at the very least that you run a HEAT server. Once you
run a HEAT server on main net it will be easy to run a second HEAT server
on the same machine but on benchmark net.

### High Speed Binary API

We are moving away from JSON as a transport mechanism and are instead adopting
the binary AVRO encoding from HADOOP. One of the parts that makes it possible
to run a benchmark server which does many thousands of transactions a second
over the internet is the use of binary data over websockets.  
 
This version has that new RPC mechanism to which you can talk from your browser,
mobile or NodeJS app. Interfacing with HEAT is made possible through our
officially supported HEAT-SDK https://www.npmjs.com/package/heat-sdk.

### Adjustable Fees (spam protection)

Transaction fees can be remotely raised or lowered by the developers without the
need to update the software. An incubation period of 24 hours is observed before
the new fees take affect. This allows us to already lower the fees and raise
them again in case of misuse.

This is a temporary measure. Once block file splitting is enabled we dont care
about this anymore since the chain can grow indefinitely from then on.

We will start lowering the fees after the hard fork.  

### Mem Pool Fixes

While technically a part of the storage engine, it is worth mentioning that the
unconfirmed transaction pool had a bug fixed which caused unconfirmed transactions
to be improperly rolled back. Leading to forks due to balance differences between
nodes.

### Adjust heat.maxApiRecords

Use this setting to raise the number of rows returned from the various API's.

### Virtual Order Matcher

This is enabled again by default, the virtual matcher matches orders and generates
trades in real-time based on unconfirmed transactions.

### Numeric Account Ids

Numeric account ids are included in account search and in every autocomplete
now when sending transactions.

3
General HEAT Discussion / HEATWALLET 2.4.0 | Windows+Linux Desktop edition
« on: December 28, 2017, 09:59:10 PM »
HEAT WALLET 2.4.0 | Windows and Linux desktop

This desktop wallet release embeds the 2.4.0 server version which is a mandatory update. If your wallet does not use the built in server (default behavior of the wallet is to connect to a remote API node) you could still use that but you'll lack the client side (UI) improvements.

Note

The virtual order matcher (instant asset exchange order feedback) is still disabled, we are enabling that in the next wallet update. Because of this you have to wait until the next block (30 seconds) to see your balances updated and to see orders matched and trades made.

When the virtual order matcher is enabled we'll update the web based wallet on https://heatwallet.com and put out a new wallet release.

About the HEAT LEDGER 2.4.0 server

This is a hard fork, a mandatory update of the HEAT network. This update fixes a bug introduced in 2.1.0.

The hard fork will take effect at block 956000.

Nodes below 2.4.0 can not be used to forge in the main HEAT chain.

API Information

https://heatwallet.com/api/#/

HEAT SDK

https://www.npmjs.com/package/heat-sdk

Changes

  • Updated default properties to always perform a scan and validation on every startup.
  • Set remaining balance limit of 0.01 HEAT for ask orders of HEAT due to large number of accidental account drainings and subsequent asset withdrawal incapacity

Get it here

https://github.com/Heat-Ledger-Ltd/heatwallet/releases/tag/v2.4.0

Mac release will follow.

4
General HEAT Discussion / SOFTWARE UPDATE - 2.3.2
« on: December 21, 2017, 10:06:17 PM »
 SERVER UPDATE

HEATLEDGER 2.3.2

We unfortunately introduced a bug in the previous 2.3.1 version basically making 2.3.1 incompatible with the last official guaranteed to work hard fork version 2.2.0 and its followup 2.3.0.

This version solves the problem where certain transactions could not be included in blocks forged by 2.3.1.

Apart from this fix we also fixed a bug in the display of transactions in the block explorer.

https://github.com/Heat-Ledger-Ltd/heatledger/releases/tag/v2.3.2

DESKTOP WINDOWS + LINUX UPDATE

HEAT WALLET 2.3.2

Contains heatledger server 2.3.2.

ABOUT HEATLEDGER 2.3.2

We unfortunately introduced a bug in the previous 2.3.1 version basically making 2.3.1 incompatible with the last official guaranteed to work hard fork version 2.2.0 and its followup 2.3.0.

This version solves the problem where certain transactions could not be included in blocks forged by 2.3.1.

Apart from this fix we also fixed a bug in the display of transactions in the block explorer.

We are working on an update that fully enables this great feature again, it will work even better and no longer interfere where it could cause forks to happen.

https://github.com/Heat-Ledger-Ltd/heatwallet/releases/tag/v2.3.2

5
HEAT LEDGER 2.3.0 - BUG FIX

Heatledger 2.3.0

This is an optional server upgrade meant for forging nodes.
This upgrade fixes a bug encountered when we combine the virtual order matchers and forging blocks on the same machine.

Nodes below 2.1.0 will automatically be blacklisted with this version.

On startup a scan and validation of the blockchain will be performed one time, this happens automatically.

Because of the nature of the bug and this version being meant for server forging use, we have disabled both the virtual order matcher and the virtual account balances.
What this means is that if you use this server version to power a HEAT client you will have to wait for the next block before you see things in the client like balance updates, orders, order quantity updates, order cancelled status.

The virtual features will return in a next release together with the option to completely disable this for servers that are not used to power a full client. This saves resources when disabled.

https://github.com/Heat-Ledger-Ltd/heatledger/releases/tag/v2.3.0

6
WE DID IT, 2000 transactions PER SECOND OVER THE NETWORK!!
proof will follow, test it for yourself from your browser

Hi fellow HEATers, please allow me to share a short development status update.

Some interesting and major milestones have been achieved over the past week. To list a few:

Blockchain-Event-Cache

Big steps have been made towards finalizing the Blockchain-Event-Cache, the event cache gave us some real hard challenges to solve. An example being how to store to disk the tip or last N events of a never ending stream of events, without running out of disk space! And do it in such a way that no matter if the HEAT server crashes or shuts down, that at all times the persisted state of the blockchain matches exactly with all persisted events.

The significance of the event cache really can't be overstated. It's workings and design are unique and as far as I know exclusive to HEAT. The event cache should be considered as an ordered list of events where most events map to a whole or part of a blockchain transaction. The event cache has a cursor which points to the current latest event and this cursor can move up and down the list of events.

Observers of the events (microservices listening to transactions for instance) will be notified when an event first arrives. HEAT being a decentralized consensus mechanism must account for the inevitable slowness of reaching full network wide consensus simply because nodes need time to talk to each other, the network speed determines this. The event cache is your friend that watches blocks come and go, switches to better forks and reorganizations of transactions, all the while giving you a normalized view of the transaction stream as if you observed centralized service.

When building business applications on top of HEAT using the blockchain as a place to transport and store your data having this 'normal' view of the transaction stream is of vital importance for any kind of application you build. 

High-speed-RPC-channel

What was probably the coolest part of the week was to fire up the new high speed RPC channel we added to HEAT core. From unit tests we could already see that HEAT has been very fast when it comes to processing transactions, we've seen numbers of well over 2000 transactions a second when feeding transactions directly from memory into HEAT.

What hasn't been achieved yet was to process such high numbers over a network, until now that is!!. Two major obstacles of feeding lots of transactions to a HEAT server over the network are:

  • Everything is encoded as JSON, parsing lots of JSON costs memory and downloading large blocks of JSON makes things slow
  • Every transaction broadcasted did so over its own unique and new HTTP connection

The data encoding issue has been something we've looked at for some time now. What we wanted is basically write out raw binary data which is as dense and optimized as possible, yet still be able to handle this new format somewhat easily and preferably portable so it could be used for instance with the https://www.npmjs.com/package/heat-sdk. We would be using such for:

  • Microservices user defined messaging protocols
  • P2P message encoding
  • To encode high speed RPC messages

We decided to go with https://avro.apache.org/ which is the data serialization stack from http://hadoop.apache.org/ [HADOOP=The Apache™ Hadoop® project develops open-source software for reliable, scalable, distributed computing.]. A major factor to choose AVRO is its support for JavaScript and the fact it supports versioning of schemas. When developing microservices those aspects are extremely important and allow service operators to easily declare their custom binary protocols which can be shared and used in a decentralized way where service users only ever need the public schema (hosted perhaps on the blockchain - since even the schemas can be efficiently encoded to binary data) in order to communicate with a microservice.
 
To solve the slowness of sending each transaction over a new connection we've added a new channel to the existing websocket handlers. You can now open a websocket connection and leave it open, not needing to connect again you can now send binary transactions over the already open connection. For now this channel supports only one operation, to broadcast a single transaction, but we expect this RPC mechanism to grow to support more methods in the future.

And the cool thing is you can use this super fast transport from everywhere where there is Websocket support, this includes everywhere the HEAT-SDK can be used (browser, mobile, nodeJS).

Playing around, we've already seen huge speeds. On my PC alone we could already reach over 2000 transactions a second for the duration of 500,000 transactions. This was done with 4 websocket connections and after pre-generating and signing the 500,000 transactions. That particular node was forging but with no connected peers, for that to be possible we need to update the P2P layer still.

Currently we are working on completing the RPC and AVRO binary data support to HEAT-SDK so that all this can be used simply by getting HEAT-SDK.
When that is ready we'll be hosting the custom HEAT server somewhere and we'll release some in-browser samples that people could use to fire transactions at the HEAT instance. Would be fun to see what numbers it can do, I know you guys like breaking things.  ;D

Thanks for sticking around! And let's make HEAT great again.

7
General HEAT Discussion / Re: Heat server 2.2.0 - Mandatory update
« on: December 03, 2017, 04:37:56 PM »
Windows and Linux desktop client, with server..

HEAT Wallet 2.3.0

These are the desktop clients with updated server embedded.

https://github.com/Heat-Ledger-Ltd/heatwallet/releases/tag/v2.3.0

8
General HEAT Discussion / Heat server 2.2.0 - Mandatory update
« on: December 02, 2017, 11:59:40 PM »
Heatledger 2.2.0

This is a mandatory update, all nodes on the network need to run this version
or higher.

Nodes below 2.1.0 will automatically be blacklisted with this version.

UPGRADE INSTRUCTIONS [upgrade only, new installations can ignore]

This version will perform a full rescan of the blockchain upon first use, this
happens automatically.

API Documentation

Please look here for API docs https://heatwallet.com/api

List of updates/fixes/features.

- fixes bug involving the last hard fork and the way expired orders are handled

Download here:

https://github.com/Heat-Ledger-Ltd/heatledger/releases/tag/v2.2.0

9
General HEAT Discussion / Core development update
« on: December 01, 2017, 12:19:20 PM »
The reason we needed the hard fork so badly was because of a bug.

It turned out through a not so obvious coding error that when you'd send HEAT to yourself it would incorrectly affect your forging stake. Not your spendable balance, only the amount of stake considered by the protocol.

What went wrong was that where a transaction comes in and is first processed two objects where instantiated, one for the sender account and one for the recipient account. These objects are passed on to lower level operations where depending on the transaction types these account objects are updated and these updates are recorded to a versioning mechanism.

What happened was that when the objects where first created some initial balance info was kept in object memory and when we first saved the sender object and later the recipient object, it turned out that updates to the first where not available to the second.

Solution was to check if sender and recipient are equal and simply instantiate a single object.

The fork was kindof difficult since we could not foresee if anyone would trigger this in between us releasing the update and the fork height. To deal with this at the fork height we had to make a scan of the blockchain (which luckily can do that in about a second) to search for offending transactions and correct the account stake for those accounts.

All in all the effect has been that just some of these payments have occurred and always with low amounts, the single large transfer was reported to us and we did the fork within the week.

-------------

Apart from this work has been progressing on finalizing the microservices, lets call it version 2. The main difference being that the usage has been greatly simplified, the api as published in heat-dev-kit will remain the same for the most part but some of the more difficult aspects are handled by the heat platform now and dont need any work on the part of the microservice author.

Its hard to describe this in a few words, but I'll try anyway..

Because of the nature of a decentralized consensus network, basically being decentralized, it can happen that the order of transactions differ at different points in the network. Since microservices are invoked through transactions a microservice had to be aware of this fact. Another aspect of a blockchain is that blocks get generated and accepted at some point, while at a later moment a better block could come along which required the old one to be undone and the new one to be applied, this also had to be handled by your microservice.

These two things are handled now by a transaction cache solution which is at the heat core, this cache ensures transactions are reported to your microservice only once and in case the order of transactions changes only the transaction that has shifted position is reported to your microservice.

The cache is also persisted to disk so that when you redownload the blockchain or rescan it, your microservices are not invoked again.

Off to slush now for the second day in a snowy Helsinki.

10
HEAT Wallet discussion / New releases server 1.1.0, client 2.0.0
« on: June 30, 2017, 01:33:31 PM »
New client [2.0.0] and server [1.1.0] releases

Desktop version with server: https://github.com/Heat-Ledger-Ltd/heatwallet/releases/tag/v2.0.0
Desktop version with out server: https://github.com/Heat-Ledger-Ltd/heat-ui/releases/tag/v2.0.0
Server only: https://github.com/Heat-Ledger-Ltd/heatledger/releases/tag/v1.1.0


Heat Wallet 2.0.0

Includes Heat Server 1.1.0, see below for details.

The HEAT 2.0 client consist of a major rewrite/improvement of the core workings as well of a brand new look and feel in line with the newly developed Heat Ledger Ltd corporate styling.

Focus has been on improving usability as well as performance, security and application stability.

Some of the improvements are:

  • your registered email account id is displayed now instead of the numeric id
  • others can address you now by your email account id
  • when sending heat, assets or messages there now is search as you type auto complete support which makes finding other accounts a breeze
  • wallets can now be imported and exported from/to your browser or the desktop app
  • individual accounts can be imported and exported using just their secret phrase
  • block explorer search for accounts, transactions, blocks
  • block explorer data display improvements
  • display assets issued and held by any account
  • preview message and display of full message in account history
  • exchange order expiry time period picker
  • deposit and withdrawal buttons for Heat Ledger certified asset gateways
  • fixed asset launch time display
  • real-time chart ticker picks up trades as they occur
  • uncertified markets hidden by default, expandable through clicker
  • improved trollbox chat with cryptographic identity proof (click on name to inspect account in real time in block explorer)


Heatledger 1.1.0

While this version is backward compatible with previous versions when it comes to the p2p protocol level operations. To use the new 2.0 class of the HEAT clients you will need this upgraded version since those clients depend on extensions to the API not available in previous versions.

Focus for the 1.1.0 release has been on increasing system stability by hardening the existing code to better deal with multi threaded access to the core HEAT storage components (basically the blockchain itself).

In the upcoming versions of the HEAT server product focus will shift to replacing the peer 2 peer system inherited from HEAT's NXT origins (the p2p code is the last piece of original NXT code).

Now that this step was made, the core is ready to be used by the new intelligent and fast HEAT p2p protocol, the final bottle neck towards reaching transaction processing at lightning speeds.


11
Heat Ledger 1.0.0-b1 (server)

This is a mandatory update, every one must update to this version before we reach the block with height 232,000. At this height the protocol will start rewarding accounts that find a block again. Block 232,000 is expected in three days from the moment of this release.

This version comes with a new byte format for the central blockchain/blocks file which is basically the physical blockchain inside HEAT. Because of the nature of the HEAT blockchain being a flat (memory mapped) file (instead of a database) a migration from one to the other format proved difficult. An easier solution was if users delete their current chain and download a new one from the network.

When running this version for a first time we automatically delete and redownload blockchain/blocks, this happens only once.

To make this process as safe as possible we've added two full chain checkpoints at height 185,000 and one at height 221,250. While you download and you reach that height a digital finger print (SHA256) of all previous blocks is created and compared to the finger print we hard coded in the source code.

This release disables heat.forgingDelay and heat.forgingSpeedup configuration options, this should equalize forging changes.

Various other smaller bug fixes have been applied to this release.

Server version: https://github.com/Heat-Ledger-Ltd/heatledger/releases/tag/v1.0.0-b1
Desktop (windows or linux): https://github.com/Heat-Ledger-Ltd/heatwallet/releases/tag/v1.0.17

12
HEAT Wallet discussion / Re: Heatserver 0.9.29 released.
« on: April 08, 2017, 03:30:34 PM »
That would totally explain the behavior. Thanks for explaining and trying it out.
I'll be removing that config option since it doesnt really make sense in the current HEAT architecture.

Thanks for reporting!


13
HEAT Wallet discussion / Re: Heatserver 0.9.29 released.
« on: April 08, 2017, 02:41:07 PM »
Can you confirm you are using the very latest version from https://github.com/Heat-Ledger-Ltd/heatledger/releases/tag/v0.9.29. Even if you do think you are could you please try and install again plus delete and redownload the blockchain from scratch.

The behavior you are seeing is to be expected if the "trimming" functionality would be behaving badly. The trimming involves the removal of rollback data which advances by 1 block and always acts on the last block from 720 blocks in the past.

I have inspected our own servers and am not seeing the behavior you are experiencing we also have some Ubuntu 16.04 64 bit servers like you do.

Thank you for reporting and please let us know what the outcome is of a reinstall.

14
HEAT Wallet discussion / Heatserver 0.9.29 released.
« on: April 03, 2017, 11:24:29 PM »
Please update your servers. Mandatory update!

Heatledger 0.9.29 - The HEAT is on!

Heatledger 0.9.29

This is a mandatory update, all nodes on older versions must update.

While on [testnet](https://github.com/Heat-Ledger-Ltd/heatledger-test) 8 other releases have come and gone please refer to testnet repo for details on those.

This release fixes most if not all of the forking issues we experienced before plus it enables the new realtime websocket connectors already integrated in both the web and desktop clients.

Forging rewards stay disabled. When this release proves to be stable we will put out another release which will enable forging rewards. This is to be expected by Friday 7'th of April.

https://github.com/Heat-Ledger-Ltd/heatledger/releases/tag/v0.9.29

15
HEAT Wallet discussion / Heatwallet 1.0.13 and server 0.9.18
« on: March 07, 2017, 09:40:05 PM »
Server release

https://github.com/Heat-Ledger-Ltd/heatledger/releases/tag/v0.9.18

Desktop release

https://github.com/Heat-Ledger-Ltd/heatwallet/releases/tag/v1.0.13


Mandatory update will do a hard fork at 105,000.

This release fixes several bugs and disables miner rewards at the fork height.

In order to provide a better download experience when downloading the blockchain you will only
download from the default wellknown peers, this way preventing you from ending on a fork again.
Once the chain is downloaded in full you will connect to all peers on the network.

A bug was fixed where unconfirmed bid order cancellations where not properly persisted to the data
storage, causing both the virtual balance to be wrong and allowing a secondary order cancellation
which would later not make it into a block but will mess with the replicator database model.
The client now properly shows if an order is cancelled even if the cancellation is still unconfirmed,
unconfirmed order cancellations are now shown with strike trough text until the next block fully
removes them.

Pages: [1] 2 3