<?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://nivek-ph.github.com/blockchain-notes/blog</id>
    <title>Blockchain Notes Blog</title>
    <updated>2024-01-20T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://nivek-ph.github.com/blockchain-notes/blog"/>
    <subtitle>Blockchain Notes Blog</subtitle>
    <icon>https://nivek-ph.github.com/blockchain-notes/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[钱包和地址生成]]></title>
        <id>https://nivek-ph.github.com/blockchain-notes/blog/2024/01/20/ethereum-account</id>
        <link href="https://nivek-ph.github.com/blockchain-notes/blog/2024/01/20/ethereum-account"/>
        <updated>2024-01-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[生成私钥]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorWithStickyNavbar_mBj7" id="生成私钥">生成私钥<a href="https://nivek-ph.github.com/blockchain-notes/blog/2024/01/20/ethereum-account#%E7%94%9F%E6%88%90%E7%A7%81%E9%92%A5" class="hash-link" aria-label="生成私钥的直接链接" title="生成私钥的直接链接">​</a></h2>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x codeBlockLinesWithNumbering_zMUa" style="counter-reset:line-count 0"><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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"> ethers </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">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'ethers'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// https://docs.ethers.org/v5/api/signer/#Wallet</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><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)">main</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> wallet </span><span class="token operator">=</span><span class="token plain"> ethers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Wallet</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">createRandom</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	</span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'address     : '</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">await</span><span class="token plain"> wallet</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">getAddress</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	</span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'public	 key : '</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> wallet</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">publicKey</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	</span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'compressed  : '</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> ethers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">utils</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">computePublicKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">wallet</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">publicKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</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 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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	</span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'private key : '</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> wallet</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">privateKey</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">main</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)">catch</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">error</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="私钥生成地址">私钥生成地址<a href="https://nivek-ph.github.com/blockchain-notes/blog/2024/01/20/ethereum-account#%E7%A7%81%E9%92%A5%E7%94%9F%E6%88%90%E5%9C%B0%E5%9D%80" class="hash-link" aria-label="私钥生成地址的直接链接" title="私钥生成地址的直接链接">​</a></h2>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x codeBlockLinesWithNumbering_zMUa" style="counter-reset:line-count 0"><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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"> privateToAddress</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> privateToPublic</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> isValidPrivate</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> publicToAddress</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> toChecksumAddress </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">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'ethereumjs-util'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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"> ec </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">as</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">EC</span><span class="token plain"> </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">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'elliptic'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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 string" style="color:rgb(255, 121, 198)">'dotenv/config'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> ec </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name constant" style="color:rgb(189, 147, 249)">EC</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'secp256k1'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">PRIVATE_KEY</span><span class="token plain"> </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"> process</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">env</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> privateKey </span><span class="token operator">=</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">from</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token constant" style="color:rgb(189, 147, 249)">PRIVATE_KEY</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 string" style="color:rgb(255, 121, 198)">'hex'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> publicKey </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">privateToPublic</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">privateKey</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> address </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">privateToAddress</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">privateKey</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'isValidPrivate      : '</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)">isValidPrivate</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">privateKey</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'public key          : '</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> publicKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">toString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'hex'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'private to address  : '</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 function" style="color:rgb(80, 250, 123)">toString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'hex'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'public to address   : '</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)">publicToAddress</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">publicKey</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)">toString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'hex'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'BIP55 address       : '</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)">toChecksumAddress</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">publicToAddress</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">publicKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</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 punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">toString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'hex'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> pair </span><span class="token operator">=</span><span class="token plain"> ec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">keyFromPrivate</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">privateKey</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> compact </span><span class="token operator">=</span><span class="token plain"> pair</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">getPublic</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token boolean">true</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)">'hex'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> decompose </span><span class="token operator">=</span><span class="token plain"> pair</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">getPublic</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token boolean">false</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)">'hex'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> decomposeBuf </span><span class="token operator">=</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">from</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">decompose</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)">'hex'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> addr </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">publicToAddress</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">decomposeBuf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</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 punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">toString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'hex'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'compact             : '</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> compact</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'decompose           : '</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> decompose</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'address             : '</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> addr</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'bip55 address       : '</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)">toChecksumAddress</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">addr</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><br></span></code></pre></div></div>]]></content>
        <author>
            <name>nivek-phx</name>
        </author>
        <category label="ethereum" term="ethereum"/>
        <category label="account" term="account"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[比特币交易构建与签名 - 完整实践指南]]></title>
        <id>https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-building</id>
        <link href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-building"/>
        <updated>2024-01-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[比特币交易的构建和签名是区块链开发中的核心技能。本文将详细介绍如何使用比特币工具包构建各种类型的比特币交易，包括输入选择、输出创建、签名和广播。]]></summary>
        <content type="html"><![CDATA[<p>比特币交易的构建和签名是区块链开发中的核心技能。本文将详细介绍如何使用比特币工具包构建各种类型的比特币交易，包括输入选择、输出创建、签名和广播。</p>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="交易构建基础">交易构建基础<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-building#%E4%BA%A4%E6%98%93%E6%9E%84%E5%BB%BA%E5%9F%BA%E7%A1%80" class="hash-link" aria-label="交易构建基础的直接链接" title="交易构建基础的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="1-环境设置">1. 环境设置<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-building#1-%E7%8E%AF%E5%A2%83%E8%AE%BE%E7%BD%AE" class="hash-link" aria-label="1. 环境设置的直接链接" title="1. 环境设置的直接链接">​</a></h3>
<p>首先需要安装我们的比特币工具包：</p>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x codeBlockLinesWithNumbering_zMUa" style="counter-reset:line-count 0"><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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"> bech32 </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">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'bech32'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> base58 </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'bs58'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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"> sha256x2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> sha256</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> ripemd160 </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">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'../utils/crypto'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">export</span><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)">toBech32Address</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubkey</span><span class="token operator">:</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pubKeyHash </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0x00</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// pubKeyHash: Witness version. 0x00 for P2WPKH</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hash256 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sha256</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubkey</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hash160 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ripemd160</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hash256</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> words </span><span class="token operator">=</span><span class="token plain"> bech32</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">toWords</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hash160</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  words</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">unshift</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubKeyHash</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> bech32</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">encode</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'bc'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> words</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch04_keys.adoc</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// pubKeyHash: Version byte. 0x00 for Mainnet P2PKH, 0x6f for Testnet, etc.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">export</span><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)">toBase58Address</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubkey</span><span class="token operator">:</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pubKeyHash </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0x00</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hash256 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sha256</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubkey</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hash160 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ripemd160</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hash256</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// version + payload</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> payload </span><span class="token operator">=</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">allocUnsafe</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">21</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  payload</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">writeUInt8</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubKeyHash</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  hash160</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">copy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">payload</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// checksum, first 4 buffer</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> checksum </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sha256x2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">payload</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)">slice</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">4</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Buffer.concat([payload, checksum], payload.length + 4);</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> buffer </span><span class="token operator">=</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">allocUnsafe</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">25</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  payload</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">copy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">buffer</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  checksum</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">copy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">21</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// version + payload + checksum(first 4 bytes)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> base58</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">encode</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">buffer</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="2-密钥管理">2. 密钥管理<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-building#2-%E5%AF%86%E9%92%A5%E7%AE%A1%E7%90%86" class="hash-link" aria-label="2. 密钥管理的直接链接" title="2. 密钥管理的直接链接">​</a></h3>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x codeBlockLinesWithNumbering_zMUa" style="counter-reset:line-count 0"><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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"> bech32 </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">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'bech32'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> base58 </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'bs58'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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"> sha256x2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> sha256</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> ripemd160 </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">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'../utils/crypto'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">export</span><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)">toBech32Address</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubkey</span><span class="token operator">:</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pubKeyHash </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0x00</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// pubKeyHash: Witness version. 0x00 for P2WPKH</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hash256 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sha256</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubkey</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hash160 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ripemd160</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hash256</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> words </span><span class="token operator">=</span><span class="token plain"> bech32</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">toWords</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hash160</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  words</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">unshift</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubKeyHash</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> bech32</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">encode</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'bc'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> words</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch04_keys.adoc</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// pubKeyHash: Version byte. 0x00 for Mainnet P2PKH, 0x6f for Testnet, etc.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">export</span><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)">toBase58Address</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubkey</span><span class="token operator">:</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pubKeyHash </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0x00</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hash256 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sha256</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubkey</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hash160 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ripemd160</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hash256</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// version + payload</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> payload </span><span class="token operator">=</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">allocUnsafe</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">21</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  payload</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">writeUInt8</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubKeyHash</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  hash160</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">copy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">payload</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// checksum, first 4 buffer</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> checksum </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sha256x2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">payload</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)">slice</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">4</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Buffer.concat([payload, checksum], payload.length + 4);</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> buffer </span><span class="token operator">=</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">allocUnsafe</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">25</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  payload</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">copy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">buffer</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  checksum</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">copy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">21</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// version + payload + checksum(first 4 bytes)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> base58</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">encode</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">buffer</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="psbt-交易构建">PSBT 交易构建<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-building#psbt-%E4%BA%A4%E6%98%93%E6%9E%84%E5%BB%BA" class="hash-link" aria-label="PSBT 交易构建的直接链接" title="PSBT 交易构建的直接链接">​</a></h2>
<p>PSBT (Partially Signed Bitcoin Transaction) 是现代比特币交易的标准格式。</p>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x codeBlockLinesWithNumbering_zMUa" style="counter-reset:line-count 0"><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">require</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'dotenv'</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)">config</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> ECPair</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> networks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> payments </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 keyword" style="color:rgb(189, 147, 249);font-style:italic">require</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'bitcoinjs-lib'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> network </span><span class="token operator">=</span><span class="token plain"> networks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">testnet</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> secret </span><span class="token operator">=</span><span class="token plain"> process</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">env</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">ECDSA_SECRET</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> signer </span><span class="token operator">=</span><span class="token plain"> ECPair</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">fromPrivateKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">from</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">secret</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)">'hex'</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"> network</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> pubkey </span><span class="token operator">=</span><span class="token plain"> signer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">publicKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </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"> </span><span class="token operator">=</span><span class="token plain"> payments</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">p2pkh</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"> pubkey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> network </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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'pubkey  : '</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pubkey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">toString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'hex'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'address : '</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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/transactions.spec.ts</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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)">createPsbtTx</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> psbt </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Psbt</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"> network </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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">setVersion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</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><span class="token comment" style="color:rgb(98, 114, 164)">// These are defaults. This line is not needed.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">setLocktime</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">addInput</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		hash</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'3b948165cfb707320ccdc9582b5acc7cdad213bc81b7edb37546e1334d802b38'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		index</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		sequence</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">0xffffffff</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)">// These are defaults. This line is not needed.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		</span><span class="token comment" style="color:rgb(98, 114, 164)">// tx raw data</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		nonWitnessUtxo</span><span class="token operator">:</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">from</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'0100000001b2533a7e2329b92b576309969ef39e987f1ce62d76d1a3e714e1f73b830f7404010000006b483045022100e950df33415553a6cdd9665d4d6d3f03568ad0e2feb429efe19f4fc78da66714022059e3ffdf36d300a9352b971f8c48180ec0cef2325f61948488480430bc24d1ed012102ff26c5980685ae12d25312a8df8224c951a68272013425ffa60327d7d4b54231ffffffff0210270000000000001976a914dc6c3c43e5d2c934602095103d3cbf84ddc797f288ace71a0100000000001976a914dc6c3c43e5d2c934602095103d3cbf84ddc797f288ac00000000'</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)">'hex'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">addOutput</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		address</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'n1cScasu6XVoDki38WYAJH4ZJGRAfG8XRN'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		value</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">9800</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">signInput</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> signer</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">finalizeAllInputs</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> serialized </span><span class="token operator">=</span><span class="token plain"> psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">extractTransaction</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)">toHex</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	</span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'serialized : '</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> serialized</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">createPsbtTx</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><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="不同类型的交易构建">不同类型的交易构建<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-building#%E4%B8%8D%E5%90%8C%E7%B1%BB%E5%9E%8B%E7%9A%84%E4%BA%A4%E6%98%93%E6%9E%84%E5%BB%BA" class="hash-link" aria-label="不同类型的交易构建的直接链接" title="不同类型的交易构建的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="1-地址生成">1. 地址生成<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-building#1-%E5%9C%B0%E5%9D%80%E7%94%9F%E6%88%90" class="hash-link" aria-label="1. 地址生成的直接链接" title="1. 地址生成的直接链接">​</a></h3>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x codeBlockLinesWithNumbering_zMUa" style="counter-reset:line-count 0"><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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"> bech32 </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">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'bech32'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> base58 </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'bs58'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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"> sha256x2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> sha256</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> ripemd160 </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">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'../utils/crypto'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">export</span><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)">toBech32Address</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubkey</span><span class="token operator">:</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pubKeyHash </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0x00</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// pubKeyHash: Witness version. 0x00 for P2WPKH</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hash256 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sha256</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubkey</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hash160 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ripemd160</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hash256</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> words </span><span class="token operator">=</span><span class="token plain"> bech32</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">toWords</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hash160</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  words</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">unshift</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubKeyHash</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> bech32</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">encode</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'bc'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> words</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch04_keys.adoc</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// pubKeyHash: Version byte. 0x00 for Mainnet P2PKH, 0x6f for Testnet, etc.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">export</span><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)">toBase58Address</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubkey</span><span class="token operator">:</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pubKeyHash </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0x00</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hash256 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sha256</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubkey</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hash160 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ripemd160</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hash256</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// version + payload</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> payload </span><span class="token operator">=</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">allocUnsafe</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">21</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  payload</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">writeUInt8</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubKeyHash</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  hash160</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">copy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">payload</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// checksum, first 4 buffer</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> checksum </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sha256x2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">payload</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)">slice</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">4</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Buffer.concat([payload, checksum], payload.length + 4);</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> buffer </span><span class="token operator">=</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">allocUnsafe</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">25</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  payload</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">copy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">buffer</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  checksum</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">copy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">21</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// version + payload + checksum(first 4 bytes)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> base58</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">encode</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">buffer</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="2-多签名交易">2. 多签名交易<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-building#2-%E5%A4%9A%E7%AD%BE%E5%90%8D%E4%BA%A4%E6%98%93" class="hash-link" aria-label="2. 多签名交易的直接链接" title="2. 多签名交易的直接链接">​</a></h3>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x codeBlockLinesWithNumbering_zMUa" style="counter-reset:line-count 0"><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> bitgoV1 </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@bitgo/utxo-lib'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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"> payments </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">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'bitcoinjs-lib'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> pubKeys </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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token string" style="color:rgb(255, 121, 198)">'02f4147da97162a214dbe25828ee4c4acc4dc721cd0c15b2761b43ed0292ed82b5'</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)">// 2 -3</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token string" style="color:rgb(255, 121, 198)">'0377155e520059d3b85c6afc5c617b7eb519afadd0360f1ef03aff3f7e3f5438dd'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token string" style="color:rgb(255, 121, 198)">'02f44bce3eecd274e7aa24ec975388d12905dfc670a99b16e1d968e6ab5f69b266'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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 function" style="color:rgb(80, 250, 123)">map</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">function</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hex</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">from</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hex</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)">'hex'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> threshold </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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> network </span><span class="token operator">=</span><span class="token plain"> bitgoV1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">networks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">testnet</span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> redeemScript </span><span class="token operator">=</span><span class="token plain"> bitgoV1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">multisig</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">output</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">encode</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">threshold</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pubKeys</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)">// 2 of 3</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> scriptPubKey </span><span class="token operator">=</span><span class="token plain"> bitgoV1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">scriptHash</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">output</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">encode</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">bitgoV1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</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)">hash160</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">redeemScript</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> address </span><span class="token operator">=</span><span class="token plain"> bitgoV1</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 function" style="color:rgb(80, 250, 123)">fromOutputScript</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">scriptPubKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> network</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'bitgo address  : '</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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">//</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> </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"> </span><span class="token operator">=</span><span class="token plain"> payments</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">p2sh</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  redeem</span><span class="token operator">:</span><span class="token plain"> payments</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">p2ms</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"> m</span><span class="token operator">:</span><span class="token plain"> threshold</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pubkeys</span><span class="token operator">:</span><span class="token plain"> pubKeys</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> network </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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  network</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'bitcoin address: '</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 punctuation" style="color:rgb(248, 248, 242)">;</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="交易签名">交易签名<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-building#%E4%BA%A4%E6%98%93%E7%AD%BE%E5%90%8D" class="hash-link" aria-label="交易签名的直接链接" title="交易签名的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="1-单签名">1. 单签名<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-building#1-%E5%8D%95%E7%AD%BE%E5%90%8D" class="hash-link" aria-label="1. 单签名的直接链接" title="1. 单签名的直接链接">​</a></h3>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x codeBlockLinesWithNumbering_zMUa" style="counter-reset:line-count 0"><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">require</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'dotenv'</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)">config</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> ECPair</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> networks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> payments </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 keyword" style="color:rgb(189, 147, 249);font-style:italic">require</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'bitcoinjs-lib'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> network </span><span class="token operator">=</span><span class="token plain"> networks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">testnet</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> secret </span><span class="token operator">=</span><span class="token plain"> process</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">env</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">ECDSA_SECRET</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> signer </span><span class="token operator">=</span><span class="token plain"> ECPair</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">fromPrivateKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">from</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">secret</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)">'hex'</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"> network</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> pubkey </span><span class="token operator">=</span><span class="token plain"> signer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">publicKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </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"> </span><span class="token operator">=</span><span class="token plain"> payments</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">p2pkh</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"> pubkey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> network </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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'pubkey  : '</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pubkey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">toString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'hex'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'address : '</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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/transactions.spec.ts</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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)">createPsbtTx</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> psbt </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Psbt</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"> network </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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">setVersion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</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><span class="token comment" style="color:rgb(98, 114, 164)">// These are defaults. This line is not needed.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">setLocktime</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">addInput</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		hash</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'3b948165cfb707320ccdc9582b5acc7cdad213bc81b7edb37546e1334d802b38'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		index</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		sequence</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">0xffffffff</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)">// These are defaults. This line is not needed.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		</span><span class="token comment" style="color:rgb(98, 114, 164)">// tx raw data</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		nonWitnessUtxo</span><span class="token operator">:</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">from</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'0100000001b2533a7e2329b92b576309969ef39e987f1ce62d76d1a3e714e1f73b830f7404010000006b483045022100e950df33415553a6cdd9665d4d6d3f03568ad0e2feb429efe19f4fc78da66714022059e3ffdf36d300a9352b971f8c48180ec0cef2325f61948488480430bc24d1ed012102ff26c5980685ae12d25312a8df8224c951a68272013425ffa60327d7d4b54231ffffffff0210270000000000001976a914dc6c3c43e5d2c934602095103d3cbf84ddc797f288ace71a0100000000001976a914dc6c3c43e5d2c934602095103d3cbf84ddc797f288ac00000000'</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)">'hex'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">addOutput</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		address</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'n1cScasu6XVoDki38WYAJH4ZJGRAfG8XRN'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		value</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">9800</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">signInput</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> signer</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">finalizeAllInputs</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> serialized </span><span class="token operator">=</span><span class="token plain"> psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">extractTransaction</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)">toHex</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	</span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'serialized : '</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> serialized</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">createPsbtTx</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><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="2-多签名">2. 多签名<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-building#2-%E5%A4%9A%E7%AD%BE%E5%90%8D" class="hash-link" aria-label="2. 多签名的直接链接" title="2. 多签名的直接链接">​</a></h3>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x codeBlockLinesWithNumbering_zMUa" style="counter-reset:line-count 0"><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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)">createPsbtTx</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> psbt </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Psbt</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"> network </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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">setVersion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</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><span class="token comment" style="color:rgb(98, 114, 164)">// These are defaults. This line is not needed.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">setLocktime</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">addInput</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		hash</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'3b948165cfb707320ccdc9582b5acc7cdad213bc81b7edb37546e1334d802b38'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		index</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		sequence</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">0xffffffff</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)">// These are defaults. This line is not needed.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		</span><span class="token comment" style="color:rgb(98, 114, 164)">// tx raw data</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		nonWitnessUtxo</span><span class="token operator">:</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">from</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'0100000001b2533a7e2329b92b576309969ef39e987f1ce62d76d1a3e714e1f73b830f7404010000006b483045022100e950df33415553a6cdd9665d4d6d3f03568ad0e2feb429efe19f4fc78da66714022059e3ffdf36d300a9352b971f8c48180ec0cef2325f61948488480430bc24d1ed012102ff26c5980685ae12d25312a8df8224c951a68272013425ffa60327d7d4b54231ffffffff0210270000000000001976a914dc6c3c43e5d2c934602095103d3cbf84ddc797f288ace71a0100000000001976a914dc6c3c43e5d2c934602095103d3cbf84ddc797f288ac00000000'</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)">'hex'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">addOutput</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		address</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'n1cScasu6XVoDki38WYAJH4ZJGRAfG8XRN'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">		value</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">9800</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">signInput</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> signer</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">finalizeAllInputs</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> serialized </span><span class="token operator">=</span><span class="token plain"> psbt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">extractTransaction</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)">toHex</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">	</span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'serialized : '</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> serialized</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">createPsbtTx</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><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="rbf-replace-by-fee-交易">RBF (Replace-By-Fee) 交易<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-building#rbf-replace-by-fee-%E4%BA%A4%E6%98%93" class="hash-link" aria-label="RBF (Replace-By-Fee) 交易的直接链接" title="RBF (Replace-By-Fee) 交易的直接链接">​</a></h2>
<p>RBF 允许用更高手续费的交易替换未确认的交易。</p>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x codeBlockLinesWithNumbering_zMUa" style="counter-reset:line-count 0"><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">require</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'dotenv'</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)">config</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> PrivateKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Networks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Transaction </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 keyword" style="color:rgb(189, 147, 249);font-style:italic">require</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'bitcore-lib'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> secret </span><span class="token operator">=</span><span class="token plain"> process</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">env</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">ECDSA_SECRET</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> privkey </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">PrivateKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">secret</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Networks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">testnet</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'address    : '</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> privkey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">toAddress</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)">toString</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> utxo </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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  txid</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'5ab958a2a62d2e905128fbe0faebc998a92abf365aaa8db3f319c280dda32bc1'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  outputIndex</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  address</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'n1cScasu6XVoDki38WYAJH4ZJGRAfG8XRN'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  script</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'76a914dc6c3c43e5d2c934602095103d3cbf84ddc797f288ac'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  satoshis</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">10000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> tx </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Transaction</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">tx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">from</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">utxo</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">tx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">to</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'mnv5WqA2nw1L5SHepFFVNYZMeHUC9WCfRU'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">8000</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">tx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">change</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'mnv5WqA2nw1L5SHepFFVNYZMeHUC9WCfRU'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">tx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">fee</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">300</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">tx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">enableRBF</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">tx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">sign</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">privkey</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> bl </span><span class="token operator">=</span><span class="token plain"> tx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">isRBF</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'bl'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> bl</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> serialized </span><span class="token operator">=</span><span class="token plain"> tx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">serialize</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'serialized'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> serialized</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> newTx </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Transaction</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">newTx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">isRBF</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">newTx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">from</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">utxo</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">newTx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">to</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'n1cScasu6XVoDki38WYAJH4ZJGRAfG8XRN'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">7000</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">newTx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">change</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'n1cScasu6XVoDki38WYAJH4ZJGRAfG8XRN'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">newTx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">fee</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">1800</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">newTx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">enableRBF</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">newTx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">sign</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">privkey</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> newSerialized </span><span class="token operator">=</span><span class="token plain"> newTx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">serialize</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'new serialized : '</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> newSerialized</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="交易验证">交易验证<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-building#%E4%BA%A4%E6%98%93%E9%AA%8C%E8%AF%81" class="hash-link" aria-label="交易验证的直接链接" title="交易验证的直接链接">​</a></h2>
<pre tabindex="0" class="codeBlockStandalone_AMJj thin-scrollbar language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><code class="codeBlockLines_LE8x"></code></pre>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="交易广播">交易广播<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-building#%E4%BA%A4%E6%98%93%E5%B9%BF%E6%92%AD" class="hash-link" aria-label="交易广播的直接链接" title="交易广播的直接链接">​</a></h2>
<p>交易广播通常通过比特币节点或第三方 API 服务进行。你可以使用以下方式之一：</p>
<ol>
<li><strong>本地比特币节点</strong>: 使用 <code>bitcoin-cli sendrawtransaction</code></li>
<li><strong>第三方 API</strong>: 如 Blockstream、BlockCypher 等</li>
<li><strong>测试网</strong>: 使用测试网 API 进行开发和测试</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="完整交易流程示例">完整交易流程示例<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-building#%E5%AE%8C%E6%95%B4%E4%BA%A4%E6%98%93%E6%B5%81%E7%A8%8B%E7%A4%BA%E4%BE%8B" class="hash-link" aria-label="完整交易流程示例的直接链接" title="完整交易流程示例的直接链接">​</a></h2>
<pre tabindex="0" class="codeBlockStandalone_AMJj thin-scrollbar language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><code class="codeBlockLines_LE8x"></code></pre>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="安全最佳实践">安全最佳实践<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-building#%E5%AE%89%E5%85%A8%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5" class="hash-link" aria-label="安全最佳实践的直接链接" title="安全最佳实践的直接链接">​</a></h2>
<ol>
<li><strong>私钥安全</strong>: 永远不要在代码中硬编码私钥</li>
<li><strong>网络选择</strong>: 开发时使用测试网，生产时使用主网</li>
<li><strong>手续费计算</strong>: 动态计算手续费以确保交易被确认</li>
<li><strong>输入验证</strong>: 始终验证 UTXO 的有效性和所有权</li>
<li><strong>错误处理</strong>: 实现完善的错误处理和回滚机制</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="总结">总结<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-building#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接">​</a></h2>
<p>比特币交易构建是一个复杂但重要的过程。通过掌握 PSBT、各种交易类型和签名机制，开发者可以：</p>
<ul>
<li>构建安全的比特币应用</li>
<li>实现复杂的交易逻辑</li>
<li>支持多种地址格式</li>
<li>优化交易费用和确认时间</li>
</ul>
<p>在下一篇文章中，我们将探讨比特币工具函数和实用技巧。</p>]]></content>
        <author>
            <name>nivek-phx</name>
        </author>
        <category label="bitcoin" term="bitcoin"/>
        <category label="transaction" term="transaction"/>
        <category label="psbt" term="psbt"/>
        <category label="signature" term="signature"/>
        <category label="bitcoinjs-lib" term="bitcoinjs-lib"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[比特币交易类型分类详解 - 识别与分析]]></title>
        <id>https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-classification</id>
        <link href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-classification"/>
        <updated>2024-01-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[比特币网络支持多种交易类型，每种类型都有其特定的脚本模式和用途。本文将详细介绍如何识别和分类不同的比特币交易类型，这对于理解交易结构和开发相关应用至关重要。]]></summary>
        <content type="html"><![CDATA[<p>比特币网络支持多种交易类型，每种类型都有其特定的脚本模式和用途。本文将详细介绍如何识别和分类不同的比特币交易类型，这对于理解交易结构和开发相关应用至关重要。</p>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="比特币交易类型概述">比特币交易类型概述<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-classification#%E6%AF%94%E7%89%B9%E5%B8%81%E4%BA%A4%E6%98%93%E7%B1%BB%E5%9E%8B%E6%A6%82%E8%BF%B0" class="hash-link" aria-label="比特币交易类型概述的直接链接" title="比特币交易类型概述的直接链接">​</a></h2>
<p>比特币支持以下主要交易类型：</p>
<ol>
<li><strong>P2PKH (Pay-to-Public-Key-Hash)</strong> - 最传统的交易类型</li>
<li><strong>P2SH (Pay-to-Script-Hash)</strong> - 脚本哈希支付</li>
<li><strong>P2WPKH (Pay-to-Witness-Public-Key-Hash)</strong> - 原生 SegWit</li>
<li><strong>P2WSH (Pay-to-Witness-Script-Hash)</strong> - 见证脚本哈希</li>
<li><strong>P2PK (Pay-to-Public-Key)</strong> - 直接支付给公钥</li>
<li><strong>Multisig</strong> - 多签名交易</li>
<li><strong>Null Data</strong> - 数据存储交易</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="核心分类函数">核心分类函数<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-classification#%E6%A0%B8%E5%BF%83%E5%88%86%E7%B1%BB%E5%87%BD%E6%95%B0" class="hash-link" aria-label="核心分类函数的直接链接" title="核心分类函数的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="1-p2pkh-交易识别">1. P2PKH 交易识别<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-classification#1-p2pkh-%E4%BA%A4%E6%98%93%E8%AF%86%E5%88%AB" class="hash-link" aria-label="1. P2PKH 交易识别的直接链接" title="1. P2PKH 交易识别的直接链接">​</a></h3>
<p>P2PKH 是最常见的交易类型，使用公钥哈希作为锁定条件：</p>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x codeBlockLinesWithNumbering_zMUa" style="counter-reset:line-count 0"><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// https://en.bitcoinwiki.org/wiki/Pay-to-Pubkey</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">export</span><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)">p2pk</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">script</span><span class="token operator">:</span><span class="token plain"> Buffer</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> chunks </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">decompile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">script</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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 punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    chunks</span><span class="token operator">?.</span><span class="token plain">length </span><span class="token operator">===</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">//</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">isCanonicalPubKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">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><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">//</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</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 constant" style="color:rgb(189, 147, 249)">OPS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">OP_CHECKSIG</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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><br></span></code></pre></div></div>
<p><strong>P2PKH 脚本结构：</strong></p>
<div class="language-text codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-text codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span class="token-line" style="color:#F8F8F2"><span class="token plain">OP_DUP OP_HASH160 &lt;20-byte-hash&gt; OP_EQUALVERIFY OP_CHECKSIG</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="2-p2sh-交易识别">2. P2SH 交易识别<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-classification#2-p2sh-%E4%BA%A4%E6%98%93%E8%AF%86%E5%88%AB" class="hash-link" aria-label="2. P2SH 交易识别的直接链接" title="2. P2SH 交易识别的直接链接">​</a></h3>
<p>P2SH 允许支付给脚本哈希，支持更复杂的脚本：</p>
<div class="language-javascript codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-javascript codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span 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)">p2sh</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">typeforce</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">typeforce</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access maybe-class-name">Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> buffer </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">compile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">length</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token number">23</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">//</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</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 constant" style="color:rgb(189, 147, 249)">OPS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">OP_HASH160</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// hash160</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</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 number">0x14</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// length is 22</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">22</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 constant" style="color:rgb(189, 147, 249)">OPS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">OP_EQUAL</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// equal</span><span class="token plain"></span><br></span><span 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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p><strong>P2SH 脚本结构：</strong></p>
<div class="language-text codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-text codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span class="token-line" style="color:#F8F8F2"><span class="token plain">OP_HASH160 &lt;20-byte-hash&gt; OP_EQUAL</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="3-p2wpkh-交易识别">3. P2WPKH 交易识别<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-classification#3-p2wpkh-%E4%BA%A4%E6%98%93%E8%AF%86%E5%88%AB" class="hash-link" aria-label="3. P2WPKH 交易识别的直接链接" title="3. P2WPKH 交易识别的直接链接">​</a></h3>
<p>原生 SegWit 交易，使用见证公钥哈希：</p>
<div class="language-javascript codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-javascript codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span 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)">p2wpkh</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">typeforce</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">typeforce</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access maybe-class-name">Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> buffer </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">compile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">length</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token number">22</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">//</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</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 constant" style="color:rgb(189, 147, 249)">OPS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">OP_0</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// OP_0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</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 number">0x14</span><span class="token plain"></span><br></span><span 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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p><strong>P2WPKH 脚本结构：</strong></p>
<div class="language-text codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-text codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span class="token-line" style="color:#F8F8F2"><span class="token plain">OP_0 &lt;20-byte-hash&gt;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="4-p2wsh-交易识别">4. P2WSH 交易识别<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-classification#4-p2wsh-%E4%BA%A4%E6%98%93%E8%AF%86%E5%88%AB" class="hash-link" aria-label="4. P2WSH 交易识别的直接链接" title="4. P2WSH 交易识别的直接链接">​</a></h3>
<p>见证脚本哈希交易，支持复杂的见证脚本：</p>
<div class="language-javascript codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-javascript codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span 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)">p2wsh</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">typeforce</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">typeforce</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access maybe-class-name">Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> buffer </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">compile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">length</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token number">34</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">//</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</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 constant" style="color:rgb(189, 147, 249)">OPS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">OP_0</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// OP_0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</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 number">0x20</span><span class="token plain"></span><br></span><span 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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p><strong>P2WSH 脚本结构：</strong></p>
<div class="language-text codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-text codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span class="token-line" style="color:#F8F8F2"><span class="token plain">OP_0 &lt;32-byte-hash&gt;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="5-p2pk-交易识别">5. P2PK 交易识别<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-classification#5-p2pk-%E4%BA%A4%E6%98%93%E8%AF%86%E5%88%AB" class="hash-link" aria-label="5. P2PK 交易识别的直接链接" title="5. P2PK 交易识别的直接链接">​</a></h3>
<p>直接支付给公钥的交易类型：</p>
<div class="language-javascript codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-javascript codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span 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)">p2pk</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> chunks </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">decompile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">length</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">//</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">isCanonicalPubKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">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><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">//</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</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 constant" style="color:rgb(189, 147, 249)">OPS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">OP_CHECKSIG</span><span class="token plain"></span><br></span><span 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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p><strong>P2PK 脚本结构：</strong></p>
<div class="language-text codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-text codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span class="token-line" style="color:#F8F8F2"><span class="token plain">&lt;pubkey&gt; OP_CHECKSIG</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="6-多签名交易识别">6. 多签名交易识别<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-classification#6-%E5%A4%9A%E7%AD%BE%E5%90%8D%E4%BA%A4%E6%98%93%E8%AF%86%E5%88%AB" class="hash-link" aria-label="6. 多签名交易识别的直接链接" title="6. 多签名交易识别的直接链接">​</a></h3>
<p>多签名交易允许多个私钥共同控制资金：</p>
<div class="language-javascript codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-javascript codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span 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)">multisig</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> chunks </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">decompile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> length </span><span class="token operator">=</span><span class="token plain"> chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" 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">length </span><span class="token operator">&lt;</span><span class="token plain"> </span><span class="token number">4</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" 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">chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">length </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 constant" style="color:rgb(189, 147, 249)">OPS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">OP_CHECKMULTISIG</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" 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">typeforce</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token known-class-name class-name">Number</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">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 punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" 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">typeforce</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token known-class-name class-name">Number</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">length </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 punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> m </span><span class="token operator">=</span><span class="token plain"> chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</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 constant" style="color:rgb(189, 147, 249)">OP_INT_BASE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> n </span><span class="token operator">=</span><span class="token plain"> chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">length </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><span class="token operator">-</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">OP_INT_BASE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" 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">m </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><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" 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">&gt;</span><span class="token plain"> </span><span class="token number">16</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" 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">m </span><span class="token operator">&gt;</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 keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// m {pubkey}...{pubkey} n OP_CHECKMULTISIG - (m + n + OP_CHECKMULTISIG)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" 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"> length </span><span class="token operator">-</span><span class="token plain"> </span><span class="token number">3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// pub keys</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> keys </span><span class="token operator">=</span><span class="token plain"> chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">slice</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</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 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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> keys</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">every</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">isCanonicalPubKey</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p><strong>多签名脚本结构：</strong></p>
<div class="language-text codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-text codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span class="token-line" style="color:#F8F8F2"><span class="token plain">&lt;m&gt; &lt;pubkey1&gt; &lt;pubkey2&gt; ... &lt;pubkeyN&gt; &lt;n&gt; OP_CHECKMULTISIG</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="7-见证承诺交易识别">7. 见证承诺交易识别<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-classification#7-%E8%A7%81%E8%AF%81%E6%89%BF%E8%AF%BA%E4%BA%A4%E6%98%93%E8%AF%86%E5%88%AB" class="hash-link" aria-label="7. 见证承诺交易识别的直接链接" title="7. 见证承诺交易识别的直接链接">​</a></h3>
<p>用于 SegWit 的见证承诺交易：</p>
<div class="language-javascript codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-javascript codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span 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)">witness_commitment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">typeforce</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">typeforce</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access maybe-class-name">Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> buffer </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">compile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">length</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token number">25</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">//</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</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 constant" style="color:rgb(189, 147, 249)">OPS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">OP_RETURN</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</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 number">0x24</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">//  Push the following 36 bytes (0x24)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">slice</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">6</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 method function property-access" style="color:rgb(80, 250, 123)">equals</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token maybe-class-name">Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'0x6a24aa21a9ed'</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)">'hex'</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></span><span 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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="交易类型分类器">交易类型分类器<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-classification#%E4%BA%A4%E6%98%93%E7%B1%BB%E5%9E%8B%E5%88%86%E7%B1%BB%E5%99%A8" class="hash-link" aria-label="交易类型分类器的直接链接" title="交易类型分类器的直接链接">​</a></h2>
<p>创建一个综合的分类函数来识别所有交易类型：</p>
<div class="language-javascript codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-javascript codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span 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)">classifyTransaction</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" 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 function" style="color:rgb(80, 250, 123)">p2pkh</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">script</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 keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> types</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">P2PKH</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" 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 function" style="color:rgb(80, 250, 123)">p2sh</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">script</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 keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> types</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">P2SH</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" 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 function" style="color:rgb(80, 250, 123)">p2wpkh</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">script</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 keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> types</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">P2WPKH</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" 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 function" style="color:rgb(80, 250, 123)">p2wsh</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">script</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 keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> types</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">P2WSH</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" 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 function" style="color:rgb(80, 250, 123)">p2pk</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">script</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 keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> types</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">P2PK</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" 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 function" style="color:rgb(80, 250, 123)">multisig</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">script</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 keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> types</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">P2MS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" 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 function" style="color:rgb(80, 250, 123)">witness_commitment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">script</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 keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> types</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">WITNESS_COMMITMENT</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> types</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">NONSTANDARD</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="实际应用示例">实际应用示例<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-classification#%E5%AE%9E%E9%99%85%E5%BA%94%E7%94%A8%E7%A4%BA%E4%BE%8B" class="hash-link" aria-label="实际应用示例的直接链接" title="实际应用示例的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="分析交易输出">分析交易输出<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-classification#%E5%88%86%E6%9E%90%E4%BA%A4%E6%98%93%E8%BE%93%E5%87%BA" class="hash-link" aria-label="分析交易输出的直接链接" title="分析交易输出的直接链接">​</a></h3>
<div class="language-javascript codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-javascript codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// 分析一个交易输出的脚本类型</span><span class="token plain"></span><br></span><span 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)">analyzeTransactionOutput</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">scriptHex</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> script </span><span class="token operator">=</span><span class="token plain"> </span><span class="token maybe-class-name">Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">scriptHex</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)">'hex'</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> type </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">classifyTransaction</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Script Type:'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> type</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Script ASM:'</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)">toASM</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token literal-property property">asm</span><span class="token operator">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">toASM</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token literal-property property">isValid</span><span class="token operator">:</span><span class="token plain"> type </span><span class="token operator">!==</span><span class="token plain"> types</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">NONSTANDARD</span><span class="token plain"></span><br></span><span 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></span><span 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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// 使用示例</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> p2pkhScript </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'76a914a002b6b9a3c3190ca8d9c7262ac6bdd7d4359d4a88ac'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> result </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">analyzeTransactionOutput</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">p2pkhScript</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token console class-name">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">result</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="批量交易分析">批量交易分析<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-classification#%E6%89%B9%E9%87%8F%E4%BA%A4%E6%98%93%E5%88%86%E6%9E%90" class="hash-link" aria-label="批量交易分析的直接链接" title="批量交易分析的直接链接">​</a></h3>
<div class="language-javascript codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-javascript codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span 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)">batchAnalyzeTransactions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">transactions</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> transactions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">map</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">tx</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> outputs </span><span class="token operator">=</span><span class="token plain"> tx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">outputs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">map</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">output</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</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"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token spread operator">...</span><span class="token plain">output</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token literal-property property">scriptType</span><span class="token operator">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">classifyTransaction</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">output</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token literal-property property">scriptASM</span><span class="token operator">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">toASM</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">output</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span 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 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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token literal-property property">txid</span><span class="token operator">:</span><span class="token plain"> tx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">txid</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      outputs</span><br></span><span 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></span><span 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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="交易类型统计">交易类型统计<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-classification#%E4%BA%A4%E6%98%93%E7%B1%BB%E5%9E%8B%E7%BB%9F%E8%AE%A1" class="hash-link" aria-label="交易类型统计的直接链接" title="交易类型统计的直接链接">​</a></h2>
<div class="language-javascript codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-javascript codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span 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)">getTransactionTypeStats</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">transactions</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> stats </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 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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  transactions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">forEach</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">tx</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    tx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">outputs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">forEach</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">output</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> type </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">classifyTransaction</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">output</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      stats</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">type</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 punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">stats</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">type</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><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></span><span 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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span 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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> stats</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="安全考虑">安全考虑<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-classification#%E5%AE%89%E5%85%A8%E8%80%83%E8%99%91" class="hash-link" aria-label="安全考虑的直接链接" title="安全考虑的直接链接">​</a></h2>
<ol>
<li><strong>脚本验证</strong>: 始终验证脚本的完整性和有效性</li>
<li><strong>类型检查</strong>: 确保交易类型与预期用途匹配</li>
<li><strong>版本兼容</strong>: 考虑不同比特币版本的脚本支持</li>
<li><strong>错误处理</strong>: 妥善处理无法识别的脚本类型</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="性能优化">性能优化<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-classification#%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96" class="hash-link" aria-label="性能优化的直接链接" title="性能优化的直接链接">​</a></h2>
<div class="language-javascript codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-javascript codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// 缓存编译结果以提高性能</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> scriptCache </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Map</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span 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)">classifyTransactionCached</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> scriptHex </span><span class="token operator">=</span><span class="token plain"> script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">toString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'hex'</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" 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">scriptCache</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">has</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">scriptHex</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> scriptCache</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">get</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">scriptHex</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></span><span 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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> type </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">classifyTransaction</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">script</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  scriptCache</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">set</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">scriptHex</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> type</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="总结">总结<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-transaction-classification#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接">​</a></h2>
<p>比特币交易类型分类是理解区块链数据的基础。通过掌握各种交易类型的识别方法，开发者可以：</p>
<ul>
<li>分析交易模式和趋势</li>
<li>构建智能的区块链浏览器</li>
<li>实现准确的交易验证</li>
<li>开发支持多种交易类型的钱包</li>
</ul>
<p>在下一篇文章中，我们将探讨比特币交易的构建和签名过程。</p>]]></content>
        <author>
            <name>nivek-phx</name>
        </author>
        <category label="bitcoin" term="bitcoin"/>
        <category label="transaction" term="transaction"/>
        <category label="P2PKH" term="P2PKH"/>
        <category label="P2SH" term="P2SH"/>
        <category label="SegWit" term="SegWit"/>
        <category label="multisig" term="multisig"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[比特币地址生成与验证 - 完整指南]]></title>
        <id>https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-address-generation</id>
        <link href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-address-generation"/>
        <updated>2024-01-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[比特币地址是比特币网络中的关键组件，它们代表公钥的哈希值，用于接收比特币。本文将详细介绍比特币地址的生成过程，包括传统的 Base58 地址和现代的 Bech32 地址。]]></summary>
        <content type="html"><![CDATA[<p>比特币地址是比特币网络中的关键组件，它们代表公钥的哈希值，用于接收比特币。本文将详细介绍比特币地址的生成过程，包括传统的 Base58 地址和现代的 Bech32 地址。</p>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="比特币地址类型">比特币地址类型<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-address-generation#%E6%AF%94%E7%89%B9%E5%B8%81%E5%9C%B0%E5%9D%80%E7%B1%BB%E5%9E%8B" class="hash-link" aria-label="比特币地址类型的直接链接" title="比特币地址类型的直接链接">​</a></h2>
<p>比特币支持多种地址格式：</p>
<ol>
<li><strong>Legacy 地址 (P2PKH)</strong> - 以 "1" 开头的 Base58 地址</li>
<li><strong>P2SH 地址</strong> - 以 "3" 开头的 Base58 地址</li>
<li><strong>Native SegWit 地址 (P2WPKH)</strong> - 以 "bc1" 开头的 Bech32 地址</li>
<li><strong>Taproot 地址 (P2TR)</strong> - 以 "bc1p" 开头的 Bech32m 地址</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="地址生成核心算法">地址生成核心算法<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-address-generation#%E5%9C%B0%E5%9D%80%E7%94%9F%E6%88%90%E6%A0%B8%E5%BF%83%E7%AE%97%E6%B3%95" class="hash-link" aria-label="地址生成核心算法的直接链接" title="地址生成核心算法的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="1-公钥哈希计算">1. 公钥哈希计算<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-address-generation#1-%E5%85%AC%E9%92%A5%E5%93%88%E5%B8%8C%E8%AE%A1%E7%AE%97" class="hash-link" aria-label="1. 公钥哈希计算的直接链接" title="1. 公钥哈希计算的直接链接">​</a></h3>
<p>所有比特币地址都基于公钥的哈希值生成：</p>
<div class="language-javascript codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-javascript codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> sha256x2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> sha256</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> ripemd160 </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)">require</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'../utils/crypto'</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// 计算公钥哈希的标准流程</span><span class="token plain"></span><br></span><span 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)">calculatePubKeyHash</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">pubkey</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hash256 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sha256</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubkey</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)">// SHA256</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hash160 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ripemd160</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hash256</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)">// RIPEMD160</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> hash160</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="2-base58-地址生成">2. Base58 地址生成<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-address-generation#2-base58-%E5%9C%B0%E5%9D%80%E7%94%9F%E6%88%90" class="hash-link" aria-label="2. Base58 地址生成的直接链接" title="2. Base58 地址生成的直接链接">​</a></h3>
<p>传统的 Base58 地址生成过程：</p>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x codeBlockLinesWithNumbering_zMUa" style="counter-reset:line-count 0"><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token comment" style="color:rgb(98, 114, 164)">// https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch04_keys.adoc</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// pubKeyHash: Version byte. 0x00 for Mainnet P2PKH, 0x6f for Testnet, etc.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">export</span><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)">toBase58Address</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubkey</span><span class="token operator">:</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pubKeyHash </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0x00</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hash256 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sha256</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubkey</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hash160 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ripemd160</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hash256</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// version + payload</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> payload </span><span class="token operator">=</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">allocUnsafe</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">21</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  payload</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">writeUInt8</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubKeyHash</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  hash160</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">copy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">payload</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// checksum, first 4 buffer</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> checksum </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sha256x2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">payload</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)">slice</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">4</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Buffer.concat([payload, checksum], payload.length + 4);</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> buffer </span><span class="token operator">=</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">allocUnsafe</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">25</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  payload</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">copy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">buffer</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  checksum</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">copy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">21</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// version + payload + checksum(first 4 bytes)</span></span><br></span></code></pre></div></div>
<p><strong>详细步骤说明：</strong></p>
<ol>
<li><strong>版本字节</strong>: 添加网络标识符（主网为 0x00，测试网为 0x6f）</li>
<li><strong>公钥哈希</strong>: 将 RIPEMD160(SHA256(公钥)) 添加到版本字节后</li>
<li><strong>校验和</strong>: 计算双重 SHA256 哈希的前 4 字节作为校验和</li>
<li><strong>Base58 编码</strong>: 将整个 25 字节数据编码为 Base58 字符串</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="3-bech32-地址生成">3. Bech32 地址生成<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-address-generation#3-bech32-%E5%9C%B0%E5%9D%80%E7%94%9F%E6%88%90" class="hash-link" aria-label="3. Bech32 地址生成的直接链接" title="3. Bech32 地址生成的直接链接">​</a></h3>
<p>现代的 Bech32 地址（SegWit）生成过程：</p>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x codeBlockLinesWithNumbering_zMUa" style="counter-reset:line-count 0"><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">export</span><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)">toBech32Address</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubkey</span><span class="token operator">:</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pubKeyHash </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0x00</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// pubKeyHash: Witness version. 0x00 for P2WPKH</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hash256 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sha256</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubkey</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hash160 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ripemd160</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hash256</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> words </span><span class="token operator">=</span><span class="token plain"> bech32</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">toWords</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hash160</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  words</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">unshift</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubKeyHash</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> bech32</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">encode</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'bc'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> words</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="地址验证">地址验证<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-address-generation#%E5%9C%B0%E5%9D%80%E9%AA%8C%E8%AF%81" class="hash-link" aria-label="地址验证的直接链接" title="地址验证的直接链接">​</a></h3>
<div class="language-javascript codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-javascript codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span 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)">validateBase58Address</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">address</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> decoded </span><span class="token operator">=</span><span class="token plain"> base58</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">decode</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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" 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">decoded</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">length</span><span class="token plain"> </span><span class="token operator">!==</span><span class="token plain"> </span><span class="token number">25</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> version </span><span class="token operator">=</span><span class="token plain"> decoded</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> payload </span><span class="token operator">=</span><span class="token plain"> decoded</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">slice</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">21</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> checksum </span><span class="token operator">=</span><span class="token plain"> decoded</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">slice</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">21</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> calculatedChecksum </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sha256x2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">payload</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 method function property-access" style="color:rgb(80, 250, 123)">slice</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">4</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> checksum</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">equals</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">calculatedChecksum</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></span><span 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><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">error</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span 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></span><span 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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span 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)">validateBech32Address</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">address</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> decoded </span><span class="token operator">=</span><span class="token plain"> bech32</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">decode</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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> decoded</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">prefix</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'bc'</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> decoded</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">words</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">length</span><span class="token plain"> </span><span class="token operator">&gt;</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></span><span 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><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">error</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span 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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="多签名地址">多签名地址<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-address-generation#%E5%A4%9A%E7%AD%BE%E5%90%8D%E5%9C%B0%E5%9D%80" class="hash-link" aria-label="多签名地址的直接链接" title="多签名地址的直接链接">​</a></h2>
<p>多签名地址允许多个私钥共同控制资金：</p>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x codeBlockLinesWithNumbering_zMUa" style="counter-reset:line-count 0"><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> bitgoV1 </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@bitgo/utxo-lib'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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"> payments </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">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'bitcoinjs-lib'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> pubKeys </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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token string" style="color:rgb(255, 121, 198)">'02f4147da97162a214dbe25828ee4c4acc4dc721cd0c15b2761b43ed0292ed82b5'</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)">// 2 -3</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token string" style="color:rgb(255, 121, 198)">'0377155e520059d3b85c6afc5c617b7eb519afadd0360f1ef03aff3f7e3f5438dd'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token string" style="color:rgb(255, 121, 198)">'02f44bce3eecd274e7aa24ec975388d12905dfc670a99b16e1d968e6ab5f69b266'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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 function" style="color:rgb(80, 250, 123)">map</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">function</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hex</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">from</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hex</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)">'hex'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> threshold </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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> network </span><span class="token operator">=</span><span class="token plain"> bitgoV1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">networks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">testnet</span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> redeemScript </span><span class="token operator">=</span><span class="token plain"> bitgoV1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">multisig</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">output</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">encode</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">threshold</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pubKeys</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)">// 2 of 3</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> scriptPubKey </span><span class="token operator">=</span><span class="token plain"> bitgoV1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">scriptHash</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">output</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">encode</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">bitgoV1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</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)">hash160</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">redeemScript</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> address </span><span class="token operator">=</span><span class="token plain"> bitgoV1</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 function" style="color:rgb(80, 250, 123)">fromOutputScript</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">scriptPubKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> network</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'bitgo address  : '</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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">//</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> </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"> </span><span class="token operator">=</span><span class="token plain"> payments</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">p2sh</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  redeem</span><span class="token operator">:</span><span class="token plain"> payments</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">p2ms</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"> m</span><span class="token operator">:</span><span class="token plain"> threshold</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pubkeys</span><span class="token operator">:</span><span class="token plain"> pubKeys</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> network </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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  network</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'bitcoin address: '</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 punctuation" style="color:rgb(248, 248, 242)">;</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="网络标识符">网络标识符<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-address-generation#%E7%BD%91%E7%BB%9C%E6%A0%87%E8%AF%86%E7%AC%A6" class="hash-link" aria-label="网络标识符的直接链接" title="网络标识符的直接链接">​</a></h2>
<p>不同网络使用不同的版本字节：</p>
<table><thead><tr><th>网络</th><th>Legacy</th><th>P2SH</th><th>Bech32</th></tr></thead><tbody><tr><td>主网</td><td>0x00</td><td>0x05</td><td>bc1</td></tr><tr><td>测试网</td><td>0x6f</td><td>0xc4</td><td>tb1</td></tr><tr><td>回归测试</td><td>0x6f</td><td>0xc4</td><td>bcrt1</td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="安全考虑">安全考虑<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-address-generation#%E5%AE%89%E5%85%A8%E8%80%83%E8%99%91" class="hash-link" aria-label="安全考虑的直接链接" title="安全考虑的直接链接">​</a></h2>
<ol>
<li><strong>私钥安全</strong>: 永远不要暴露私钥</li>
<li><strong>地址重用</strong>: 避免重复使用地址以保护隐私</li>
<li><strong>网络验证</strong>: 确保在正确的网络上生成地址</li>
<li><strong>校验和验证</strong>: 始终验证地址的校验和</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="总结">总结<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-address-generation#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接">​</a></h2>
<p>比特币地址生成是一个多步骤的过程，涉及密码学哈希函数、校验和计算和编码转换。理解这个过程对于：</p>
<ul>
<li>开发比特币钱包应用</li>
<li>验证交易地址的有效性</li>
<li>实现安全的密钥管理</li>
<li>支持多种地址格式</li>
</ul>
<p>在下一篇文章中，我们将探讨比特币交易类型的分类和识别。</p>]]></content>
        <author>
            <name>nivek-phx</name>
        </author>
        <category label="bitcoin" term="bitcoin"/>
        <category label="address" term="address"/>
        <category label="bech32" term="bech32"/>
        <category label="base58" term="base58"/>
        <category label="cryptography" term="cryptography"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[比特币脚本系统详解 - 从理论到实践]]></title>
        <id>https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-script-system</id>
        <link href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-script-system"/>
        <updated>2024-01-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[比特币脚本系统是比特币网络的核心组件之一，它定义了如何验证交易的有效性。本文将深入探讨比特币脚本的工作原理，并通过实际代码示例来展示如何操作脚本。]]></summary>
        <content type="html"><![CDATA[<p>比特币脚本系统是比特币网络的核心组件之一，它定义了如何验证交易的有效性。本文将深入探讨比特币脚本的工作原理，并通过实际代码示例来展示如何操作脚本。</p>
<p>以下代码参考 bitcoinjs-lib 的实现, 并进行了一些修改. 请参考 <a href="https://github.com/bitcoinjs/bitcoinjs-lib" target="_blank" rel="noopener noreferrer">bitcoinjs-lib</a> 了解更多信息.</p>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="什么是比特币脚本">什么是比特币脚本？<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-script-system#%E4%BB%80%E4%B9%88%E6%98%AF%E6%AF%94%E7%89%B9%E5%B8%81%E8%84%9A%E6%9C%AC" class="hash-link" aria-label="什么是比特币脚本？的直接链接" title="什么是比特币脚本？的直接链接">​</a></h2>
<p>比特币脚本是一种基于栈的编程语言，用于定义比特币交易的解锁和锁定条件。每个比特币交易都包含输入脚本（scriptSig）和输出脚本（scriptPubKey），通过执行这些脚本来验证交易的有效性。</p>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="核心功能模块">核心功能模块<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-script-system#%E6%A0%B8%E5%BF%83%E5%8A%9F%E8%83%BD%E6%A8%A1%E5%9D%97" class="hash-link" aria-label="核心功能模块的直接链接" title="核心功能模块的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="1-脚本编译-compile">1. 脚本编译 (compile)<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-script-system#1-%E8%84%9A%E6%9C%AC%E7%BC%96%E8%AF%91-compile" class="hash-link" aria-label="1. 脚本编译 (compile)的直接链接" title="1. 脚本编译 (compile)的直接链接">​</a></h3>
<p>脚本编译是将脚本块（chunks）转换为字节码的过程：</p>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x codeBlockLinesWithNumbering_zMUa" style="counter-reset:line-count 0"><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">export</span><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)">compile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">chunks</span><span class="token operator">:</span><span class="token plain"> Uint8Array</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 operator">:</span><span class="token plain"> Buffer </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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">Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">isBuffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">chunks</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 keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">typeforce</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">typeforce</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token builtin" style="color:rgb(189, 147, 249)">Array</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> chunks</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> bufferSize </span><span class="token operator">=</span><span class="token plain"> chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">reduce</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">accum</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> chunk</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"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// data chunk</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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">Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">isBuffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">chunk</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      </span><span class="token comment" style="color:rgb(98, 114, 164)">// adhere to BIP62.3, minimal push policy</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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">chunk</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">length </span><span class="token operator">===</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">asMinimalOP</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">chunk</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 keyword" style="color:rgb(189, 147, 249);font-style:italic">undefined</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> accum </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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> accum </span><span class="token operator">+</span><span class="token plain"> pushdata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">encodingLength</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">chunk</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><span class="token operator">+</span><span class="token plain"> chunk</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// opcode</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> accum </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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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><span class="token number">0.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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> buffer </span><span class="token operator">=</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">allocUnsafe</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">bufferSize</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">let</span><span class="token plain"> offset </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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">forEach</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">chunk</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"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// data chunk</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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">Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">isBuffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">chunk</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      </span><span class="token comment" style="color:rgb(98, 114, 164)">// adhere to BIP62.3, minimal push policy</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> opcode </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">asMinimalOP</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">chunk</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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">opcode </span><span class="token operator">!==</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">undefined</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">        buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">writeUInt8</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">opcode</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> offset</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">        offset </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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      offset </span><span class="token operator">+=</span><span class="token plain"> pushdata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">encode</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> chunk</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"> offset</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      chunk</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">copy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> offset</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      offset </span><span class="token operator">+=</span><span class="token plain"> chunk</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      </span><span class="token comment" style="color:rgb(98, 114, 164)">// opcode</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    </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">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">writeUInt8</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">chunk</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> offset</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      offset </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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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">offset </span><span class="token operator">!==</span><span class="token plain"> buffer</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><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">throw</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Could not decode chunks'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="2-脚本反编译-decompile">2. 脚本反编译 (decompile)<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-script-system#2-%E8%84%9A%E6%9C%AC%E5%8F%8D%E7%BC%96%E8%AF%91-decompile" class="hash-link" aria-label="2. 脚本反编译 (decompile)的直接链接" title="2. 脚本反编译 (decompile)的直接链接">​</a></h3>
<p>反编译是将字节码转换回脚本块的过程：</p>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x codeBlockLinesWithNumbering_zMUa" style="counter-reset:line-count 0"><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">export</span><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)">decompile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">buffer</span><span class="token operator">:</span><span class="token plain"> Buffer</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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">typeforce</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Array</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">buffer</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 keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">typeforce</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">typeforce</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> buffer</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> chunks </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 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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">let</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"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">while</span><span class="token plain"> </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"> buffer</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><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> opcode </span><span class="token operator">=</span><span class="token plain"> buffer</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// data chunk</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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">opcode </span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">OPS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">OP_0</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> opcode </span><span class="token operator">&lt;=</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">OPS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">OP_PUSHDATA4</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> d </span><span class="token operator">=</span><span class="token plain"> pushdata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">decode</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">buffer</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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">d </span><span class="token operator">===</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">null</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">return</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      i </span><span class="token operator">+=</span><span class="token plain"> d</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">size</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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">i </span><span class="token operator">+</span><span class="token plain"> d</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token builtin" style="color:rgb(189, 147, 249)">number</span><span class="token plain"> </span><span class="token operator">&gt;</span><span class="token plain"> buffer</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><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> data </span><span class="token operator">=</span><span class="token plain"> buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">slice</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"> i </span><span class="token operator">+</span><span class="token plain"> d</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token builtin" style="color:rgb(189, 147, 249)">number</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      i </span><span class="token operator">+=</span><span class="token plain"> d</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token builtin" style="color:rgb(189, 147, 249)">number</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> op </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">asMinimalOP</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">data</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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">op </span><span class="token operator">!==</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">undefined</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">        chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">push</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">op</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      </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">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">        chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">push</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">data</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    </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">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">push</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">opcode</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="3-asm-格式转换">3. ASM 格式转换<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-script-system#3-asm-%E6%A0%BC%E5%BC%8F%E8%BD%AC%E6%8D%A2" class="hash-link" aria-label="3. ASM 格式转换的直接链接" title="3. ASM 格式转换的直接链接">​</a></h3>
<p>比特币脚本支持人类可读的 ASM（Assembly）格式：</p>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x codeBlockLinesWithNumbering_zMUa" style="counter-reset:line-count 0"><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">export</span><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)">fromASM</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">asm</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> separator </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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">typeforce</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">typeforce</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">String</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> asm</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> chunks </span><span class="token operator">=</span><span class="token plain"> asm</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">split</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">separator</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)">map</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">str</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"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// opcode</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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 constant" style="color:rgb(189, 147, 249)">OPS</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"> </span><span class="token operator">!==</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">undefined</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">return</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">OPS</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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">typeforce</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">typeforce</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Hex</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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">from</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"> </span><span class="token string" style="color:rgb(255, 121, 198)">'hex'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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)">compile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">chunks</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">export</span><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)">toASM</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">chunks</span><span class="token operator">:</span><span class="token plain"> Uint8Array</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> separator </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 punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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">Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">isBuffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">chunks</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    chunks </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">decompile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">chunks</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> chunks</span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">map</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">chunk</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"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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">Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">isBuffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">chunk</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> op </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">asMinimalOP</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">chunk</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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">op </span><span class="token operator">===</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">undefined</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">return</span><span class="token plain"> chunk</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">toString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'hex'</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">        chunk </span><span class="token operator">=</span><span class="token plain"> op</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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 constant" style="color:rgb(189, 147, 249)">REVERSE_OPS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">chunk</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">join</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">separator</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><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain" style="display:inline-block"></span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="实际应用示例">实际应用示例<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-script-system#%E5%AE%9E%E9%99%85%E5%BA%94%E7%94%A8%E7%A4%BA%E4%BE%8B" class="hash-link" aria-label="实际应用示例的直接链接" title="实际应用示例的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="创建-p2pkh-脚本">创建 P2PKH 脚本<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-script-system#%E5%88%9B%E5%BB%BA-p2pkh-%E8%84%9A%E6%9C%AC" class="hash-link" aria-label="创建 P2PKH 脚本的直接链接" title="创建 P2PKH 脚本的直接链接">​</a></h3>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// 创建一个标准的 P2PKH 脚本</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> pubkeyHash </span><span class="token operator">=</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">from</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'1234567890abcdef1234567890abcdef12345678'</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)">'hex'</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> p2pkhScript </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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token constant" style="color:rgb(189, 147, 249)">OPS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">OP_DUP</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token constant" style="color:rgb(189, 147, 249)">OPS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">OP_HASH160</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  pubkeyHash</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token constant" style="color:rgb(189, 147, 249)">OPS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">OP_EQUALVERIFY</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token constant" style="color:rgb(189, 147, 249)">OPS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">OP_CHECKSIG</span><span class="token plain"></span><br></span><span 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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> compiledScript </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">compile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">p2pkhScript</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Compiled script:'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> compiledScript</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">toString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'hex'</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><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_mBj7" id="验证公钥格式">验证公钥格式<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-script-system#%E9%AA%8C%E8%AF%81%E5%85%AC%E9%92%A5%E6%A0%BC%E5%BC%8F" class="hash-link" aria-label="验证公钥格式的直接链接" title="验证公钥格式的直接链接">​</a></h3>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> pubkey </span><span class="token operator">=</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">from</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'02...'</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)">'hex'</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></span><span 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 function" style="color:rgb(80, 250, 123)">isCanonicalPubKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pubkey</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Valid canonical public key'</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></span><span 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><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token builtin" style="color:rgb(189, 147, 249)">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Invalid public key format'</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></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="最小推送策略-bip623">最小推送策略 (BIP62.3)<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-script-system#%E6%9C%80%E5%B0%8F%E6%8E%A8%E9%80%81%E7%AD%96%E7%95%A5-bip623" class="hash-link" aria-label="最小推送策略 (BIP62.3)的直接链接" title="最小推送策略 (BIP62.3)的直接链接">​</a></h2>
<p>比特币脚本遵循最小推送策略，确保数据以最紧凑的方式表示：</p>
<div class="language-ts codeBlockContainer_gkB7 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_Qcvs"><pre tabindex="0" class="prism-code language-ts codeBlock_Yig3 thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_LE8x codeBlockLinesWithNumbering_zMUa" style="counter-reset:line-count 0"><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">export</span><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)">asMinimalOP</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">buffer</span><span class="token operator">:</span><span class="token plain"> Uint8Array</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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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">buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">length </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><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">OPS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">OP_0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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">buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">length </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 keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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">buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</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"> </span><span class="token number">1</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">&lt;=</span><span class="token plain"> </span><span class="token number">16</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">return</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">OP_INT_BASE</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">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></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><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">buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</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">0x81</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">return</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">OPS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">OP_1NEGATE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_hTuR" style="color:#F8F8F2"><span class="codeLineNumber_BxlR"></span><span class="codeLineContent_tVD_"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_mBj7" id="总结">总结<a href="https://nivek-ph.github.com/blockchain-notes/blog/bitcoin-script-system#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接">​</a></h2>
<p>比特币脚本系统提供了强大的灵活性来定义各种交易条件。通过理解脚本的编译、反编译和 ASM 格式转换，开发者可以：</p>
<ol>
<li>创建自定义的交易类型</li>
<li>验证交易脚本的有效性</li>
<li>调试和优化脚本性能</li>
<li>实现复杂的智能合约逻辑</li>
</ol>
<p>在下一篇文章中，我们将探讨比特币地址的生成和验证机制。</p>]]></content>
        <author>
            <name>nivek-phx</name>
        </author>
        <category label="bitcoin" term="bitcoin"/>
        <category label="script" term="script"/>
        <category label="blockchain" term="blockchain"/>
        <category label="development" term="development"/>
    </entry>
</feed>