193 lines
15 KiB
HTML
193 lines
15 KiB
HTML
<!DOCTYPE html>
|
|
<html class="writer-html5" lang="en" >
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>Tracer — Plugeth Austin Roberts documentation</title><link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
|
|
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
|
<!--[if lt IE 9]>
|
|
<script src="_static/js/html5shiv.min.js"></script>
|
|
<![endif]-->
|
|
<script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
|
|
<script src="_static/jquery.js"></script>
|
|
<script src="_static/underscore.js"></script>
|
|
<script src="_static/doctools.js"></script>
|
|
<script src="_static/js/theme.js"></script>
|
|
<link rel="index" title="Index" href="genindex.html" />
|
|
<link rel="search" title="Search" href="search.html" />
|
|
<link rel="next" title="System Requirements" href="system_req.html" />
|
|
<link rel="prev" title="Subscription" href="subscription.html" />
|
|
</head>
|
|
|
|
<body class="wy-body-for-nav">
|
|
<div class="wy-grid-for-nav">
|
|
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
|
|
<div class="wy-side-scroll">
|
|
<div class="wy-side-nav-search" >
|
|
<a href="index.html" class="icon icon-home"> Plugeth
|
|
</a>
|
|
<div role="search">
|
|
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
|
|
<input type="text" name="q" placeholder="Search docs" />
|
|
<input type="hidden" name="check_keywords" value="yes" />
|
|
<input type="hidden" name="area" value="default" />
|
|
</form>
|
|
</div>
|
|
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
|
|
<p class="caption"><span class="caption-text">Overview</span></p>
|
|
<ul>
|
|
<li class="toctree-l1"><a class="reference internal" href="project.html">Project Design</a></li>
|
|
<li class="toctree-l1"><a class="reference internal" href="types.html">Basic Types of Plugins</a></li>
|
|
</ul>
|
|
<p class="caption"><span class="caption-text">Tutorials</span></p>
|
|
<ul class="current">
|
|
<li class="toctree-l1"><a class="reference internal" href="install.html">Install</a></li>
|
|
<li class="toctree-l1"><a class="reference internal" href="build.html">Build and Deploy</a></li>
|
|
<li class="toctree-l1 current"><a class="reference internal" href="custom.html">Building a Custom Plugin</a><ul class="current">
|
|
<li class="toctree-l2"><a class="reference internal" href="RPC_method.html">RPC Methods</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="subscription.html">Subscription</a></li>
|
|
<li class="toctree-l2 current"><a class="current reference internal" href="#">Tracer</a><ul>
|
|
<li class="toctree-l3"><a class="reference internal" href="#myservice-struct">MyService Struct</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="#map">Map</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="#tracerresult-functions">TracerResult Functions</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="#access">Access</a></li>
|
|
</ul>
|
|
</li>
|
|
<li class="toctree-l2"><a class="reference internal" href="custom.html#basic-implementation">Basic Implementation</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="custom.html#specialization">Specialization</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<p class="caption"><span class="caption-text">Reference</span></p>
|
|
<ul>
|
|
<li class="toctree-l1"><a class="reference internal" href="system_req.html">System Requirements</a></li>
|
|
<li class="toctree-l1"><a class="reference internal" href="version.html">Version</a></li>
|
|
<li class="toctree-l1"><a class="reference internal" href="api.html">API</a></li>
|
|
<li class="toctree-l1"><a class="reference internal" href="plugin_loader.html">Plugin Loader</a></li>
|
|
<li class="toctree-l1"><a class="reference internal" href="hooks.html">Selected Plugin Hooks</a></li>
|
|
<li class="toctree-l1"><a class="reference internal" href="hook_writing.html">Hook Writing Guide</a></li>
|
|
<li class="toctree-l1"><a class="reference internal" href="core_restricted.html">Core vs Restricted packages in Plugeth-utils</a></li>
|
|
</ul>
|
|
<p class="caption"><span class="caption-text">Contact</span></p>
|
|
<ul>
|
|
<li class="toctree-l1"><a class="reference internal" href="contact.html">Get in touch with us</a></li>
|
|
</ul>
|
|
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
|
|
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
|
|
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
|
|
<a href="index.html">Plugeth</a>
|
|
</nav>
|
|
|
|
<div class="wy-nav-content">
|
|
<div class="rst-content">
|
|
<div role="navigation" aria-label="Page navigation">
|
|
<ul class="wy-breadcrumbs">
|
|
<li><a href="index.html" class="icon icon-home"></a> »</li>
|
|
<li><a href="custom.html">Building a Custom Plugin</a> »</li>
|
|
<li>Tracer</li>
|
|
<li class="wy-breadcrumbs-aside">
|
|
<a href="_sources/tracer.rst.txt" rel="nofollow"> View page source</a>
|
|
</li>
|
|
</ul>
|
|
<hr/>
|
|
</div>
|
|
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
|
|
<div itemprop="articleBody">
|
|
|
|
<div class="section" id="tracer">
|
|
<span id="id1"></span><h1>Tracer<a class="headerlink" href="#tracer" title="Permalink to this headline">¶</a></h1>
|
|
<p>In addition to the initial template containing an intialize function, plugins providing <strong>Tracers</strong> will require three additional elements.</p>
|
|
<div class="admonition warning">
|
|
<p class="admonition-title">Warning</p>
|
|
<p>Caution: Modifying of the values passed into tracer
|
|
functions can alter the results of the EVM execution in unpredictable ways. Additionally, some objects may be reused across calls, so data you wish to capture should be copied rather than retained be reference.</p>
|
|
</div>
|
|
<div class="section" id="myservice-struct">
|
|
<h2>MyService Struct<a class="headerlink" href="#myservice-struct" title="Permalink to this headline">¶</a></h2>
|
|
<p>First an empty MyService Struct.</p>
|
|
<div class="highlight-Go notranslate"><div class="highlight"><pre><span></span><span class="kd">type</span> <span class="nx">MyService</span> <span class="kd">struct</span> <span class="p">{</span>
|
|
<span class="p">}</span>
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="map">
|
|
<h2>Map<a class="headerlink" href="#map" title="Permalink to this headline">¶</a></h2>
|
|
<p>Next, a map of tracers to functions returning a <code class="docutils literal notranslate"><span class="pre">core.TracerResult</span></code> which will be implimented like so:</p>
|
|
<div class="highlight-Go notranslate"><div class="highlight"><pre><span></span><span class="kd">var</span> <span class="nx">Tracers</span> <span class="p">=</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kd">func</span><span class="p">(</span><span class="nx">core</span><span class="p">.</span><span class="nx">StateDB</span><span class="p">)</span> <span class="nx">core</span><span class="p">.</span><span class="nx">TracerResult</span><span class="p">{</span>
|
|
<span class="s">"myTracer"</span><span class="p">:</span> <span class="kd">func</span><span class="p">(</span><span class="nx">core</span><span class="p">.</span><span class="nx">StateDB</span><span class="p">)</span> <span class="nx">core</span><span class="p">.</span><span class="nx">TracerResult</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="o">&</span><span class="nx">MyBasicTracerService</span><span class="p">{}</span>
|
|
<span class="p">},</span>
|
|
<span class="p">}</span>
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="tracerresult-functions">
|
|
<h2>TracerResult Functions<a class="headerlink" href="#tracerresult-functions" title="Permalink to this headline">¶</a></h2>
|
|
<p>Finally a series of functions which points to the MyService struct and coresponds to the interface which geth anticipates.</p>
|
|
<div class="highlight-Go notranslate"><div class="highlight"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">b</span> <span class="o">*</span><span class="nx">MyBasicTracerService</span><span class="p">)</span> <span class="nx">CaptureStart</span><span class="p">(</span><span class="nx">from</span> <span class="nx">core</span><span class="p">.</span><span class="nx">Address</span><span class="p">,</span> <span class="nx">to</span> <span class="nx">core</span><span class="p">.</span><span class="nx">Address</span><span class="p">,</span> <span class="nx">create</span> <span class="kt">bool</span><span class="p">,</span> <span class="nx">input</span> <span class="p">[]</span><span class="kt">byte</span><span class="p">,</span> <span class="nx">gas</span> <span class="kt">uint64</span><span class="p">,</span> <span class="nx">value</span> <span class="o">*</span><span class="nx">big</span><span class="p">.</span><span class="nx">Int</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="p">}</span>
|
|
<span class="kd">func</span> <span class="p">(</span><span class="nx">b</span> <span class="o">*</span><span class="nx">MyBasicTracerService</span><span class="p">)</span> <span class="nx">CaptureState</span><span class="p">(</span><span class="nx">pc</span> <span class="kt">uint64</span><span class="p">,</span> <span class="nx">op</span> <span class="nx">core</span><span class="p">.</span><span class="nx">OpCode</span><span class="p">,</span> <span class="nx">gas</span><span class="p">,</span> <span class="nx">cost</span> <span class="kt">uint64</span><span class="p">,</span> <span class="nx">scope</span> <span class="nx">core</span><span class="p">.</span><span class="nx">ScopeContext</span><span class="p">,</span> <span class="nx">rData</span> <span class="p">[]</span><span class="kt">byte</span><span class="p">,</span> <span class="nx">depth</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">err</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="p">}</span>
|
|
<span class="kd">func</span> <span class="p">(</span><span class="nx">b</span> <span class="o">*</span><span class="nx">MyBasicTracerService</span><span class="p">)</span> <span class="nx">CaptureFault</span><span class="p">(</span><span class="nx">pc</span> <span class="kt">uint64</span><span class="p">,</span> <span class="nx">op</span> <span class="nx">core</span><span class="p">.</span><span class="nx">OpCode</span><span class="p">,</span> <span class="nx">gas</span><span class="p">,</span> <span class="nx">cost</span> <span class="kt">uint64</span><span class="p">,</span> <span class="nx">scope</span> <span class="nx">core</span><span class="p">.</span><span class="nx">ScopeContext</span><span class="p">,</span> <span class="nx">depth</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">err</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="p">}</span>
|
|
<span class="kd">func</span> <span class="p">(</span><span class="nx">b</span> <span class="o">*</span><span class="nx">MyBasicTracerService</span><span class="p">)</span> <span class="nx">CaptureEnd</span><span class="p">(</span><span class="nx">output</span> <span class="p">[]</span><span class="kt">byte</span><span class="p">,</span> <span class="nx">gasUsed</span> <span class="kt">uint64</span><span class="p">,</span> <span class="nx">t</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Duration</span><span class="p">,</span> <span class="nx">err</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="p">}</span>
|
|
<span class="kd">func</span> <span class="p">(</span><span class="nx">b</span> <span class="o">*</span><span class="nx">MyBasicTracerService</span><span class="p">)</span> <span class="nx">Result</span><span class="p">()</span> <span class="p">(</span><span class="kd">interface</span><span class="p">{},</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="s">"hello world"</span><span class="p">,</span> <span class="kc">nil</span> <span class="p">}</span>
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="access">
|
|
<h2>Access<a class="headerlink" href="#access" title="Permalink to this headline">¶</a></h2>
|
|
<p>As with pre-built plugins, a <code class="docutils literal notranslate"><span class="pre">.so</span></code> will need to be built from <code class="docutils literal notranslate"><span class="pre">main.go</span></code> and moved into <code class="docutils literal notranslate"><span class="pre">~/.ethereum/plugins</span></code>. Geth will need to be started with with a <code class="docutils literal notranslate"><span class="pre">--http.api+debug</span></code> flag.</p>
|
|
<p>From a terminal pass the following argument to the api:</p>
|
|
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>curl <span class="m">127</span>.0.0.1:8545 -H <span class="s2">"Content-Type: application/json"</span> --data <span class="s1">'{"jsonrpc":"2.0","method":"debug_traceCall","params":[{"to":"0x32Be343B94f860124dC4fEe278FDCBD38C102D88"},"latest",{"tracer":"myTracer"}],"id":0}'</span>
|
|
</pre></div>
|
|
</div>
|
|
<div class="admonition note">
|
|
<p class="admonition-title">Note</p>
|
|
<p>The address used above is a test adress and will need to
|
|
be replaced by whatever address you wish to access. Also <code class="docutils literal notranslate"><span class="pre">traceCall</span></code> is one of several methods available for use.</p>
|
|
</div>
|
|
<p>If using the template above, the call should return:</p>
|
|
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span><span class="o">{</span><span class="s2">"jsonrpc"</span>:<span class="s2">"2.0"</span>,<span class="s2">"id"</span>:0,<span class="s2">"result"</span>:<span class="s2">"hello world"</span><span class="o">}</span>
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
</div>
|
|
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
|
|
<a href="subscription.html" class="btn btn-neutral float-left" title="Subscription" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
|
|
<a href="system_req.html" class="btn btn-neutral float-right" title="System Requirements" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
|
|
</div>
|
|
|
|
<hr/>
|
|
|
|
<div role="contentinfo">
|
|
<p>© Copyright 2021, Philip Morlier.</p>
|
|
</div>
|
|
|
|
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
|
|
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
|
|
provided by <a href="https://readthedocs.org">Read the Docs</a>.
|
|
|
|
|
|
</footer>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
<script>
|
|
jQuery(function () {
|
|
SphinxRtdTheme.Navigation.enable(true);
|
|
});
|
|
</script>
|
|
|
|
</body>
|
|
</html> |