From fe11c560a104ccc713240a0d10080df16a9c3e56 Mon Sep 17 00:00:00 2001 From: Chad Ostrowski <221614+chadoh@users.noreply.github.com> Date: Mon, 27 Jul 2020 20:06:14 -0400 Subject: [PATCH] feat(gas): mostly rewrite; add ballpark eth comparisons Co-authored-by: @janedegtiareva --- docs/assets/predictable-gas-pricing.png | Bin 40638 -> 0 bytes docs/concepts/gas.md | 361 ++++++++++++------------ website/static/css/custom.css | 5 + 3 files changed, 180 insertions(+), 186 deletions(-) delete mode 100644 docs/assets/predictable-gas-pricing.png diff --git a/docs/assets/predictable-gas-pricing.png b/docs/assets/predictable-gas-pricing.png deleted file mode 100644 index 0c26cfbdeda4ef3fc87bd47eb5f7d686284fc444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40638 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 z 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 -NEAR Platform Economics -- What is Gas?

+If you're familiar with web2 cloud service providers (Amazon Web Services, Google Cloud, etc), a big difference with blockchains is that _users_ get charged immediately when they make a call to an app, rather than developers fronting the cost of using all that infrastructure. This creates new possibilities, such as apps that have no long-term risk of going away due to developer/company funds running out. However, it also comes with some usability speed bumps. To help with this, NEAR also provides the ability for developers to [cover gas costs for users](#what-about-prepaid-gas), to create a more familiar experience to those coming from web2. -Fundamentally, the NEAR platform is a marketplace between willing participants. +When thinking about gas, keep two concepts in mind: -On the supply side, operators of the validator nodes and other fundamental infrastructure need to be incentivized to provide these services which make up the community cloud. On the demand side, the developers and end-users of the platform who are paying for its use need to be able to do so in a way which is simple, clear and consistent so it helps them. +* **Gas units**: internally, transaction fees are not calculated directly in NEAR tokens, but instead go through an in-between phase of "gas units". The benefit of gas units is that they are deterministic – the same transaction will always cost the same number of gas units. +* **Gas price**: gas units are then multiplied by a _gas price_ to determine how much to charge users. This price is automatically recalculated each block depending on network demand (if previous block is more than half full the price goes up, otherwise it goes down, and it won't change by more than 1% each block), and bottoms out at a price that's configured by the network, [targeting](https://github.com/nearprotocol/nearcore/pull/3067) 100 million [yocto][metric prefixes]NEAR. -A blockchain-based cloud provides several specific resources to the applications which run atop it: + [metric prefixes]: https://www.nanotech-now.com/metric-prefix-table.htm -- **Compute (CPU)**: This is the actual computer processing (and immediately available RAM) which run the code in a contract. -- **Bandwidth ("Network")**: This is the network traffic between participants and users, including messages which submit transactions and those which propagate blocks. -- **Storage**: Permanent data storage on the chain, typically expressed as a function of both storage space and time. +Note that the gas price can differ between NEAR's mainnet & testnet. [Check the gas price](#whats-the-price-of-gas-right-now) before relying on the numbers below. -Existing blockchains like Ethereum account for all of these in a single up front transaction fee which represents a separate accounting for each of them but ultimately charges developers or users only once in a single fee. +## Thinking in gas -**This is a high volatility fee commonly denominated in "gas".** +NEAR has a more-or-less one second block time, accomplished by [limiting](https://github.com/nearprotocol/nearcore/blob/49b4fcdc297a609d8bb38858fdbf71e7d821f1f5/neard/res/genesis_config.json#L189) the amount of gas per block. The gas units have been carefully calculated to work out to some easy-to-think-in numbers: -Developers prefer predictable pricing so they can budget and provide prices for their end users. The pricing for the above-mentioned resources on NEAR is an amount which is slowly adjusted based on system usage (and subject to the smoothing effect of resharding for extreme usage) rather than being fully auction-based. This means that a developer can more predictably know that the cost of running transactions or maintaining their storage. +* 10¹² gas units, or **1 TGas** (_[Tera][metric prefixes]Gas_)... +* ≈ **1 millisecond** of "compute" time +* ...which, at a minimum gas price of 100 million yoctoNEAR, equals a **0.1 milliNEAR** charge + +This `1ms` is a rough but useful approximation, and is the current goal of how gas units are set within NEAR. Gas units encapsulate not only compute/CPU time but also bandwidth/network time and storage/IO time. Via a governance mechanism, system parameters can be tweaked, shifting the mapping between TGas and milliseconds in the future, but the above is still a good starting point for thinking about what gas units mean and where they come from. + +## The cost of common actions -Initially, all of these resources will be priced and paid in terms of NEAR tokens. In the future, they may also be priced in terms of a stable currency denomination (for example a token pegged to the $USD). +To give you a starting point for what to expect for costs on NEAR, the table below lists some common actions and how much TGas they currently require, and what the fee would be, in milliNEAR, at the minimum gas price of 100 million yN. -While the economics of gas is covered in greater detail in the paper [Economics in a Sharded Blockchain](https://near.org/papers/economics-in-sharded-blockchain/#transaction-and-storage-fees), the following formula is used to facilitate predictable gas pricing where `adjFee` is the amount by which `gasFee` may be changed after each block +| Operation | TGas | fee (mN) | fee (Ⓝ) +| ------------------- | ---- | -------- | ------- +| Create Account | 0.42 | 0.042 | 4.2⨉10⁻⁵ +| Send Funds | 0.45 | 0.045 | 4.5⨉10⁻⁵ +| Stake | 0.50 | 0.050 | 5.0⨉10⁻⁵ +| Add Full Access Key | 0.42 | 0.042 | 4.2⨉10⁻⁵ +| Delete Key | 0.41 | 0.041 | 4.1⨉10⁻⁵ -![predictable gas pricing equation](/docs/assets/predictable-gas-pricing.png) +
+Dig Deeper

+ +Where do these numbers come from? + +NEAR is [configured](https://github.com/nearprotocol/nearcore/blob/49b4fcdc297a609d8bb38858fdbf71e7d821f1f5/neard/res/genesis_config.json#L57-L120) with base costs. An example: + + create_account_cost: { + send_sir: 99607375000, + send_not_sir: 99607375000, + execution: 99607375000 + } + +The "sir" here stands for "sender is receiver". Yes, these are all identical, but that could change in the future. -The official [NEAR Whitepaper](https://near.org/papers/the-official-near-white-paper/#economy) is another useful reference on this topic +When you make a request to create a new account, NEAR immediately deducts the appropriate `send` amount from your account. Then it creates a _receipt_, an internal book-keeping mechanism to facilitate NEAR's asynchronous, sharded design (if you're coming from Ethereum, forget what you know about Ethereum's receipts, as they're completely different). Creating a receipt has its own [associated costs](https://github.com/nearprotocol/nearcore/blob/49b4fcdc297a609d8bb38858fdbf71e7d821f1f5/neard/res/genesis_config.json#L40-L44): + + action_receipt_creation_config: { + send_sir: 108059500000, + send_not_sir: 108059500000, + execution: 108059500000 + } + +The appropriate `send` amount for creating this receipt is also immediately deducted from your account. + +The "create account" action won't be finalized until the next block. At this point, the `execution` amount for each of these actions will be deducted from your account (something subtle: the gas units on this next block could be multiplied by a gas price that's up to 1% different, since gas price is recalculated on each block). Adding it all up to find the total transaction fee: + + (create_account_cost.send_sir + action_receipt_creation_config.send_sir ) * gas_price_at_block_1 + + (create_account_cost.execution + action_receipt_creation_config.execution) * gas_price_at_block_2
+## Costs of complex actions -## How do I buy gas? +The numbers above should give you the sense that transactions on NEAR are cheap! But they don't give you much sense of how much it will cost to use a more complex app or operate a NEAR-based business. Let's cover some more complex gas calculations: deploying contracts and function calls. -You don't directly buy gas. You attach tokens to a transaction or `FunctionCall` access key which are used to purchase gas at specific points in time. +### Deploying Contracts -**Accounts purchase gas automatically when a transaction is processed**. Transactions include anything from the creation of an account to a transfer of tokens or a function call on a contract. +The [basic action costs](https://github.com/nearprotocol/nearcore/blob/49b4fcdc297a609d8bb38858fdbf71e7d821f1f5/neard/res/genesis_config.json#L57-L120) include two different values for deploying contracts. Simplified, these are: -The amount of gas used by a transaction depends on the details of the transaction itself. At genesis, the blockchain is configured with many different cost parameters (in units of gas). Through some governance process, these parameters may be changed over time. The actual cost of this gas, its price in NEAR tokens, is calculated dynamically and on an ongoing basis based on system load, inflation and other factors. + deploy_contract_cost: 184765750000, + deploy_contract_cost_per_byte: 6812999, -Accounts have their balance in NEAR tokens and gas is bought on the fly when a transaction gets processed. +The first is a baseline cost, no matter the contract size. Keeping in mind these each need to be multiplied by two, for both `send` and `execute` costs, and will also require sending & executing a receipt (see blue box above), the gas units comes to: -## An Example Scenario + 2 * 184765750000 + + 2 * contract_size_in_bytes * 6812999 + + 2 * 108059500000 -Account has its balance in NEAR tokens +(Divide the resulting number by 10¹² to get to TGas!) -A user decides to send a transaction to the network. She decides how much gas at most she is willing to spend for the transaction and sets a gas limit for processing the transaction. Some transactions require an almost constant amount of gas but function calls are hard to predict so a little extra never hurts since whatever remains unspent will be returned. +Note that this covers the cost of uploading and writing bytes to storage, but does _not_ cover the cost of holding these bytes in storage. Long-term storage is compensated via [storage staking], a recoverable cost-per-byte amount that will also be deducted from your account during contract deployment. -The transaction reaches the network and, while being processed, attached tokens are used to automatically buy enough gas to finish processing the transaction at the current gas prices. +The AssemblyScript contract in [this example Fungible Token](https://github.com/near-examples/FT/pull/42) compiles to just over 16kb (the Rust contract is much larger, but this [will be optimized](???)). Using the calculation above, we find that it requires **0.81 TGas** (and thus 0.081mN at minimum gas price) for the transaction fee to deploy the contract, while 1.5N will be locked up for storage staking. -Once the transaction is processed, the related account is only charged for the gas that was used. Any leftover NEAR tokens are returned to the account. +### Function calls -## Useful Intuitions about Gas +Given the general-purpose nature of NEAR, function calls win the award for most complex gas calculations. A given function call will use a hard-to-predict amount of CPU, network, and IO, and the amount of each can even change based on the amount of data already stored in the contract! -### Gas as an Estimate of CPU Time +With this level of complexity, it's no longer useful to walk through an example, [enumerating each](https://github.com/nearprotocol/nearcore/blob/f816d09ad634071aff20ad1c71aaf0f6886742d5/neard/res/genesis_config.json#L135-L185) of the gas calculations as we go (you can research this yourself, [if you want](https://github.com/nearprotocol/nearcore/pull/3038)). Instead, let's approach this from two other angles: ballpark comparisons to Ethereum, and getting accurate estimates with automated tests. -Estimating the amount of gas consumed by a transaction can be confusing to developers. While we are working hard to build tools to help with gas estimation, it's still challenging to reason about impossibly large numbers like `10^12` and `10^15`. Internally, however, the _gas amount should closely correlate with the CPU time that a typical node spends working on a function call_ in the `Runtime`. +#### Ballpark Comparisons to Ethereum -When we originally estimated gas fees, **we used an estimate of `10^15` of gas for a `1 second` of wall time.**. +Like NEAR, Ethereum uses gas units to model computational complexity of an operation. Unlike NEAR, rather than using a predictable gas price, Ethereum uses a dynamic, auction-based marketplace. This makes a comparison to Ethereum's gas prices a little tricky, but we'll do our best. -The actual gas amount can, in theory, be compared to the CPU time a node spends. If you divide the amount of gas consumed by a transaction by `10^12`, the result is the approximate CPU time in milliseconds that a transaction used. This intuition should make it easier to understand the gas amount that was spent. +Etherscan gives a [historic Ethereum gas price chart](https://etherscan.io/chart/gasprice). These prices are given in "Gwei", or Gigawei, where a wei is the smallest possible amount of ETH, 10⁻¹⁸. From November 2017 through July 2020, average gas price was 21Gwei. Let's call this the "average" gas price. In July 2020, average gas price went up to 57Gwei. Let's use this as a "high" Ethereum gas fee. -Instead of having the value like `13 * 10^12 gas`, you can say it was about `13ms of CPU`. We may design a measure that would describe it -- something like 13 gas milliseconds or `13 gms`. We could also call it `13 terraGas`, but that doesn't seem as useful. +Multiplying Ethereum's gas units by gas price usually results in an amount that easy to show in milliETH (mE), the same way we've been converting NEAR's TGas to milliNEAR. Let's look at some common operations side-by-side, comparing ETH's gas units to NEAR's, as well as converting to both the above "average" & "high" gas prices. -It's important to note that, over time, adjustments to the gas price through a governance process will likely change the relationshiph between wall time and gas, so we can't just use it as direct CPU time. It's also not direct CPU time because we spend time on storage read/writes which are not entirely compute operations but are partially I/O. +| Operation | ETH gas units | avg mE | high mE | NEAR TGas | mN +| ----------------------------------------------- | ------------- | ------ | ------- | --------- | ----- +| Transfer native token (ETH or NEAR) | 21k | 0.441 | 1.197 | 0.45 | 0.045 +| Deploy & initialize a [fungible token] contract | [1.1M] | 23.3 | 63.1 | [9] | 0.9 (plus 1.5Ⓝ in [storage staking]) +| Transfer a fungible token | [~45k] | 0.945 | 2.565 | [14] | 1.4 +| Setting an escrow for a fungible token | [44k] | 0.926 | 2.51 | [8] | 0.8 +| Checking a balance for a fungible token | 0 | 0 | 0 | 0 | 0 -Consider the example below where our transaction outcome reports `937144500000` units of gas burnt to create an account. We have no clue whether this is a lot or not. But if we divide this number by `10^12` we get `0.937 gms` or almost `1 ms` of compute, which is quite easy to understand. + Function calls require spinning up a VM and loading all compiled Wasm bytes into memory, hence the increased cost over base operations; this is [being optimized](???). -```json -// snippet simplified for clarity -{ - "outcome": { - "gas_burnt": 937144500000, - } -} -``` +While some of these operations on their surface appear to only be about a 10x improvement over Ethereum, something else to note is that the total supply of NEAR is more than 1 billion, while total supply of Ethereum is more like 100 million. So as fraction of total supply, NEAR's gas fees are approximately another 10x lower than Ethereum's. Additionally, if the price of NEAR goes up significantly, then the minimum gas fee set by the network can be lowered. -### Gas as Staking per Transaction +You can expect the network to sit at the minimum gas price most of the time; learn more in the [Economics whitepaper](https://near.org/papers/economics-in-sharded-blockchain/#transaction-and-storage-fees). -On a proof of stake network, staking is used to represent meaningful "skin in the game" for validators which discourages misbehavior. + [fungible token]: https://github.com/near-examples/FT/pull/42 + [1.1M]: https://github.com/chadoh/erc20-test + [9]: https://explorer.testnet.near.org/transactions/GsgH2KoxLZoL8eoutM2NkHe5tBPnRfyhcDMZaBEsC7Sm + [storage staking]: ./storage + [~45k]: https://ethereum.stackexchange.com/a/72573/57498 + [14]: https://explorer.testnet.near.org/transactions/5joKRvsmpEXzhVShsPDdV8z5EG9bGMWeuM9e9apLJhLe + [8]: https://explorer.testnet.near.org/transactions/34pW67zsotFsD1DY8GktNhZT9yP5KHHeWAmhKaYvvma6 + [44k]: https://github.com/chadoh/erc20-test -While the flexibility of our network encourages use, it also invites abuse. In the case of validators, abuse comes in the form of invalid blocks. In case of developers, abuse comes in the form of shard congestion through the submission of tricky transactions. -Unfortunately there is no way to completely prevent these scenarios, either because the computations are too complex (ie. in case of validators we cannot run BFT consensus because it is too slow and expensive) or not possible (ie. in case of transactions it is not possible to predict what receipts a transaction will create). +#### Accurate Estimates with Automated Tests -We protect the network against these two types of abuse through staking -- we require the actors to loan the assets that we fully or partially return after they have completed their interaction. +We will have a demonstration of how to do in-depth gas cost estimation soon; [subscribe to this issue](https://github.com/near/devx/issues/253) for updates. Until then, you may want to look at this [example of how to do simulation testing](https://github.com/near-examples/simulation-testing), a powerful way to test your contracts and inspect every aspect of their execution. -We typically think of stake slashing as a binary response (slashed vs not slashed) that may happen if a validator misbehaves and it can be directly proven. But with prepaid gas, the misbehavior is not only non-discrete but also it cannot be attributed to malice, so we "take away" only a part of the stake (the gas in this case) attached to the transaction. +If you're using NEAR's AssemblyScript SDK, you can use [two methods](https://github.com/near/near-sdk-as/blob/741956d8a9a44e4252f8441dcd0ba3c19743590a/assembly/runtime/contract.ts#L68-L81), `context.prepaidGas` and `context.usedGas`. These can be used with or without tests to report what the virtual machine knows about attached gas and its consumption at the moment your contract method is being executed: +```ts +/** +* Get the number of gas units attached to the call +*/ +get prepaidGas(): u64 { + return env.prepaid_gas(); +} -## What about Prepaid Gas? +/** +* Get the number of gas units that was already burnt during the contract execution and +* attached to promises (cannot exceed prepaid gas). +*/ +get usedGas(): u64 { + return env.used_gas(); +} +``` -The Near Team understands that developers want to provide their users with the best possible onboarding experience. To realize this vision, developers can design their applications in a way that first-time users can draw funds for purchasing gas directly from an account maintained by the developer. Once onboarded, users can then transition to paying for their own platform use. -In this sense, prepaid gas can be realized using a funded account and related contract(s) for onboarding new users. +## How do I buy gas? -*So how can a developer pay the gas fee for his dApp users on NEAR?* +You don't directly buy gas; you attach tokens to transactions. -A user can use the funds directly from the developers account suitable only for the gas fees on this dApp. Then the developer has to distinguish users based on the signers' keys instead of the account names. +Calls to NEAR to read data are always free. But when you make a call to add or update data, you have to do so from an account that has some amount of NEAR tokens available in its balance, and these tokens will be attached to pay the gas fee. -Check out [Key Concept: Account](/docs/concepts/account) "Did you know?" section, item `#2`. +If you're coming from Ethereum, you may be used to the idea of paying a higher gas price to get your transaction processed faster. In NEAR, gas costs are deterministic, and you can't pay extra. -NEAR protocol does not provide any limiting feature on the usage of developer funds. Developers can set allowances on access keys that correspond to specific users -- one `FunctionCall` access key per new user with a specific allowance. +For basic operations like "transfer funds," you can't specify an amount to attach. The gas needed is easy to calculate ahead of time, so it's automatically attached for you. (Check it: [`near-cli`](https://github.com/near/near-cli) has a `send` command, which accepts no `gas` parameter; [`near-api-js`](https://github.com/near/near-api-js) has a [`sendTokens`](https://near.github.io/near-api-js/classes/_near_.near.html#sendtokens) function which accepts no `gas` argument.) As shown in the tables above, these operations are cheap, so you probably won't even notice the slight reduction in your account's balance. -## Experimental Observation +Function calls are more complex, and you can attach an explicit amount of gas to these transactions, up to a [maximum value](https://github.com/nearprotocol/nearcore/blob/c162dc3ffc8ccb871324994e58bf50fe084b980d/neard/res/mainnet_genesis.json#L193) of 3⨉10¹⁴ gas units. Here's how you would override the default attached gas with [`near-cli`](https://github.com/near/near-cli): -You can check out the price of gas yourself right now by issuing various transactions and even directly querying the price of gas on the network. + near call myContract.testnet myFunction "{ \"arg1\": \"val1\" }" --gas=300000000000000 -### What's the price of gas right now? +And in [`near-api-js`](https://github.com/near/near-api-js), you can also specify an explicit amount of gas units to attach when calling a change method; see [example here](https://github.com/near-examples/guest-book/blob/ceb2a39e53351b4ffc21d01987e2b0b21d633fa7/src/App.js#L29). -You can directly query the NEAR platform for the price of gas on a specific block using the RPC method `gas_price`. This price may change depending on network load. The price is denominated in yoctoNEAR (10^-24 NEAR) +The telltale error that calls for this solution looks like this: -1. Take any recent block hash from the blockchain using [NEAR Explorer](https://explorer.testnet.near.org/blocks) +```text +Error: + Transaction A9BzFKmgNNUmEx9Ue9ARC2rbWeiMnq6LpcXh53xPhSN6 failed. + Exceeded the prepaid gas +``` - *At time of writing, `SqNPYxdgspCT3dXK93uVvYZh18yPmekirUaXpoXshHv` was the latest block hash* +
+How many tokens will these units cost?

-2. Issue an RPC request for the price of gas on this block using the method `gas_price` [documented here](/docs/interaction/rpc) +Note that you are greenlighting a maximum number of gas _units_, not a number of NEAR tokens or yoctoNEAR. - ```bash - http post https://rpc.testnet.near.org jsonrpc=2.0 method=gas_price params:='["SqNPYxdgspCT3dXK93uVvYZh18yPmekirUaXpoXshHv"]' id=dontcare - ``` +These units will be multiplied by the gas price at the block in which they're processed. If the function call makes cross-contract calls, then separate parts of the function will be processed in different blocks, and could use different gas prices. At a minimum, the function will take two blocks to complete, as explained in [the blue box above](#the-cost-of-common-actions). -3. Observe the results +Assuming the system rests at minimum gas price of 100 million yoctoNEAR during the total operation, a maximum attached gas of 3⨉10¹⁴ would seem to allow a maximum expenditure of 3⨉10²² yN. However, there's also a pessimistic multiplier of about 6.4 to [prevent shard congestion](https://github.com/nearprotocol/NEPs/issues/67). - ```json - { - "id": "dontcare", - "jsonrpc": "2.0", - "result": { - "gas_price": "5000" - } - } - ``` +Multiplying all three of these numbers, we find that maximum attached gas units allow about 0.2Ⓝ to be spent on the operation if gas prices stay at their minimum. If gas prices are above the minimum, this charge could be higher. -The price of 1 unit of gas at this block was 5000 yoctoNEAR (10^-24 NEAR). +What if the gas price is at the minimum during the starting block, but the operation takes several blocks to complete, and subsequent blocks have higher gas prices? Could the charge be more than ~0.2Ⓝ? No. The pessimistic multiplier accounts for this possibility. +
-### How much does it cost to create an account? -1. use NEAR Wallet to create a new account +## Attach extra gas; get refunded! - > open https://wallet.testnet.near.org and create a new account +How can you know the exact right amount to attach when you call a function? You can't! -2. open NEAR Explorer to the account page to find the transaction representing the account creation +Gas units are based on computational complexity for a given operation, which can be affected by a smart contract's state. This is hard to predict ahead of time. And gas price is adjusted each block based on how busy the network was during the previous block, which is also hard to predict ahead of time. - You can do this by clicking `View All` under "Activity" once your account is created or just by appending your account name to this URL: \ - **explorer.testnet.near.org/accounts/`your_account_name`** +But good news! - > try using account named `ebbs`: [accounts / ebbs](https://explorer.testnet.near.org/accounts/ebbs) +* Gas doesn't cost much on NEAR +* If you attach more gas than needed, you'll get refunded - You will see a "Batch Transaction" by `@test` (the NEAR TestNet faucet account). This transaction represents the initial account creation, funding (10 NEAR) and new key addition (`FullAccess`) since these 3 steps represent the minimum actions needed to create a new account (account creation, funding via faucet and full access to an owner). +This is also true for basic operations. In the previous section we mentioned that these are automatically calculated and attached. In fact, given that the gas price could be adjusted slightly while these operations are being applied (see blue box [above](#the-cost-of-common-actions)), a slight amount extra is attached, and any beyond what's necessary gets refunded. -3. use the RPC interface to query the full status of the transaction - Clicking the link to the right of this Batch Transaction will open a page specific to the transaction itself at a URL matching the following pattern: \ - **explorer.testnet.near.org/transactions/`transaction_hash`** +## What about Prepaid Gas? - > view a sample [Transaction 27r7Xy...](https://explorer.testnet.near.org/transactions/27r7XycLpnmmHsB79zTRn2kLC5Lyx1kQYrq9sBJmtXtq) +The Near Team understands that developers want to provide their users with the best possible onboarding experience. To realize this vision, developers can design their applications in a way that first-time users can draw funds for purchasing gas directly from an account maintained by the developer. Once onboarded, users can then transition to paying for their own platform use. - Use this `transaction_hash` to execute the query in your terminal as per the line below. Note that you will need some way to send the request over HTTP and we recommend [HTTPie](https://httpie.org/). +In this sense, prepaid gas can be realized using a funded account and related contract(s) for onboarding new users. - ```bash - http post https://rpc.testnet.near.org jsonrpc=2.0 method=tx params:='["transaction_hash", ""]' id=dontcare - ``` +*So how can a developer pay the gas fee for their users on NEAR?* - > try using sample Tx `27r7Xy...` below +A user can use the funds directly from the developers account suitable only for the gas fees on this dApp. Then the developer has to distinguish users based on the signers' keys instead of the account names. - ```bash - http post https://rpc.testnet.near.org jsonrpc=2.0 method=tx params:='["27r7XycLpnmmHsB79zTRn2kLC5Lyx1kQYrq9sBJmtXtq", ""]' id=dontcare - ``` +Check out [Key Concept: Account](/docs/concepts/account) "Did you know?" section, item `#2`. -4. observe the amount of gas burnt by this transaction - - ```json - { - "id": "dontcare", - "jsonrpc": "2.0", - "result": { - "receipts_outcome": [ - { - "block_hash": "5TmnMGuqxiwK8rhn4fW8LPRRTstys4MXKZa5NEBesAhZ", - "id": "HY2rWvEqW7E3shXxmndSTATrmCyQX3cpE3JKvrJYg8PS", - "outcome": { - "gas_burnt": 937144500000, - "logs": [], - "receipt_ids": [], - "status": { - "SuccessValue": "" - } - } - // ... snippet removed for clarity ... - } - ], - "transaction": { - "actions": [ - "CreateAccount", - { - "Transfer": { - "deposit": "10000001000000000000000000" - } - }, - { - "AddKey": { - "access_key": { - "nonce": 0, - "permission": "FullAccess" - }, - "public_key": "ed25519:A64JPAjVHLFWCkXPWQY2bzpSXBWmTVeKpqki63BuBage" - } - } - ] - // ... snippet removed for clarity ... - } - } - } - ``` +NEAR protocol does not provide any limiting feature on the usage of developer funds. Developers can set allowances on access keys that correspond to specific users -- one `FunctionCall` access key per new user with a specific allowance. - The transaction used to create an account includes 2 actions: - - `CreateAccount` \ - *(which includes a transfer of 10 NEAR although `deposit` here is measured in yoctoNEAR and 10^24 yoctoNEAR === 1 NEAR)* - - `AddKey` \ - *(which in this case was a `FullAccess` key pair whose public key starts with `A64JPA...`)* - To create this account someone had to buy over 900 billion units of gas (`gas_burnt` = 937,144,500,000). +## What's the price of gas right now? - At the current gas price of 5000 yoctoNEAR per unit of gas, we can multiply `gas_burnt` by `gas_price` to arrive at the total cost in yoctoNEAR tokens for this transaction. The answer is 4.7 x 10^15 yoctoNEAR. +You can directly query the NEAR platform for the price of gas on a specific block using the RPC method `gas_price`. This price may change depending on network load. The price is denominated in yoctoNEAR (10^-24 NEAR) - This is easier to reason about if we change the scale to picoNEAR since this comes to about 4,700 picoNEAR (10^12 picoNEAR === 1 NEAR) for the entire transaction. +1. Take any recent block hash from the blockchain using [NEAR Explorer](https://explorer.testnet.near.org/blocks) - This is a vanishingly small number but who spent those tokens? The NEAR `@test` faucet account did. The same faucet account also deposited 10 NEAR into this new account. + *At time of writing, `SqNPYxdgspCT3dXK93uVvYZh18yPmekirUaXpoXshHv` was the latest block hash* +2. Issue an RPC request for the price of gas on this block using the method `gas_price` [documented here](/docs/interaction/rpc) -## Working with Gas in your dApp + ```bash + http post https://rpc.testnet.near.org jsonrpc=2.0 method=gas_price params:='["SqNPYxdgspCT3dXK93uVvYZh18yPmekirUaXpoXshHv"]' id=dontcare + ``` -### Attaching Gas to a Transaction +3. Observe the results -It's often useful to attach gas to an expensive transaction to make sure it's processed by the network. + ```json + { + "id": "dontcare", + "jsonrpc": "2.0", + "result": { + "gas_price": "5000" + } + } + ``` -The telltale error that calls for this solution looks like this: +The price of 1 unit of gas at this block was 5000 yoctoNEAR (10^-24 NEAR). -```text -Error: - Transaction A9BzFKmgNNUmEx9Ue9ARC2rbWeiMnq6LpcXh53xPhSN6 failed. - Exceeded the prepaid gas -``` -And here's an example of solving the error using `near-api-js`: +## Some closing thoughts from the whitepaper -```js -const BN = require('bn.js'); -// ... -const params = { poll_id: window.voteState.pollId, votes: votes }; -const gas = new BN(10000000000000); -const result = await window.contract.vote( params, gas ); -``` +
+Fundamentally, the NEAR platform is a marketplace between willing participants. On the supply side, operators of the validator nodes and other fundamental infrastructure need to be incentivized to provide these services which make up the “community cloud.” On the demand side, the developers and end-users of the platform who are paying for its use need to be able to do so in a way which is simple, clear and consistent so it helps them. -### Measuring Gas from within a Contract +A blockchain-based cloud provides several specific resources to the applications which run atop it: -It may be useful to measure the amount of gas attached to (or consumed by) a call to your contract method. +- **Compute (CPU)**: This is the actual computer processing (and immediately available RAM) which run the code in a contract. +- **Bandwidth ("Network")**: This is the network traffic between participants and users, including messages which submit transactions and those which propagate blocks. +- **Storage**: Permanent data storage on the chain, typically expressed as a function of both storage space and time. -The `context` object [includes two methods](https://github.com/near/near-sdk-as/blob/741956d8a9a44e4252f8441dcd0ba3c19743590a/assembly/runtime/contract.ts#L68-L81): `prepaidGas` and `usedGas` that report what the virtual machine knows about attached gas and its consumption at the moment your contract method is being executed: +Existing blockchains like Ethereum account for all of these in a single up front transaction fee which represents a separate accounting for each of them but ultimately charges developers or users for them only once in a single fee. This is a high volatility fee commonly denominated in “gas”. -```ts -/** -* Get the amount of prepaid gas attached to the call (in units of gas). -*/ -get prepaidGas(): u64 { - return env.prepaid_gas(); -} +Developers prefer predictable pricing so they can budget and provide prices for their end users. The pricing for the above-mentioned resources on NEAR is an amount which is slowly adjusted based on system usage (and subject to the smoothing effect of resharding for extreme usage) rather than being fully auction-based. This means that a developer can more predictably know that the cost of running transactions or maintaining their storage. +
-/** -* Get the amount of gas (in units of gas) that was already burnt during the contract execution and -* attached to promises (cannot exceed prepaid gas). -*/ -get usedGas(): u64 { - return env.used_gas(); -} -``` +To dig deeper into how and why gas works the way it does on NEAR, check out the [Economics](https://near.org/papers/the-official-near-white-paper/#economics) section of the main whitepaper and the [Transaction and Storage Fees](https://near.org/papers/economics-in-sharded-blockchain/#transaction-and-storage-fees) section of the economics whitepaper. diff --git a/website/static/css/custom.css b/website/static/css/custom.css index b3e2faa99ae..6d4d1aad7f3 100755 --- a/website/static/css/custom.css +++ b/website/static/css/custom.css @@ -546,3 +546,8 @@ footer div.bg-black-25 ul li:nth-child(1) { body > div.navPusher > footer > div.bg-black-25.py-20.md\:py-30 > div > a:hover { color: #fff; } + +super { + vertical-align: super; + font-size: 0.75em; +}