<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://developers.iost.io/ko/blog</id>
    <title>IOST Docs Blog</title>
    <updated>2018-09-21T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://developers.iost.io/ko/blog"/>
    <subtitle>IOST Docs Blog</subtitle>
    <icon>https://developers.iost.io/ko/img/icon.svg</icon>
    <entry>
        <title type="html"><![CDATA[IOST V8VM 설계]]></title>
        <id>https://developers.iost.io/ko/blog/iost-v8vm-design</id>
        <link href="https://developers.iost.io/ko/blog/iost-v8vm-design"/>
        <updated>2018-09-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Ethereum Virtual Machine(EVM)은 "준 튜링 완전"한 256비트 가상 머신이며 이더리움 네트워크의 가장 중요한 구성 요소 중 하나입니다. 이더리움 출시 이후 EVM 기반 스마트 컨트랙트 개발은 점차 성숙해졌고, CryptoKitties와 최근 인기를 끈 Fomo3D 같은 수많은 DApp이 등장했습니다. 스마트 컨트랙트와 가상 머신의 중요성은 사실상 모든 블록체인 개발자에게 공통된 인식이 되었으며, VM의 사용성과 컨트랙트 개발 편의성은 각 퍼블릭 체인의 핵심 경쟁 영역이자 체인이 도달할 수 있는 최종 높이를 결정짓는 요소가 되었습니다.]]></summary>
        <content type="html"><![CDATA[<p>Ethereum Virtual Machine(EVM)은 "준 튜링 완전"한 256비트 가상 머신이며 이더리움 네트워크의 가장 중요한 구성 요소 중 하나입니다. 이더리움 출시 이후 EVM 기반 스마트 컨트랙트 개발은 점차 성숙해졌고, CryptoKitties와 최근 인기를 끈 Fomo3D 같은 수많은 DApp이 등장했습니다. 스마트 컨트랙트와 가상 머신의 중요성은 사실상 모든 블록체인 개발자에게 공통된 인식이 되었으며, VM의 사용성과 컨트랙트 개발 편의성은 각 퍼블릭 체인의 핵심 경쟁 영역이자 체인이 도달할 수 있는 최종 높이를 결정짓는 요소가 되었습니다.</p>
<h3 class="anchor anchorTargetStickyNavbar_eptP" id="1-evm은-튜링-완전하지-않다">1. EVM은 튜링 완전하지 않다<a href="https://developers.iost.io/ko/blog/iost-v8vm-design#1-evm%EC%9D%80-%ED%8A%9C%EB%A7%81-%EC%99%84%EC%A0%84%ED%95%98%EC%A7%80-%EC%95%8A%EB%8B%A4" class="hash-link" aria-label="1. EVM은 튜링 완전하지 않다에 대한 직접 링크" title="1. EVM은 튜링 완전하지 않다에 대한 직접 링크" translate="no">​</a></h3>
<p>인터넷에는 "EVM이 튜링 완전하다"는 흔한 오해가 있지만, 실제로는 그렇지 않습니다.</p>
<p>튜링 머신은 앨런 튜링이 1936년에 제안한 수학 모델로, 무한 길이의 테이프, 유한 알파벳, 읽기/쓰기 헤드, 상태 레지스터, 그리고 유한 명령어 집합으로 구성됩니다. 초기 구성에서 시작해 헤드는 명령어 집합을 따라 한 단계씩 움직이고 기록하다 상태가 "정지"가 될 때 계산이 끝납니다. 컴퓨팅 분야에서 우리가 다루는 모든 문제는 계산 문제이며, 튜링 완전이란 임의의 계산 가능 문제를 풀 수 있다는 의미입니다. 프로그래밍 언어나 가상 머신은 본질적으로 튜링 머신이며, 튜링 완전이라는 말은 곧 튜링 머신이 할 수 있는 모든 일을 할 수 있다 — 즉, 모든 계산 가능 문제를 풀 수 있다 — 는 뜻입니다.</p>
<p>그러나 EVM의 설계에서는 모든 명령 실행이 가스에 의해 제한되어 수행 가능한 계산 횟수가 제한됩니다. 이는 튜링 불완전의 흔한 원인 중 하나로, 반복, 재귀, 계산이 모두 유한해 프로그램의 종료가 보장됩니다. 따라서 EVM에서 실행 가능한 프로그램은 많은 제약을 받게 되며, EVM은 튜링 완전이 아닙니다.</p>
<h3 class="anchor anchorTargetStickyNavbar_eptP" id="2-evm의-비합리적인-설계">2. EVM의 비합리적인 설계<a href="https://developers.iost.io/ko/blog/iost-v8vm-design#2-evm%EC%9D%98-%EB%B9%84%ED%95%A9%EB%A6%AC%EC%A0%81%EC%9D%B8-%EC%84%A4%EA%B3%84" class="hash-link" aria-label="2. EVM의 비합리적인 설계에 대한 직접 링크" title="2. EVM의 비합리적인 설계에 대한 직접 링크" translate="no">​</a></h3>
<p>EVM은 최초의 준 튜링 완전 가상 머신으로서 스마트 컨트랙트 기반 DApp 개발의 길을 열었습니다. 그러나 블록체인 응용이 확산되면서 EVM 초기의 비합리적인 설계가 점차 드러났고, 일부는 심각한 보안 사고로까지 이어졌습니다. 가상 머신 계층만 보아도 설계 측면과 보안 측면에 다음과 같은 문제가 있습니다:</p>
<h4 class="anchor anchorTargetStickyNavbar_eptP" id="21-스마트-컨트랙트-설계-측면">2.1 스마트 컨트랙트 설계 측면<a href="https://developers.iost.io/ko/blog/iost-v8vm-design#21-%EC%8A%A4%EB%A7%88%ED%8A%B8-%EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8-%EC%84%A4%EA%B3%84-%EC%B8%A1%EB%A9%B4" class="hash-link" aria-label="2.1 스마트 컨트랙트 설계 측면에 대한 직접 링크" title="2.1 스마트 컨트랙트 설계 측면에 대한 직접 링크" translate="no">​</a></h4>
<ul>
<li class=""><font color="#0092ff">표준 라이브러리 부족:</font> EVM은 충분한 표준 라이브러리 지원을 제공하지 않으며, 가장 기본적인 string 타입조차 다루기 불편해 문자열 연결, 분할, 검색 등을 모두 개발자가 직접 구현해야 합니다. 결과적으로 개발자는 본업과 무관한 자질구레한 디테일에 시간을 빼앗기고 비즈니스 로직에 집중하기 어려워집니다. 직접 구현한 라이브러리는 시간/공간 복잡도가 과해 불필요한 가스를 낭비하기 쉽고, 오픈 소스에서 가져온 코드는 보안 리스크와 감사 부담을 더할 수 있어 어느 쪽도 이득이 적습니다.</li>
<li class=""><font color="#0092ff">디버깅과 테스트가 어려움:</font> EVM은 OutOfGas 예외를 던지는 것 외에 개발자에게 정보를 돌려주지 않습니다. 로그 출력이 없고 브레이크포인트나 단계별 디버깅도 불가능합니다. event 메커니즘이 부분적으로 이를 보완하지만, 본래 디버깅 도구로 설계된 것이 아니어서 우아하거나 사용하기 좋다고 보기 어렵습니다.</li>
<li class=""><font color="#0092ff">부동소수 미지원:</font> EVM은 부동소수를 지원하지 않으며 이더리움은 Wei를 최소 단위로 정수만 다룹니다. 이를 통해 부동소수의 정밀도 문제는 피했지만, 실무에서는 eth 값을 표현하기 위해 변수 뒤에 많은 0을 붙여야 해서 코드 유지보수가 매우 까다로워집니다. 부동소수가 특정 상황에서는 여전히 유용한 만큼 일률적으로 배제할 일은 아닙니다.</li>
<li class=""><font color="#0092ff">컨트랙트 업그레이드 불가:</font> EVM은 컨트랙트 업그레이드를 지원하지 않으며, 업그레이드 가능성은 스마트 컨트랙트 개발의 강한 요구 사항 중 하나입니다. 보안 패치, 기능 확장 등에 필수적이지만 EVM은 전혀 지원하지 않으므로 개발자는 새 컨트랙트를 다시 배포할 수밖에 없으며, 그만큼 시간과 노력이 더 듭니다.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eptP" id="22-스마트-컨트랙트-보안-측면">2.2 스마트 컨트랙트 보안 측면<a href="https://developers.iost.io/ko/blog/iost-v8vm-design#22-%EC%8A%A4%EB%A7%88%ED%8A%B8-%EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8-%EB%B3%B4%EC%95%88-%EC%B8%A1%EB%A9%B4" class="hash-link" aria-label="2.2 스마트 컨트랙트 보안 측면에 대한 직접 링크" title="2.2 스마트 컨트랙트 보안 측면에 대한 직접 링크" translate="no">​</a></h4>
<ul>
<li class=""><font color="#0092ff">오버플로 공격:</font> EVM의 safeMath 라이브러리는 기본값으로 사용되지 않습니다. Solidity에서 uint256 연산 결과가 uint256 최댓값을 넘어가면 매우 작은 수로 오버플로되며 취약점이 발생합니다. BEC, SMT 같은 토큰들이 모두 오버플로 공격을 겪고 큰 피해를 입었습니다. BEC의 오버플로 취약점은 다음과 같았습니다:</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)">// 여기서 오버플로 발생</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)">// 오버플로 후 require가 항상 참이 되어 취약점이 성립</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">재진입 공격:</font> Solidity의 큰 특징 중 하나는 외부 컨트랙트를 호출할 수 있다는 점입니다. 그러나 ETH를 외부 주소로 보내거나 외부 컨트랙트를 호출하려면 외부 호출이 필요한데, 만약 대상이 악의적인 컨트랙트라면 fallback 함수에 악성 코드를 심을 수 있습니다. 송금이 일어날 때 fallback이 호출되며 악성 코드가 호출자의 취약한 함수를 다시 호출해 송금이 반복됩니다. 가장 유명한 재진입 공격은 이더리움 초기의 DAO 사건입니다. 아래 스니펫이 그 구조를 보여줍니다:</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)">// 기타 컨트랙트 코드</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)">// 호출자의 잔액을 송금하고 그 다음 balance map을 0으로 만든다.</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)">// !!! 0으로 만들기 전까지는 msg.sender를 계속 호출해 송금을 일으킬 수 있어 여기서 재진입이 발생한다.</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)">// 기타 컨트랙트 코드</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)">// 기타 코드</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)">// 아래 함수는 fallback. 외부 송금 시 호출되어 weakContract.withdraw를 반복 호출하며 재진입 공격을 수행한다.</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)">// 기타 코드</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">예상치 못한 함수 실행:</font> EVM은 함수 호출을 엄격하게 검사하지 않습니다. 컨트랙트 주소가 호출자가 조작 가능한 형태로 인자로 전달되면 의도치 않은 동작이 발생할 수 있습니다:</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)">// B를 실행할 때 A 컨트랙트에 withdraw 메서드가 있는지만 확인하고, 있으면 정상적으로 호출한다.</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)">// 전달된 a에 withdraw가 없다면 a의 fallback 함수가 호출되어 의도치 않은 동작이 일어난다.</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-또-다른-주목-체인-eos의-두드러진-문제">3. 또 다른 주목 체인 EOS의 두드러진 문제<a href="https://developers.iost.io/ko/blog/iost-v8vm-design#3-%EB%98%90-%EB%8B%A4%EB%A5%B8-%EC%A3%BC%EB%AA%A9-%EC%B2%B4%EC%9D%B8-eos%EC%9D%98-%EB%91%90%EB%93%9C%EB%9F%AC%EC%A7%84-%EB%AC%B8%EC%A0%9C" class="hash-link" aria-label="3. 또 다른 주목 체인 EOS의 두드러진 문제에 대한 직접 링크" title="3. 또 다른 주목 체인 EOS의 두드러진 문제에 대한 직접 링크" translate="no">​</a></h3>
<p>EOS는 이더리움에 이어 또 한 번 주목받은 퍼블릭 체인으로, WebAssembly 기반의 독자적인 스마트 컨트랙트 엔진을 갖추고 있습니다. 하지만 EOS의 컨트랙트 개발에는 다음과 같은 분명한 문제가 있습니다:</p>
<ul>
<li class=""><font color="#0092ff">계정 시스템이 친화적이지 않다:</font> 계정 생성 난이도가 높고, 계정이 있어야 컨트랙트를 배포할 수 있습니다. EOS에서는 기존 계정으로 새 계정을 만들어야 하므로, EOS 계정을 이미 보유한 친구나 제3자를 찾기가 쉽지 않습니다. 계정을 만들려면 RAM을 사야 하므로 실제 비용이 들고, 제3자를 통하면 자금 리스크도 생깁니다. 계정을 만든 뒤에도 EOS를 스테이킹해 CPU 시간과 네트워크 대역폭을 확보해야 EOS 네트워크에서 동작이 가능합니다. 개발자에게는 절차가 너무 번거롭습니다.</li>
<li class=""><font color="#0092ff">RAM 가격:</font> RAM이 비쌉니다. 컨트랙트 실행에는 RAM이 필요하며, EOS는 RAM 거래 시장을 열어 두었지만 투기적 거래로 인해 가격이 매우 높습니다.</li>
<li class=""><font color="#0092ff">개발 난이도가 높다:</font> 컨트랙트 언어로 C++를 사용해 개발 진입 장벽을 크게 올렸습니다. C++ 자체도 매우 복잡한데 그 위에서 EOS.IO C++ API까지 다뤄야 하므로 개발자 개개인에게 요구되는 역량이 매우 큽니다.</li>
</ul>
<p>이러한 이유들로 인해 EOS 스마트 컨트랙트 개발은 개발자에게 매력이 떨어지며, 오히려 EOS를 떠나는 이유가 될 수도 있습니다.</p>
<h3 class="anchor anchorTargetStickyNavbar_eptP" id="4-iost-가상-머신의-탄생">4. IOST 가상 머신의 탄생<a href="https://developers.iost.io/ko/blog/iost-v8vm-design#4-iost-%EA%B0%80%EC%83%81-%EB%A8%B8%EC%8B%A0%EC%9D%98-%ED%83%84%EC%83%9D" class="hash-link" aria-label="4. IOST 가상 머신의 탄생에 대한 직접 링크" title="4. IOST 가상 머신의 탄생에 대한 직접 링크" translate="no">​</a></h3>
<p>좋은 가상 머신은 우아한 설계와 함께 사용성과 안전성을 모두 만족해야 한다고 봅니다. EVM, EOS, C Lua, V8 등 여러 VM의 장단점을 비교한 뒤, EVM과 EOS의 비합리적인 설계를 근본부터 다시 짚었고, Node.js와 Chrome에서의 V8의 뛰어난 성능을 바탕으로 V8 기반의 IOST 가상 머신을 만들었습니다.</p>
<h4 class="anchor anchorTargetStickyNavbar_eptP" id="41-iost-v8vm-아키텍처와-설계">4.1 IOST V8VM 아키텍처와 설계<a href="https://developers.iost.io/ko/blog/iost-v8vm-design#41-iost-v8vm-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98%EC%99%80-%EC%84%A4%EA%B3%84" class="hash-link" aria-label="4.1 IOST V8VM 아키텍처와 설계에 대한 직접 링크" title="4.1 IOST V8VM 아키텍처와 설계에 대한 직접 링크" translate="no">​</a></h4>
<p>V8VM 아키텍처의 핵심은 <font color="#0092ff">VMManager</font>이며 주로 다음 세 가지 역할을 합니다:</p>
<p><img decoding="async" loading="lazy" src="https://developers.iost.io/ko/assets/images/V8VM-2ae89b7ed5cca36ca71119ab10b4989a.png" width="1079" height="537" class="img_HURO"></p>
<ul>
<li class=""><font color="#0092ff">VM 진입점:</font> 다른 모듈로부터 들어오는 요청(RPC 요청, 블록 검증, Tx 검증 등)을 받아 전처리/포맷팅한 뒤 VMWorker에게 실행을 위임합니다.</li>
<li class=""><font color="#0092ff">VMWorker 라이프사이클 관리:</font> 현재 시스템 부하에 맞춰 워커 수를 유연하게 조정하고 워커를 재사용합니다. 워커 내부에서는 JavaScript 코드의 핫 스타트와 핫 Sandbox 스냅샷 영속화를 구현해 VM을 반복 생성하거나 같은 코드를 반복 로드하면서 발생하는 고부하/메모리 폭주를 막아, 시스템 자원 사용을 줄이면서 처리량을 크게 끌어올렸습니다. 결과적으로 Fomo3D처럼 단일 컨트랙트에 대규모 사용자가 몰리는 워크로드도 IOST V8VM이 무리 없이 처리합니다.</li>
<li class=""><font color="#0092ff">State 데이터베이스와의 상호작용:</font> 모든 IOST 트랜잭션의 원자성을 보장합니다. 컨트랙트 실행 실패나 가스 부족 시 트랜잭션 전체를 롤백합니다. State 데이터베이스에서는 두 단계의 메모리 캐시를 적용한 뒤 최종적으로 RocksDB로 flush합니다.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eptP" id="42-sandbox-핵심-설계">4.2 Sandbox 핵심 설계<a href="https://developers.iost.io/ko/blog/iost-v8vm-design#42-sandbox-%ED%95%B5%EC%8B%AC-%EC%84%A4%EA%B3%84" class="hash-link" aria-label="4.2 Sandbox 핵심 설계에 대한 직접 링크" title="4.2 Sandbox 핵심 설계에 대한 직접 링크" translate="no">​</a></h4>
<p><img decoding="async" loading="lazy" src="https://developers.iost.io/ko/assets/images/sandbox-4ebb96b78b8974d795690953001afb51.png" width="1299" height="456" class="img_HURO"></p>
<p>Sandbox는 JavaScript 스마트 컨트랙트를 실제로 실행하는 곳입니다. 위로는 V8VM을 받고 아래로는 Chrome V8을 래핑해 호출하며, Compile 단계와 Execute 단계로 나뉩니다:</p>
<blockquote>
<p>Compile 단계</p>
</blockquote>
<p>주로 컨트랙트 개발과 온체인 배포를 위한 단계로, 두 가지 주요 기능이 있습니다:</p>
<ul>
<li class=""><font color="#0092ff">Contract Pack:</font> 스마트 컨트랙트의 번들링. webpack을 기반으로 현재 프로젝트의 모든 JavaScript 코드를 번들링하고, 의존성 설치까지 자동으로 수행해 IOST V8VM에서 대형 컨트랙트 프로젝트를 구축할 수 있게 합니다. IOST V8VM은 Node.js의 모듈 시스템과 완전 호환이라 <code>require</code>, <code>module.exports</code>, <code>exports</code>를 그대로 사용할 수 있어 네이티브 JavaScript 개발 경험을 제공합니다.</li>
<li class=""><font color="#0092ff">Contract Snapshot:</font> V8의 스냅샷 기능을 사용해 JavaScript 코드를 사전에 컴파일합니다. 컴파일된 코드는 Chrome V8의 isolate와 context 생성 효율을 크게 높이며, 실제 실행 시에는 스냅샷을 deserialize하기만 하면 되어 로드 속도와 실행 속도를 모두 크게 끌어올립니다.</li>
</ul>
<blockquote>
<p>Execute 단계</p>
</blockquote>
<p>실제 온체인 컨트랙트 실행을 위한 단계로, 두 가지 주요 기능이 있습니다:</p>
<ul>
<li class=""><font color="#0092ff">LoadVM:</font> VM 초기화를 수행합니다. Chrome V8 객체 생성, 시스템 실행 파라미터 설정, 관련 JavaScript 라이브러리 import 등 컨트랙트 실행에 필요한 모든 준비를 마칩니다. 주요 JavaScript 라이브러리:</li>
</ul>

























<table><thead><tr><th>라이브러리</th><th>역할</th></tr></thead><tbody><tr><td>Blockchain</td><td>Node.js 스타일의 모듈 시스템. 모듈 캐시, 모듈 사전 컴파일, 순환 import 처리 등.</td></tr><tr><td>Event</td><td>JavaScript에서 State 데이터베이스로의 읽기/쓰기 및 실패/예외 시 롤백.</td></tr><tr><td>NativeModule</td><td>블록체인 관련 프리미티브. <code>transfer</code>, <code>withdraw</code>, 현재 블록/현재 트랜잭션 정보 조회 등.</td></tr><tr><td>Storage</td><td>이벤트 구현. JavaScript 컨트랙트 내부에서 발생한 이벤트는 온체인 반영 후 콜백으로 전달됩니다.</td></tr></tbody></table>
<ul>
<li class=""><font color="#0092ff">Execute:</font> 최종 실행 단계. IOST V8VM은 컨트랙트를 별도 스레드에서 실행하고 실행 상태를 모니터링합니다. 예외, 리소스 한도 초과, 실행 시간 초과 중 하나라도 발생하면 <code>Terminate</code>를 호출해 실행을 중단하고 오류 결과를 반환합니다.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eptP" id="43-iost-v8vm-성능">4.3 IOST V8VM 성능<a href="https://developers.iost.io/ko/blog/iost-v8vm-design#43-iost-v8vm-%EC%84%B1%EB%8A%A5" class="hash-link" aria-label="4.3 IOST V8VM 성능에 대한 직접 링크" title="4.3 IOST V8VM 성능에 대한 직접 링크" translate="no">​</a></h4>
<p>가상 머신은 퍼블릭 체인의 가장 핵심적인 인프라이므로 성능이 충분히 뛰어나야 합니다. IOST는 설계 단계와 VM 선정 단계부터 성능을 최우선 지표 중 하나로 삼아왔습니다.</p>
<p>Chrome V8은 JIT, 인라인 캐싱, 지연 로딩 등으로 JavaScript의 해석 실행을 가속합니다. Chrome V8의 높은 성능 덕분에 IOST V8VM의 JavaScript 실행 속도도 크게 향상되었습니다. <font color="#0092ff">재귀 fibonacci, 메모리 복사, 복잡한 CPU 연산</font> 세 가지 측면에서 <font color="#0092ff">EVM, EOS, C Lua, V8VM</font>의 성능을 비교한 결과는 다음과 같습니다:</p>
<ul>
<li class="">테스트 환경</li>
</ul>





















<table><thead><tr><th>항목</th><th>설정</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="">결과</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>실측 결과 IOST V8VM은 주요 VM 구현 중에서도 우수한 성능을 보였습니다. 위 수치에는 VM 시작과 설정 로드 시간이 포함되어 있어 콜드 스타트 단계에서도 이미 유리한 모습입니다. 앞으로 VM 객체 풀, LRU 캐시 등을 추가해 CPU/메모리 사용률을 더 끌어올리고 IOST의 스마트 컨트랙트 처리 능력을 한층 더 향상시킬 예정입니다.</p>
<h4 class="anchor anchorTargetStickyNavbar_eptP" id="44-마무리">4.4 마무리<a href="https://developers.iost.io/ko/blog/iost-v8vm-design#44-%EB%A7%88%EB%AC%B4%EB%A6%AC" class="hash-link" aria-label="4.4 마무리에 대한 직접 링크" title="4.4 마무리에 대한 직접 링크" translate="no">​</a></h4>
<p>현재 IOST V8VM 1차 버전을 완성했으며, 계획한 모든 기능을 구현했습니다. 이후의 반복 개발에서는 <font color="#0092ff">안전성과 사용성</font>을 최우선으로 다음 세 방향에서 지속적으로 개선해 나갈 예정입니다:</p>
<ul>
<li class="">높은 성능 — 컨트랙트가 더 빠르게 실행되도록.</li>
<li class="">더 친화적인 개발 경험 — 표준 라이브러리를 더 늘리고 다듬기.</li>
<li class="">대형 프로젝트의 빌드/디버그를 지원하는 완성도 높은 툴체인.</li>
</ul>
<p>1차 버전의 IOST V8VM 개발에서는 <font color="#0092ff">투표, 컨트랙트 이름, 토큰</font> 등 많은 아이디어를 초기 검증할 수 있었으며, 더 많은 새 기능은 다가오는 테스트넷 업데이트에서 단계적으로 제공될 예정입니다.</p>
<h3 class="anchor anchorTargetStickyNavbar_eptP" id="부록-vm-벤치마크-프로그램">부록: VM 벤치마크 프로그램<a href="https://developers.iost.io/ko/blog/iost-v8vm-design#%EB%B6%80%EB%A1%9D-vm-%EB%B2%A4%EC%B9%98%EB%A7%88%ED%81%AC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8" class="hash-link" aria-label="부록: VM 벤치마크 프로그램에 대한 직접 링크" title="부록: VM 벤치마크 프로그램에 대한 직접 링크" translate="no">​</a></h3>
<ul>
<li class="">
<ol>
<li class="">EVM 코드</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 코드</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 코드</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>
        <author>
            <name>Sherwin Li</name>
        </author>
        <category label="v8vm" term="v8vm"/>
        <category label="smart-contract" term="smart-contract"/>
    </entry>
</feed>