<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>IOST Docs Blog</title>
        <link>https://developers.iost.io/blog</link>
        <description>IOST Docs Blog</description>
        <lastBuildDate>Fri, 21 Sep 2018 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[IOST V8VM Design]]></title>
            <link>https://developers.iost.io/blog/iost-v8vm-design</link>
            <guid>https://developers.iost.io/blog/iost-v8vm-design</guid>
            <pubDate>Fri, 21 Sep 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[The Ethereum Virtual Machine (EVM) is a "quasi-Turing-complete" 256-bit virtual machine and one of the most important components of the Ethereum network. Since Ethereum's launch, EVM-based smart-contract development has matured, giving rise to many DApps such as CryptoKitties and the recently popular Fomo3D. Virtually every blockchain developer recognizes the importance of smart contracts and virtual machines, so VM usability and ease of contract development have become a key battleground among public chains — and a decisive factor in how far a chain can ultimately go.]]></description>
            <content:encoded><![CDATA[<p>The Ethereum Virtual Machine (EVM) is a "quasi-Turing-complete" 256-bit virtual machine and one of the most important components of the Ethereum network. Since Ethereum's launch, EVM-based smart-contract development has matured, giving rise to many DApps such as CryptoKitties and the recently popular Fomo3D. Virtually every blockchain developer recognizes the importance of smart contracts and virtual machines, so VM usability and ease of contract development have become a key battleground among public chains — and a decisive factor in how far a chain can ultimately go.</p>
<h3 class="anchor anchorTargetStickyNavbar_eptP" id="1-the-evm-is-not-turing-complete">1. The EVM is not Turing-complete<a href="https://developers.iost.io/blog/iost-v8vm-design#1-the-evm-is-not-turing-complete" class="hash-link" aria-label="Direct link to 1. The EVM is not Turing-complete" title="Direct link to 1. The EVM is not Turing-complete" translate="no">​</a></h3>
<p>A common misconception online is that the EVM is Turing-complete. It is not.</p>
<p>A Turing machine is a mathematical model proposed by Alan Turing in 1936. It consists of an infinite tape, a finite alphabet, a read/write head, a state register, and a finite instruction set. Starting from an initial configuration, the head moves and writes step by step according to the instruction set until the state becomes halt. In computing, every problem we study is a computational problem; Turing-completeness means that any computable problem can be solved. A programming language or virtual machine is essentially a Turing machine, and Turing-completeness implies it can do anything a Turing machine can — i.e. it can solve every computable problem.</p>
<p>In the EVM, however, every instruction's execution is bounded by gas, which limits the number of computations that can be performed. This is a common cause of Turing-incompleteness: loops, recursion, and computations are all bounded, so program termination is guaranteed. The set of programs that can run on the EVM is therefore restricted, and the EVM is not Turing-complete.</p>
<h3 class="anchor anchorTargetStickyNavbar_eptP" id="2-questionable-evm-design-decisions">2. Questionable EVM design decisions<a href="https://developers.iost.io/blog/iost-v8vm-design#2-questionable-evm-design-decisions" class="hash-link" aria-label="Direct link to 2. Questionable EVM design decisions" title="Direct link to 2. Questionable EVM design decisions" translate="no">​</a></h3>
<p>As the earliest quasi-Turing-complete VM, the EVM pioneered smart-contract-oriented DApp development. As blockchain applications have spread, however, some of the EVM's original design choices have started to show — a few of them severe enough to cause security incidents. At the VM layer alone, we see the following issues across design and security:</p>
<h4 class="anchor anchorTargetStickyNavbar_eptP" id="21-smart-contract-design">2.1 Smart-contract design<a href="https://developers.iost.io/blog/iost-v8vm-design#21-smart-contract-design" class="hash-link" aria-label="Direct link to 2.1 Smart-contract design" title="Direct link to 2.1 Smart-contract design" translate="no">​</a></h4>
<ul>
<li class=""><font color="#0092ff">Lack of standard library support:</font> The EVM has very limited standard-library support. Even basic <code>string</code> handling is awkward — concatenation, slicing and searching all have to be implemented by the developer. The consequence is that developers have to deal with all sorts of incidental work instead of focusing on their actual business logic. Hand-rolled libraries can be expensive in time and space (burning unnecessary gas), and borrowing code from open-source projects introduces additional security risks and makes auditing harder.</li>
<li class=""><font color="#0092ff">Hard to debug and test:</font> Beyond the OutOfGas exception, the EVM gives developers no feedback. There is no logging, no breakpoints, and no step-by-step debugging. The <code>event</code> mechanism partially mitigates this but was never designed as a proper debugging tool.</li>
<li class=""><font color="#0092ff">No floating point:</font> The EVM does not support floats. Ethereum uses Wei as the smallest unit and only deals with integers. This avoids floating-point precision issues, but in practice developers end up appending many zeros after their <code>eth</code> variables, which makes code extremely awkward to maintain. Floating point genuinely is useful in some scenarios and shouldn't have been ruled out wholesale.</li>
<li class=""><font color="#0092ff">Contracts can't be upgraded:</font> The EVM does not support contract upgrades. Upgradeability is a hard requirement for serious smart-contract development — for hot-patching security issues, extending features, and so on. Without it, developers can only deploy a new contract, which is time-consuming and laborious.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eptP" id="22-smart-contract-security">2.2 Smart-contract security<a href="https://developers.iost.io/blog/iost-v8vm-design#22-smart-contract-security" class="hash-link" aria-label="Direct link to 2.2 Smart-contract security" title="Direct link to 2.2 Smart-contract security" translate="no">​</a></h4>
<ul>
<li class=""><font color="#0092ff">Overflow attacks:</font> The EVM does not use SafeMath by default. When Solidity arithmetic on <code>uint256</code> exceeds the maximum value, the result wraps around to a small number — opening an overflow vulnerability. Tokens such as BEC and SMT have all suffered overflow attacks with devastating consequences. The BEC vulnerability looked like this:</li>
</ul>
<div class="language-javascript codeBlockContainer_NSky theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Thz8"><pre tabindex="0" class="prism-code language-javascript codeBlock_ohrZ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_rlL9"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">batchTransfer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">address</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token parameter"> _receivers</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> uint256 _value</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> whenNotPaused </span><span class="token function" style="color:rgb(80, 250, 123)">returns</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">bool</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    uint cnt </span><span class="token operator">=</span><span class="token plain"> _receivers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">length</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    uint256 amount </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">uint256</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">cnt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">*</span><span class="token plain"> _value</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// overflow occurs here</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">require</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">cnt </span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token number">0</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> cnt </span><span class="token operator">&lt;=</span><span class="token plain"> </span><span class="token number">20</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">require</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">_value </span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token number">0</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> balances</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">msg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sender</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">&gt;=</span><span class="token plain"> amount</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// after overflow, require always succeeds — vulnerability triggered</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    balances</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">msg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sender</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> balances</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">msg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sender</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">sub</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">amount</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">uint i </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i </span><span class="token operator">&lt;</span><span class="token plain"> cnt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i</span><span class="token operator">++</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        balances</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">_receivers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">i</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> balances</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">_receivers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">i</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">_value</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Transfer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">msg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sender</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> _receivers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">i</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> _value</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<ul>
<li class=""><font color="#0092ff">Reentrancy attacks:</font> One of Solidity's key features is the ability to call other contracts, but sending ETH to an external address or invoking an external contract requires a callout. If the target is a malicious contract, the attacker can place malicious code in its fallback function. When a transfer happens, the fallback executes the malicious code, which re-enters the vulnerable function on the calling contract and re-triggers the transfer. The most infamous reentrancy attack was the DAO hack on early Ethereum. The snippet below illustrates the pattern:</li>
</ul>
<div class="language-javascript codeBlockContainer_NSky theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Thz8"><pre tabindex="0" class="prism-code language-javascript codeBlock_ohrZ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_rlL9"><div class="token-line" style="color:#F8F8F2"><span class="token plain">contract weakContract </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">mapping</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">address</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> uint</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> balances</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">...</span><span class="token operator">...</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// other contract code</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">withdraw</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)">// transfer the caller's balance out, then zero out the balance map</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)">// !!! as long as the balance hasn't been zeroed, msg.sender can keep being called for transfers — reentrancy happens here</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">!</span><span class="token plain">msg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sender</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">call</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">value</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">balances</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">msg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sender</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">throw</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        balances</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">msg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sender</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">...</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// other contract code</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">contract attack</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    weakContract </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> weak</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">...</span><span class="token operator">...</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// other code</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// This is the fallback function, triggered by external transfers. It keeps invoking weakContract.withdraw to perform the reentrancy attack.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> payable </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">weak</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">balance </span><span class="token operator">&gt;=</span><span class="token plain"> msg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">value</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            weak</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">withdraw</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">...</span><span class="token operator">...</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// other code</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<ul>
<li class=""><font color="#0092ff">Unexpected function execution:</font> The EVM does not strictly check function calls. If a contract address is passed as a parameter that the caller can control, unexpected behavior can occur:</li>
</ul>
<div class="language-javascript codeBlockContainer_NSky theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Thz8"><pre tabindex="0" class="prism-code language-javascript codeBlock_ohrZ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_rlL9"><div class="token-line" style="color:#F8F8F2"><span class="token plain">contract </span><span class="token constant" style="color:rgb(189, 147, 249)">A</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">     </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">withdraw</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">uint</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">returns</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">uint</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// When B runs, it only checks whether A has a `withdraw` method, and calls it if so.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// If the incoming `a` does not have a `withdraw` method, its fallback function is invoked instead — unexpected behavior.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">contract </span><span class="token constant" style="color:rgb(189, 147, 249)">B</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">put</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter constant" style="color:rgb(189, 147, 249)">A</span><span class="token parameter"> a</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> a</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">withdraw</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">42</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_eptP" id="3-visible-issues-with-eos-another-high-profile-public-chain">3. Visible issues with EOS, another high-profile public chain<a href="https://developers.iost.io/blog/iost-v8vm-design#3-visible-issues-with-eos-another-high-profile-public-chain" class="hash-link" aria-label="Direct link to 3. Visible issues with EOS, another high-profile public chain" title="Direct link to 3. Visible issues with EOS, another high-profile public chain" translate="no">​</a></h3>
<p>EOS, the other big public-chain story after Ethereum, has its own WebAssembly-based smart-contract engine. EOS contract development, however, has several visible issues:</p>
<ul>
<li class=""><font color="#0092ff">Unfriendly account system:</font> Creating an account is hard. You can only publish a contract after creating an account, and creating one requires an existing EOS account — finding a friend or third party who already has one is non-trivial for most people. Creating an account also requires buying RAM (so it literally costs money), and using a third party introduces custody risk. After the account is created, you also need to stake EOS to obtain CPU time and net bandwidth before you can do anything on the network. These steps are excessive for a developer.</li>
<li class=""><font color="#0092ff">RAM price:</font> RAM is expensive. Contracts have to use RAM, and EOS introduced a RAM market to let users trade it. Even though RAM can be bought and sold, speculators have driven prices up significantly.</li>
<li class=""><font color="#0092ff">High development difficulty:</font> Using C++ as the contract language raises the bar substantially. C++ itself is already complex, and developers also need to call the EOS.IO C++ API on top of it — demanding significant skill from each developer.</li>
</ul>
<p>Given these issues, EOS smart-contract development isn't particularly attractive — and may even be a reason developers walk away from EOS.</p>
<h3 class="anchor anchorTargetStickyNavbar_eptP" id="4-enter-the-iost-virtual-machine">4. Enter the IOST virtual machine<a href="https://developers.iost.io/blog/iost-v8vm-design#4-enter-the-iost-virtual-machine" class="hash-link" aria-label="Direct link to 4. Enter the IOST virtual machine" title="Direct link to 4. Enter the IOST virtual machine" translate="no">​</a></h3>
<p>We believe a good virtual machine has to be both elegantly designed and easy and safe to use. After studying the strengths and weaknesses of EVM, EOS, C Lua, V8 and other VMs, we addressed many of the EVM's and EOS's design issues at their root and — given V8's strong showing in Node.js and Chrome — ended up building the IOST virtual machine on V8.</p>
<h4 class="anchor anchorTargetStickyNavbar_eptP" id="41-iost-v8vm-architecture-and-design">4.1 IOST V8VM architecture and design<a href="https://developers.iost.io/blog/iost-v8vm-design#41-iost-v8vm-architecture-and-design" class="hash-link" aria-label="Direct link to 4.1 IOST V8VM architecture and design" title="Direct link to 4.1 IOST V8VM architecture and design" translate="no">​</a></h4>
<p>The core of the V8VM architecture is <font color="#0092ff">VMManager</font>, which has three primary responsibilities:</p>
<p><img decoding="async" loading="lazy" src="https://developers.iost.io/assets/images/V8VM-2ae89b7ed5cca36ca71119ab10b4989a.png" width="1079" height="537" class="img_HURO"></p>
<ul>
<li class=""><font color="#0092ff">VM entry point:</font> receives requests from other modules — RPC requests, block validation, transaction validation, and so on — preprocesses and formats them, then dispatches them to VMWorkers.</li>
<li class=""><font color="#0092ff">VMWorker lifecycle management:</font> sizes the worker pool dynamically based on system load and reuses workers. Inside each worker we implement JavaScript hot-start and hot Sandbox snapshot persistence, which avoids repeatedly creating VMs and re-loading the same code under high load — keeping resource usage low while dramatically increasing throughput. As a result, IOST V8VM handles workloads like Fomo3D — with massive concurrent users hitting a single contract — comfortably.</li>
<li class=""><font color="#0092ff">State database interaction:</font> guarantees atomicity for every IOST transaction by rolling back the entire transaction when a contract errors out or runs out of gas. The State database uses two levels of in-memory cache before flushing to RocksDB.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eptP" id="42-sandbox-core-design">4.2 Sandbox core design<a href="https://developers.iost.io/blog/iost-v8vm-design#42-sandbox-core-design" class="hash-link" aria-label="Direct link to 4.2 Sandbox core design" title="Direct link to 4.2 Sandbox core design" translate="no">​</a></h4>
<p><img decoding="async" loading="lazy" src="https://developers.iost.io/assets/images/sandbox-4ebb96b78b8974d795690953001afb51.png" width="1299" height="456" class="img_HURO"></p>
<p>The Sandbox is the actual executor of JavaScript smart contracts. It sits below the V8VM and wraps Chrome V8 directly. It has two phases — Compile and Execute:</p>
<blockquote>
<p>Compile phase</p>
</blockquote>
<p>This phase is geared toward contract development and on-chain deployment, with two main responsibilities:</p>
<ul>
<li class=""><font color="#0092ff">Contract Pack:</font> bundles the smart contract. Built on webpack, it packages all JavaScript code under the current contract project and runs dependency installation automatically — making it possible to build large contract projects on IOST V8VM. The IOST V8VM is also fully compatible with the Node.js module system: <code>require</code>, <code>module.exports</code> and <code>exports</code> all work, giving contract authors a native JavaScript developer experience.</li>
<li class=""><font color="#0092ff">Contract Snapshot:</font> uses V8's snapshot feature to compile JavaScript code ahead of time. The compiled code makes Chrome V8 isolate and context creation much faster — at actual execution time the engine just deserializes the snapshot, dramatically improving load and execution speed.</li>
</ul>
<blockquote>
<p>Execute phase</p>
</blockquote>
<p>This phase covers the actual on-chain execution of contracts, with two main responsibilities:</p>
<ul>
<li class=""><font color="#0092ff">LoadVM:</font> initializes the VM — creates the Chrome V8 instance, applies execution parameters, imports the JavaScript standard libraries, and so on. Some of the standard libraries:</li>
</ul>

























<table><thead><tr><th>Library</th><th>Purpose</th></tr></thead><tbody><tr><td>Blockchain</td><td>A Node.js-style module system: module cache, module pre-compilation, cyclic-import handling, etc.</td></tr><tr><td>Event</td><td>JavaScript reads/writes to the State database, with rollback on contract failure or exception.</td></tr><tr><td>NativeModule</td><td>Blockchain-related primitives: <code>transfer</code>, <code>withdraw</code>, and queries for the current block / current transaction.</td></tr><tr><td>Storage</td><td>Event implementation: events emitted from inside JavaScript contracts are delivered as callbacks after the transaction is included on-chain.</td></tr></tbody></table>
<ul>
<li class=""><font color="#0092ff">Execute:</font> the final execution step. IOST V8VM runs the contract on a dedicated thread and monitors execution state. If an exception is thrown, resource limits are exceeded, or execution time crosses the cap, it calls <code>Terminate</code> to stop the contract and returns an error result.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eptP" id="43-iost-v8vm-performance">4.3 IOST V8VM performance<a href="https://developers.iost.io/blog/iost-v8vm-design#43-iost-v8vm-performance" class="hash-link" aria-label="Direct link to 4.3 IOST V8VM performance" title="Direct link to 4.3 IOST V8VM performance" translate="no">​</a></h4>
<p>As the most fundamental piece of infrastructure on a public chain, the virtual machine has to perform. Performance was one of our top design priorities from day one, including during VM selection.</p>
<p>Chrome V8 uses JIT compilation, inline caching, lazy loading, and other techniques to make JavaScript fast. Thanks to V8, IOST V8VM JavaScript execution speed has improved by orders of magnitude. We benchmarked <font color="#0092ff">recursive fibonacci, memory copy, and complex CPU computation</font> across <font color="#0092ff">EVM, EOS, C Lua, and V8VM</font>:</p>
<ul>
<li class="">Test environment</li>
</ul>





















<table><thead><tr><th>Property</th><th>Configuration</th></tr></thead><tbody><tr><td>System</td><td>AWS EC2</td></tr><tr><td>CPU</td><td>2 CPU</td></tr><tr><td>Memory</td><td>8 GB</td></tr></tbody></table>
<ul>
<li class="">Results</li>
</ul>





































<table><thead><tr><th></th><th>evm</th><th>lua c</th><th>eos.binaryen</th><th>eos.wavm</th><th>IOST V8VM</th></tr></thead><tbody><tr><td>cpu calculate (8000)</td><td>92 ms</td><td>6.34 ms</td><td>3.34 ms</td><td>10.28 ms</td><td>6.26 ms</td></tr><tr><td>fibonacci (32)</td><td>8.25 s</td><td>470 ms</td><td>5.5 s</td><td>541 ms</td><td>45 ms</td></tr><tr><td>string concat (10000)</td><td>2.18 s</td><td>370 ms</td><td>316 ms</td><td>96.3 ms</td><td>9.3 ms</td></tr></tbody></table>
<p>In practice, IOST V8VM holds up well against mainstream VM implementations. The numbers above include VM startup and config-loading time, so IOST V8VM has a clear edge even on cold start. We plan to add a VM object pool, LRU caching, and similar optimizations to improve CPU and memory utilization further and push IOST's smart-contract processing capability higher.</p>
<h4 class="anchor anchorTargetStickyNavbar_eptP" id="44-closing-notes">4.4 Closing notes<a href="https://developers.iost.io/blog/iost-v8vm-design#44-closing-notes" class="hash-link" aria-label="Direct link to 4.4 Closing notes" title="Direct link to 4.4 Closing notes" translate="no">​</a></h4>
<p>We have shipped the first version of the IOST V8VM and delivered every feature originally planned. As we iterate, we'll prioritize <font color="#0092ff">security and ease of use</font>, and invest in three areas:</p>
<ul>
<li class="">High performance — faster contract execution</li>
<li class="">A friendlier developer experience — more and better-quality standard libraries</li>
<li class="">First-class support for large projects — building, debugging, and a complete toolchain</li>
</ul>
<p>The first IOST V8VM also let us validate several ideas — <font color="#0092ff">voting, contract names, tokens</font> and more. Additional new features will roll out incrementally in upcoming testnet releases.</p>
<h3 class="anchor anchorTargetStickyNavbar_eptP" id="appendix-vm-benchmark-programs">Appendix: VM benchmark programs<a href="https://developers.iost.io/blog/iost-v8vm-design#appendix-vm-benchmark-programs" class="hash-link" aria-label="Direct link to Appendix: VM benchmark programs" title="Direct link to Appendix: VM benchmark programs" translate="no">​</a></h3>
<ul>
<li class="">
<ol>
<li class="">EVM code</li>
</ol>
</li>
</ul>
<div class="language-go codeBlockContainer_NSky theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Thz8"><pre tabindex="0" class="prism-code language-go codeBlock_ohrZ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_rlL9"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">package</span><span class="token plain"> evm</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token string" style="color:rgb(255, 121, 198)">"math/big"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token string" style="color:rgb(255, 121, 198)">"testing"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token string" style="color:rgb(255, 121, 198)">"github.com/ethereum/go-ethereum/accounts/abi/bind"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token string" style="color:rgb(255, 121, 198)">"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token string" style="color:rgb(255, 121, 198)">"github.com/ethereum/go-ethereum/common"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token string" style="color:rgb(255, 121, 198)">"github.com/ethereum/go-ethereum/core"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token string" style="color:rgb(255, 121, 198)">"github.com/ethereum/go-ethereum/crypto"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> bm </span><span class="token operator">*</span><span class="token plain">Benchmark</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">init</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> err </span><span class="token operator">:=</span><span class="token plain"> crypto</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">GenerateKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   auth </span><span class="token operator">:=</span><span class="token plain"> bind</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">NewKeyedTransactor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   gAlloc </span><span class="token operator">:=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">map</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">common</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Address</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">core</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">GenesisAccount</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      auth</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">From</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">Balance</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> big</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">NewInt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">1000000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   sim </span><span class="token operator">:=</span><span class="token plain"> backends</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">NewSimulatedBackend</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">gAlloc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token boolean">_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> bm</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> err </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">DeployBenchmark</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">auth</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> sim</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> err </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token function" style="color:rgb(80, 250, 123)">panic</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">err</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   sim</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Commit</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">BenchmarkFibonacci</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">b </span><span class="token operator">*</span><span class="token plain">testing</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">B</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> i </span><span class="token operator">:=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i </span><span class="token operator">&lt;</span><span class="token plain"> b</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">N</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i</span><span class="token operator">++</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token boolean">_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> err </span><span class="token operator">:=</span><span class="token plain"> bm</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Fibonacci</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token boolean">nil</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> big</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">NewInt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">32</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> err </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">         b</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Fatalf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"fibonacci run error: %v\n"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">BenchmarkStrConcat</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">b </span><span class="token operator">*</span><span class="token plain">testing</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">B</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> i </span><span class="token operator">:=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i </span><span class="token operator">&lt;</span><span class="token plain"> b</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">N</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i</span><span class="token operator">++</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token boolean">_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> err </span><span class="token operator">:=</span><span class="token plain"> bm</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">StrConcat</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token boolean">nil</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"This is vm benchmark, tell me who is slower"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> big</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">NewInt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">10000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> err </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">         b</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Fatal</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">err</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">BenchmarkCalculate</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">b </span><span class="token operator">*</span><span class="token plain">testing</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">B</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> i </span><span class="token operator">:=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i </span><span class="token operator">&lt;</span><span class="token plain"> b</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">N</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i</span><span class="token operator">++</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token boolean">_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> err </span><span class="token operator">:=</span><span class="token plain"> bm</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Calculate</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token boolean">nil</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> big</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">NewInt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">5000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> err </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">         b</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Fatal</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">err</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<ul>
<li class="">
<ol start="2">
<li class="">Lua code</li>
</ol>
</li>
</ul>
<div class="language-lua codeBlockContainer_NSky theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Thz8"><pre tabindex="0" class="prism-code language-lua codeBlock_ohrZ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_rlL9"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">fibonacci</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">number</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> number </span><span class="token operator">==</span><span class="token plain"> </span><span class="token number">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">then</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token number">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">end</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> number </span><span class="token operator">==</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">then</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">end</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">fibonacci</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">number </span><span class="token operator">-</span><span class="token plain"> </span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">fibonacci</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">number </span><span class="token operator">-</span><span class="token plain"> </span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">end</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">strConcat</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">str</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> cycles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">local</span><span class="token plain"> result </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> i </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> cycles </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">do</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        result </span><span class="token operator">=</span><span class="token plain"> result </span><span class="token operator">..</span><span class="token plain"> str</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">end</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> result</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">end</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">calculate</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">cycles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">local</span><span class="token plain"> rs </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> i </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> cycles</span><span class="token operator">-</span><span class="token number">1</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">do</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        rs </span><span class="token operator">=</span><span class="token plain"> rs </span><span class="token operator">+</span><span class="token plain"> math</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">pow</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">i</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">5</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">end</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> rs</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">end</span><br></div></code></pre></div></div>
<ul>
<li class="">
<ol start="3">
<li class="">EOS code</li>
</ol>
</li>
</ul>
<div class="language-cpp codeBlockContainer_NSky theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Thz8"><pre tabindex="0" class="prism-code language-cpp codeBlock_ohrZ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_rlL9"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">fibonacci</span><span class="token plain"> </span><span class="token operator">:</span><span class="token plain"> </span><span class="token base-clause keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token base-clause"> eosio</span><span class="token base-clause double-colon punctuation" style="color:rgb(248, 248, 242)">::</span><span class="token base-clause class-name">contract</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token operator">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">using</span><span class="token plain"> contract</span><span class="token double-colon punctuation" style="color:rgb(248, 248, 242)">::</span><span class="token plain">contract</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">/// @abi action</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">calcn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int64_t</span><span class="token plain"> n</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int64_t</span><span class="token plain"> r </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">calc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">n</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token function" style="color:rgb(80, 250, 123)">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">r</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">calc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int64_t</span><span class="token plain"> n </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">n </span><span class="token operator">&lt;</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">n </span><span class="token operator">==</span><span class="token plain"> </span><span class="token number">0</span><span class="token plain"> </span><span class="token operator">||</span><span class="token plain"> n </span><span class="token operator">==</span><span class="token plain"> </span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> n</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">calc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">n </span><span class="token operator">-</span><span class="token plain"> </span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">calc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">n </span><span class="token operator">-</span><span class="token plain"> </span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">EOSIO_ABI</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"> fibonacci</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">calcn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">stringadd</span><span class="token plain"> </span><span class="token operator">:</span><span class="token plain"> </span><span class="token base-clause keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token base-clause"> eosio</span><span class="token base-clause double-colon punctuation" style="color:rgb(248, 248, 242)">::</span><span class="token base-clause class-name">contract</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token operator">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">using</span><span class="token plain"> contract</span><span class="token double-colon punctuation" style="color:rgb(248, 248, 242)">::</span><span class="token plain">contract</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">/// @abi action</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">calcn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:rgb(248, 248, 242)">::</span><span class="token plain">string s</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int64_t</span><span class="token plain"> cycles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      std</span><span class="token double-colon punctuation" style="color:rgb(248, 248, 242)">::</span><span class="token plain">string </span><span class="token function" style="color:rgb(80, 250, 123)">ss</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">s</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">size</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">*</span><span class="token plain"> cycles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token char" style="color:rgb(255, 121, 198)">'\0'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int32_t</span><span class="token plain"> k </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> i </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i </span><span class="token operator">&lt;</span><span class="token plain"> cycles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token operator">++</span><span class="token plain">i</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">         </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> j </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> j </span><span class="token operator">&lt;</span><span class="token plain"> s</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">size</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token operator">++</span><span class="token plain">j</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            ss</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">k</span><span class="token operator">++</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> s</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">j</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token function" style="color:rgb(80, 250, 123)">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">ss</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">EOSIO_ABI</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"> stringadd</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">calcn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">calculate</span><span class="token plain"> </span><span class="token operator">:</span><span class="token plain"> </span><span class="token base-clause keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token base-clause"> eosio</span><span class="token base-clause double-colon punctuation" style="color:rgb(248, 248, 242)">::</span><span class="token base-clause class-name">contract</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token operator">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">using</span><span class="token plain"> contract</span><span class="token double-colon punctuation" style="color:rgb(248, 248, 242)">::</span><span class="token plain">contract</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">/// @abi action</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">calcn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">uint64_t</span><span class="token plain"> cycles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">uint64_t</span><span class="token plain"> rs </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">uint64_t</span><span class="token plain"> i </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i </span><span class="token operator">&lt;</span><span class="token plain"> cycles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token operator">++</span><span class="token plain">i</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">         rs </span><span class="token operator">=</span><span class="token plain"> rs </span><span class="token operator">+</span><span class="token plain"> i </span><span class="token operator">*</span><span class="token plain"> i </span><span class="token operator">*</span><span class="token plain"> i </span><span class="token operator">*</span><span class="token plain"> i </span><span class="token operator">*</span><span class="token plain"> i</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token function" style="color:rgb(80, 250, 123)">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">rs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">EOSIO_ABI</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"> calculate</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">calcn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>v8vm</category>
            <category>smart-contract</category>
        </item>
    </channel>
</rss>