<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>BSD</title>
        <link>https://paragraph.com/@bsd</link>
        <description>tg @ananpaa</description>
        <lastBuildDate>Sat, 02 May 2026 07:59:43 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>BSD</title>
            <url>https://storage.googleapis.com/papyrus_images/cd4c28e1c10921b4de1b82f54f971c29964efb61aa9af2bd3a41250cfc1c0970.jpg</url>
            <link>https://paragraph.com/@bsd</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[SUI交互之suins域名注册参数逆向分析及脚本验证（干货）]]></title>
            <link>https://paragraph.com/@bsd/sui-suins</link>
            <guid>trYuJhnYqeLrVKEDc9bL</guid>
            <pubDate>Mon, 28 Nov 2022 03:26:01 GMT</pubDate>
            <description><![CDATA[SUI交互之suins域名注册参数逆向分析及脚本验证 开发语言：go Discord交流: Link Twitter：@ananpt0项目主页：https://www.suins.io/手动测试分析：首先我们手动注册个域名，然后去Sui Explorer查看记录：需要2次transactionhttps://explorer.sui.io/第一次第一次调用了合约0xf6d55ad60e110c1faf2b54c1824df19481536fd5的 base_controller模块的make_commitment_and_commit函数，该函数我们看到有两个参数，第一个是个地址字符串，第二个是个整型数组。 我们继续分析这两个参数含义，点击base_controller去到合约详情页查看合约Bytecode,找到make_commitment_and_commit函数定义：entry public make_commitment_and_commit(Arg0: &mut BaseController, Arg1: vector, Arg2: &mut TxContext) 第一...]]></description>
            <content:encoded><![CDATA[<p>SUI交互之suins域名注册参数逆向分析及脚本验证</p><p>开发语言：go</p><p>Discord交流: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://discord.gg/q8QK4w3RtE">Link</a></p><p>Twitter：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/ananpt0">@ananpt0</a></p><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">项目主页：</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.suins.io/">https://www.suins.io/</a></p><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">手动测试分析：</h3><p>首先我们手动注册个域名，然后去Sui Explorer查看记录：</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/2aee8ccddf533fbf1d593f760a49d4073952772719680c4b3c6ee30cc85c2bdc.png" alt="需要2次transaction" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">需要2次transaction</figcaption></figure><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.sui.io/">https://explorer.sui.io/</a></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/60fe51ffecab738d699b9e4e35be090f17b1ad162a55019982c11f002e6ae19e.png" alt="第一次" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">第一次</figcaption></figure><p>第一次调用了合约0xf6d55ad60e110c1faf2b54c1824df19481536fd5的 base_controller模块的make_commitment_and_commit函数，该函数我们看到有两个参数，第一个是个地址字符串，第二个是个整型数组。</p><p>我们继续分析这两个参数含义，点击base_controller去到合约详情页查看合约Bytecode,找到make_commitment_and_commit函数定义：</p><blockquote><p>entry public make_commitment_and_commit(Arg0: &amp;mut BaseController, Arg1: vector, Arg2: &amp;mut TxContext)</p><p>第一个参数为BaseController的Object ID</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/31267712d77838dec90d917c142034b9b66ea1be2a02cc53835f6594e536e40c.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>第二个参数是个vector，暂时还不知道是怎么生成的，这个时候我们来调试下前端，看这个参数是怎么生成并传给钱包的。</p><p>在合约Bytecode中我们看下<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://cookbook.starcoin.org/zh/docs/move/move-vm/summary/">虚拟机字节码</a>，看到make_commitment有调用keccak256函数，我们去前端js里面搜索下看看，通过搜索我们发现在main.xxx.js中我们找到一个keccak_256调用：</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/e99362c46e3a75935b2890d1d04983eb9d00eb8312ea4c06c8ab8d17f37ed8f7.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>我们在这一行下断点，然后点击“Register name”按钮试试，成功断下，然后我们可以发现，keccack_256参数为一个Uint8Array,由申请域名字符串+钱包地址（去除0x后16进制数组）+15位字符串，此时15位字符串我们还不知道是怎么生成的，我们可以通过调用栈回溯来找到生成的地方：</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/73c8dce11e08c5074aaaa1919a2d2d1d0abeda3ef3a3ec3f0d47e1bc3f5d39d2.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>点击A下面那个匿名函数：</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/14acf54fb0528e5763c06b15ae5270a6b79adb9a01b36c7e55315d01bf5b035e.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>我们可以发现这个15位字符串是用过y.We.internet.password()生成的15位随机字符串。</p><p>所以第一个Transaction两个参数为：BaseController的Object ID，keccak256后的结果int数组。</p><p>接下来我们看看第二个Transaction:</p><p>第一步还是查看Sui Explorer记录,找到Bytecode中register函数</p><blockquote><pre data-type="codeBlock" text="entry public register(Arg0: &amp;mut BaseController, Arg1: &amp;mut BaseRegistrar, Arg2: &amp;mut Registry, Arg3: &amp;Configuration, Arg4: vector&lt;u8&gt;, Arg5: address, Arg6: u64, Arg7: vector&lt;u8&gt;, Arg8: Coin&lt;SUI&gt;, Arg9: &amp;mut TxContext)
"><code>entry <span class="hljs-keyword">public</span> register(Arg0: <span class="hljs-operator">&#x26;</span>mut BaseController, Arg1: <span class="hljs-operator">&#x26;</span>mut BaseRegistrar, Arg2: <span class="hljs-operator">&#x26;</span>mut Registry, Arg3: <span class="hljs-operator">&#x26;</span>Configuration, Arg4: vector<span class="hljs-operator">&#x3C;</span>u8<span class="hljs-operator">></span>, Arg5: <span class="hljs-keyword">address</span>, Arg6: u64, Arg7: vector<span class="hljs-operator">&#x3C;</span>u8<span class="hljs-operator">></span>, Arg8: Coin<span class="hljs-operator">&#x3C;</span>SUI<span class="hljs-operator">></span>, Arg9: <span class="hljs-operator">&#x26;</span>mut TxContext)
</code></pre></blockquote><p>可以看出前4个参数分别为BaseController，BaseRegistrar（sui、move后缀的地址不一样），Registry，Configuration地址，第5个参数为注册的域名去除后缀，第6个参数为注册钱包地址，第7个参数为注册期限（一年的为365），第8个参数为15位随机字符串（第一个Transaction生成的15位随机字符串），最后一个为SUI Coin地址。</p><p>到此基本上我们已经完成了参数定义的分析，最后我们用代码来测试看看：</p><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">代码实现：</h3><pre data-type="codeBlock" text="package main

import (
    &quot;encoding/hex&quot;
    &quot;errors&quot;
    &quot;fmt&quot;
    &quot;github.com/coming-chat/go-sui/account&quot;
    &quot;github.com/coming-chat/go-sui/client&quot;
    &quot;github.com/coming-chat/go-sui/types&quot;
    &quot;golang.org/x/crypto/sha3&quot;
    &quot;golang.org/x/net/context&quot;
    &quot;math/rand&quot;
    &quot;net/url&quot;
    &quot;time&quot;
)

const DevnetRpcUrl = &quot;https://fullnode.devnet.sui.io&quot;

var bytes []byte = []byte(&quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_&quot;)
var (//地址通过https://explorer.sui.io查找替换
    PackageID         = &quot;0xb43d7bd4394766de04ff82b8214aa8814de69a04&quot;
    BaseController    = &quot;0x50ac890157d0bfda1be5d2e2a0739e75a64281c7&quot;
    SUIBaseRegistrar  = &quot;0x4e2ce97c434f449785bbdce745d418c08d9f1a7f&quot;//sui后缀
    MoveBaseRegistrar = &quot;0xdcea9fe45615172f4d2c3c74a4ed76c565014fa&quot;//move后缀
    Registry          = &quot;0x79af4acd5d1d70fbb29b724b5060c67063cae83c&quot;
    Configuration     = &quot;0x1ea0f7ae66fb52e4b51dc89fe9b02e3767a9d15f&quot;
)

func init() {
    rand.Seed(time.Now().UnixNano())
}

func RandStr(n int) string {
    result := make([]byte, n)
    for i := 0; i &lt; n; i++ {
        result[i] = bytes[rand.Int31()%63]
    }
    return string(result)
}

func Hash(data ...[]byte) []int {
    hash := sha3.NewLegacyKeccak256()
    for _, d := range data {
        hash.Write(d)
    }
    hashBytes := hash.Sum(nil)
    intSlice := make([]int, len(hashBytes))
    for i, b := range hashBytes {
        intSlice[i] = int(b)
    }
    return intSlice
}

func MakeCommitment(domain, address, solt string) []int {
    tmp := make([]byte, 0)
    tmp = append(tmp, []byte(domain)...)
    addr, _ := hex.DecodeString(address)
    tmp = append(tmp, addr...)
    tmp = append(tmp, []byte(solt)...)
    return Hash(tmp)
}

func MakeCommitmentAndCommit(client *client.Client, ctx context.Context, signer types.Address, commitment []int, gas *types.ObjectId, gasBudget uint64) (*types.TransactionBytes, error) {
    packageId, _ := types.NewAddressFromHex(PackageID)
    args := []any{
        BaseController, commitment,
    }
    return client.MoveCall(ctx, signer, *packageId, &quot;base_controller&quot;, &quot;make_commitment_and_commit&quot;, args, gas, gasBudget)
}

func MakeCommit(mnemonic, domain string) (*types.Base64Data, string, error) {

    acc, _ := account.NewAccountWithMnemonic(mnemonic)
    signer, _ := types.NewAddressFromHex(acc.Address)
    addr := acc.Address[2:]//去除0x
    randStr := RandStr(15)
    hash := MakeCommitment(domain, addr, randStr)
    suiClient, err := client.Dial(DevnetRpcUrl)
    if err != nil {
        return nil, &quot;&quot;, err
    }
    gasBudget := uint64(100000)
    txnBytes, err := MakeCommitmentAndCommit(suiClient, context.Background(), *signer, hash, nil, gasBudget)
    if err != nil {
        return nil, &quot;&quot;, err
    }
    signedTxn := txnBytes.SignWith(acc.PrivateKey)
    txnResponse, err := suiClient.ExecuteTransaction(context.Background(), *signedTxn, types.TxnRequestTypeWaitForLocalExecution)
    if err != nil {
        return nil, &quot;&quot;, err
    }
    return txnResponse.EffectsCert.Effects.Effects.TransactionDigest, randStr, nil
}

func Register(client *client.Client, ctx context.Context, signer types.Address, register, domain, address string, day int, randStr string, coinID string, gas *types.ObjectId, gasBudget uint64) (*types.TransactionBytes, error) {
    packageId, _ := types.NewAddressFromHex(PackageID)
    args := []any{
        BaseController, register, Registry, Configuration, domain, address, day, randStr, coinID,
    }
    return client.MoveCall(ctx, signer, *packageId, &quot;base_controller&quot;, &quot;register&quot;, args, gas, gasBudget)
}

func DoRegister(mnemonic, domain, suffix, randStr string) (*types.Base64Data, error) {

    acc, _ := account.NewAccountWithMnemonic(mnemonic)
    signer, _ := types.NewAddressFromHex(acc.Address)

    suiClient, err := client.Dial(DevnetRpcUrl)
    if err != nil {
        return nil, err
    }
    gasBudget := uint64(1000000)
    reg := &quot;&quot;
    if suffix == &quot;sui&quot; {
        reg = SUIBaseRegistrar
    } else if suffix == &quot;move&quot; {
        reg = MoveBaseRegistrar
    } else {
        return nil, errors.New(&quot;err suffix&quot;)
    }
    txnBytes, err := Register(suiClient, context.Background(), *signer, reg, domain, acc.Address, 365, randStr, &quot;COIN_OBJECT_ID&quot;, nil, gasBudget)//COIN_OBJECT_ID替换为你钱包中SUI Coin对象ID
    if err != nil {
        return nil, err
    }
    signedTxn := txnBytes.SignWith(acc.PrivateKey)
    txnResponse, err := suiClient.ExecuteTransaction(context.Background(), *signedTxn, types.TxnRequestTypeWaitForLocalExecution)
    if err != nil {
        return nil, err
    }
    return txnResponse.EffectsCert.Effects.Effects.TransactionDigest, nil
}

func main() {
    domain := &quot;&quot;//你要注册的域名名称
    suffix := &quot;sui&quot;//sui或者move后缀
    fmt.Printf(&quot;[+][suins]注册域名：%s.%s\n&quot;, domain, suffix)
    mnemonic := &quot;&quot;//钱包助记词
    if tid, randStr, err := MakeCommit(mnemonic, domain+&quot;.&quot;+suffix); err != nil {
        fmt.Println(&quot;[+]&quot;, err)
    } else {
        fmt.Printf(&quot;[+]make_commitment_and_commit done! Check https://explorer.sui.io/transactions/%s\n&quot;, url.QueryEscape(tid.String()))
        if rid, err := DoRegister(mnemonic, domain, suffix, randStr); err != nil {
            fmt.Println(&quot;[+]&quot;, err)
        } else {
            fmt.Printf(&quot;[+]register done! Check https://explorer.sui.io/transactions/%s\n&quot;, url.QueryEscape(rid.String()))
        }
    }
}
"><code>package main

<span class="hljs-keyword">import</span> (
    <span class="hljs-string">"encoding/hex"</span>
    <span class="hljs-string">"errors"</span>
    <span class="hljs-string">"fmt"</span>
    <span class="hljs-string">"github.com/coming-chat/go-sui/account"</span>
    <span class="hljs-string">"github.com/coming-chat/go-sui/client"</span>
    <span class="hljs-string">"github.com/coming-chat/go-sui/types"</span>
    <span class="hljs-string">"golang.org/x/crypto/sha3"</span>
    <span class="hljs-string">"golang.org/x/net/context"</span>
    <span class="hljs-string">"math/rand"</span>
    <span class="hljs-string">"net/url"</span>
    <span class="hljs-string">"time"</span>
)

<span class="hljs-title">const</span> <span class="hljs-title">DevnetRpcUrl</span> <span class="hljs-operator">=</span> <span class="hljs-string">"https://fullnode.devnet.sui.io"</span>

<span class="hljs-title"><span class="hljs-keyword">var</span></span> <span class="hljs-title"><span class="hljs-keyword">bytes</span></span> []<span class="hljs-title"><span class="hljs-keyword">byte</span></span> <span class="hljs-operator">=</span> []<span class="hljs-title"><span class="hljs-keyword">byte</span></span>(<span class="hljs-string">"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_"</span>)
<span class="hljs-title"><span class="hljs-keyword">var</span></span> (<span class="hljs-comment">//地址通过https://explorer.sui.io查找替换</span>
    <span class="hljs-title">PackageID</span>         <span class="hljs-operator">=</span> <span class="hljs-string">"0xb43d7bd4394766de04ff82b8214aa8814de69a04"</span>
    <span class="hljs-title">BaseController</span>    <span class="hljs-operator">=</span> <span class="hljs-string">"0x50ac890157d0bfda1be5d2e2a0739e75a64281c7"</span>
    <span class="hljs-title">SUIBaseRegistrar</span>  <span class="hljs-operator">=</span> <span class="hljs-string">"0x4e2ce97c434f449785bbdce745d418c08d9f1a7f"</span><span class="hljs-comment">//sui后缀</span>
    <span class="hljs-title">MoveBaseRegistrar</span> <span class="hljs-operator">=</span> <span class="hljs-string">"0xdcea9fe45615172f4d2c3c74a4ed76c565014fa"</span><span class="hljs-comment">//move后缀</span>
    <span class="hljs-title">Registry</span>          <span class="hljs-operator">=</span> <span class="hljs-string">"0x79af4acd5d1d70fbb29b724b5060c67063cae83c"</span>
    <span class="hljs-title">Configuration</span>     <span class="hljs-operator">=</span> <span class="hljs-string">"0x1ea0f7ae66fb52e4b51dc89fe9b02e3767a9d15f"</span>
)

<span class="hljs-title">func</span> <span class="hljs-title">init</span>() {
    <span class="hljs-title">rand</span>.<span class="hljs-title">Seed</span>(<span class="hljs-title">time</span>.<span class="hljs-title">Now</span>().<span class="hljs-title">UnixNano</span>())
}

<span class="hljs-title">func</span> <span class="hljs-title">RandStr</span>(<span class="hljs-title">n</span> <span class="hljs-title"><span class="hljs-keyword">int</span></span>) <span class="hljs-title"><span class="hljs-keyword">string</span></span> {
    <span class="hljs-title">result</span> :<span class="hljs-operator">=</span> <span class="hljs-title">make</span>([]<span class="hljs-title"><span class="hljs-keyword">byte</span></span>, <span class="hljs-title">n</span>)
    <span class="hljs-title"><span class="hljs-keyword">for</span></span> <span class="hljs-title">i</span> :<span class="hljs-operator">=</span> 0; i <span class="hljs-operator">&#x3C;</span> n; i<span class="hljs-operator">+</span><span class="hljs-operator">+</span> {
        result[i] <span class="hljs-operator">=</span> <span class="hljs-keyword">bytes</span>[rand.Int31()<span class="hljs-operator">%</span><span class="hljs-number">63</span>]
    }
    <span class="hljs-keyword">return</span> <span class="hljs-keyword">string</span>(result)
}

func Hash(data ...[]<span class="hljs-keyword">byte</span>) []<span class="hljs-keyword">int</span> {
    hash :<span class="hljs-operator">=</span> <span class="hljs-built_in">sha3</span>.NewLegacyKeccak256()
    <span class="hljs-keyword">for</span> <span class="hljs-keyword">_</span>, d :<span class="hljs-operator">=</span> range data {
        hash.Write(d)
    }
    hashBytes :<span class="hljs-operator">=</span> hash.Sum(nil)
    intSlice :<span class="hljs-operator">=</span> make([]<span class="hljs-keyword">int</span>, len(hashBytes))
    <span class="hljs-keyword">for</span> i, b :<span class="hljs-operator">=</span> range hashBytes {
        intSlice[i] <span class="hljs-operator">=</span> <span class="hljs-keyword">int</span>(b)
    }
    <span class="hljs-keyword">return</span> intSlice
}

func MakeCommitment(domain, <span class="hljs-keyword">address</span>, solt <span class="hljs-keyword">string</span>) []<span class="hljs-keyword">int</span> {
    tmp :<span class="hljs-operator">=</span> make([]<span class="hljs-keyword">byte</span>, <span class="hljs-number">0</span>)
    tmp <span class="hljs-operator">=</span> append(tmp, []<span class="hljs-keyword">byte</span>(domain)...)
    addr, <span class="hljs-keyword">_</span> :<span class="hljs-operator">=</span> hex.DecodeString(<span class="hljs-keyword">address</span>)
    tmp <span class="hljs-operator">=</span> append(tmp, addr...)
    tmp <span class="hljs-operator">=</span> append(tmp, []<span class="hljs-keyword">byte</span>(solt)...)
    <span class="hljs-keyword">return</span> Hash(tmp)
}

func MakeCommitmentAndCommit(client <span class="hljs-operator">*</span>client.Client, ctx context.Context, signer types.Address, commitment []<span class="hljs-keyword">int</span>, gas <span class="hljs-operator">*</span>types.ObjectId, gasBudget <span class="hljs-keyword">uint64</span>) (<span class="hljs-operator">*</span>types.TransactionBytes, <span class="hljs-function"><span class="hljs-keyword">error</span>) </span>{
    packageId, <span class="hljs-keyword">_</span> :<span class="hljs-operator">=</span> types.NewAddressFromHex(PackageID)
    args :<span class="hljs-operator">=</span> []any{
        BaseController, commitment,
    }
    <span class="hljs-keyword">return</span> client.MoveCall(ctx, signer, <span class="hljs-operator">*</span>packageId, <span class="hljs-string">"base_controller"</span>, <span class="hljs-string">"make_commitment_and_commit"</span>, args, gas, gasBudget)
}

func MakeCommit(mnemonic, domain <span class="hljs-keyword">string</span>) (<span class="hljs-operator">*</span>types.Base64Data, <span class="hljs-keyword">string</span>, <span class="hljs-function"><span class="hljs-keyword">error</span>) </span>{

    acc, <span class="hljs-keyword">_</span> :<span class="hljs-operator">=</span> account.NewAccountWithMnemonic(mnemonic)
    signer, <span class="hljs-keyword">_</span> :<span class="hljs-operator">=</span> types.NewAddressFromHex(acc.Address)
    addr :<span class="hljs-operator">=</span> acc.Address[<span class="hljs-number">2</span>:]<span class="hljs-comment">//去除0x</span>
    randStr :<span class="hljs-operator">=</span> RandStr(<span class="hljs-number">15</span>)
    hash :<span class="hljs-operator">=</span> MakeCommitment(domain, addr, randStr)
    suiClient, err :<span class="hljs-operator">=</span> client.Dial(DevnetRpcUrl)
    <span class="hljs-keyword">if</span> err <span class="hljs-operator">!</span><span class="hljs-operator">=</span> nil {
        <span class="hljs-keyword">return</span> nil, <span class="hljs-string">""</span>, err
    }
    gasBudget :<span class="hljs-operator">=</span> <span class="hljs-keyword">uint64</span>(<span class="hljs-number">100000</span>)
    txnBytes, err :<span class="hljs-operator">=</span> MakeCommitmentAndCommit(suiClient, context.Background(), <span class="hljs-operator">*</span>signer, hash, nil, gasBudget)
    <span class="hljs-keyword">if</span> err <span class="hljs-operator">!</span><span class="hljs-operator">=</span> nil {
        <span class="hljs-keyword">return</span> nil, <span class="hljs-string">""</span>, err
    }
    signedTxn :<span class="hljs-operator">=</span> txnBytes.SignWith(acc.PrivateKey)
    txnResponse, err :<span class="hljs-operator">=</span> suiClient.ExecuteTransaction(context.Background(), <span class="hljs-operator">*</span>signedTxn, types.TxnRequestTypeWaitForLocalExecution)
    <span class="hljs-keyword">if</span> err <span class="hljs-operator">!</span><span class="hljs-operator">=</span> nil {
        <span class="hljs-keyword">return</span> nil, <span class="hljs-string">""</span>, err
    }
    <span class="hljs-keyword">return</span> txnResponse.EffectsCert.Effects.Effects.TransactionDigest, randStr, nil
}

func Register(client <span class="hljs-operator">*</span>client.Client, ctx context.Context, signer types.Address, register, domain, <span class="hljs-keyword">address</span> <span class="hljs-keyword">string</span>, day <span class="hljs-keyword">int</span>, randStr <span class="hljs-keyword">string</span>, coinID <span class="hljs-keyword">string</span>, gas <span class="hljs-operator">*</span>types.ObjectId, gasBudget <span class="hljs-keyword">uint64</span>) (<span class="hljs-operator">*</span>types.TransactionBytes, <span class="hljs-function"><span class="hljs-keyword">error</span>) </span>{
    packageId, <span class="hljs-keyword">_</span> :<span class="hljs-operator">=</span> types.NewAddressFromHex(PackageID)
    args :<span class="hljs-operator">=</span> []any{
        BaseController, register, Registry, Configuration, domain, <span class="hljs-keyword">address</span>, day, randStr, coinID,
    }
    <span class="hljs-keyword">return</span> client.MoveCall(ctx, signer, <span class="hljs-operator">*</span>packageId, <span class="hljs-string">"base_controller"</span>, <span class="hljs-string">"register"</span>, args, gas, gasBudget)
}

func DoRegister(mnemonic, domain, suffix, randStr <span class="hljs-keyword">string</span>) (<span class="hljs-operator">*</span>types.Base64Data, <span class="hljs-function"><span class="hljs-keyword">error</span>) </span>{

    acc, <span class="hljs-keyword">_</span> :<span class="hljs-operator">=</span> account.NewAccountWithMnemonic(mnemonic)
    signer, <span class="hljs-keyword">_</span> :<span class="hljs-operator">=</span> types.NewAddressFromHex(acc.Address)

    suiClient, err :<span class="hljs-operator">=</span> client.Dial(DevnetRpcUrl)
    <span class="hljs-keyword">if</span> err <span class="hljs-operator">!</span><span class="hljs-operator">=</span> nil {
        <span class="hljs-keyword">return</span> nil, err
    }
    gasBudget :<span class="hljs-operator">=</span> <span class="hljs-keyword">uint64</span>(<span class="hljs-number">1000000</span>)
    reg :<span class="hljs-operator">=</span> <span class="hljs-string">""</span>
    <span class="hljs-keyword">if</span> suffix <span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-string">"sui"</span> {
        reg <span class="hljs-operator">=</span> SUIBaseRegistrar
    } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> suffix <span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-string">"move"</span> {
        reg <span class="hljs-operator">=</span> MoveBaseRegistrar
    } <span class="hljs-keyword">else</span> {
        <span class="hljs-keyword">return</span> nil, errors.New(<span class="hljs-string">"err suffix"</span>)
    }
    txnBytes, err :<span class="hljs-operator">=</span> Register(suiClient, context.Background(), <span class="hljs-operator">*</span>signer, reg, domain, acc.Address, <span class="hljs-number">365</span>, randStr, <span class="hljs-string">"COIN_OBJECT_ID"</span>, nil, gasBudget)<span class="hljs-comment">//COIN_OBJECT_ID替换为你钱包中SUI Coin对象ID</span>
    <span class="hljs-keyword">if</span> err <span class="hljs-operator">!</span><span class="hljs-operator">=</span> nil {
        <span class="hljs-keyword">return</span> nil, err
    }
    signedTxn :<span class="hljs-operator">=</span> txnBytes.SignWith(acc.PrivateKey)
    txnResponse, err :<span class="hljs-operator">=</span> suiClient.ExecuteTransaction(context.Background(), <span class="hljs-operator">*</span>signedTxn, types.TxnRequestTypeWaitForLocalExecution)
    <span class="hljs-keyword">if</span> err <span class="hljs-operator">!</span><span class="hljs-operator">=</span> nil {
        <span class="hljs-keyword">return</span> nil, err
    }
    <span class="hljs-keyword">return</span> txnResponse.EffectsCert.Effects.Effects.TransactionDigest, nil
}

func main() {
    domain :<span class="hljs-operator">=</span> <span class="hljs-string">""</span><span class="hljs-comment">//你要注册的域名名称</span>
    suffix :<span class="hljs-operator">=</span> <span class="hljs-string">"sui"</span><span class="hljs-comment">//sui或者move后缀</span>
    fmt.Printf(<span class="hljs-string">"[+][suins]注册域名：%s.%s\n"</span>, domain, suffix)
    mnemonic :<span class="hljs-operator">=</span> <span class="hljs-string">""</span><span class="hljs-comment">//钱包助记词</span>
    <span class="hljs-keyword">if</span> tid, randStr, err :<span class="hljs-operator">=</span> MakeCommit(mnemonic, domain<span class="hljs-operator">+</span><span class="hljs-string">"."</span><span class="hljs-operator">+</span>suffix); err <span class="hljs-operator">!</span><span class="hljs-operator">=</span> nil {
        fmt.Println(<span class="hljs-string">"[+]"</span>, err)
    } <span class="hljs-keyword">else</span> {
        fmt.Printf(<span class="hljs-string">"[+]make_commitment_and_commit done! Check https://explorer.sui.io/transactions/%s\n"</span>, url.QueryEscape(tid.String()))
        <span class="hljs-keyword">if</span> rid, err :<span class="hljs-operator">=</span> DoRegister(mnemonic, domain, suffix, randStr); err <span class="hljs-operator">!</span><span class="hljs-operator">=</span> nil {
            fmt.Println(<span class="hljs-string">"[+]"</span>, err)
        } <span class="hljs-keyword">else</span> {
            fmt.Printf(<span class="hljs-string">"[+]register done! Check https://explorer.sui.io/transactions/%s\n"</span>, url.QueryEscape(rid.String()))
        }
    }
}
</code></pre><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/7d9772e4d11dcd9bfee607646355c049ebb7171cdf0133a1f8cf583f3659d0c9.png" alt="成功注册" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">成功注册</figcaption></figure></blockquote>]]></content:encoded>
            <author>bsd@newsletter.paragraph.com (BSD)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/36ae83b4a278e12c228d7d0498f4438fad333d62b1798db19397287101dacc2d.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[SUI交互之脚本Capy Breed]]></title>
            <link>https://paragraph.com/@bsd/sui-capy-breed</link>
            <guid>MtW13RUrLzd23ixUyivP</guid>
            <pubDate>Mon, 21 Nov 2022 07:33:18 GMT</pubDate>
            <description><![CDATA[SUI测试网Capy Breed 开发语言: go Discord交流: Link Twitter：@ananpt0package main import ( "fmt" "github.com/coming-chat/go-sui/account" "github.com/coming-chat/go-sui/client" "github.com/coming-chat/go-sui/types" "golang.org/x/net/context" "net/url" ) const DevnetRpcUrl = "https://fullnode.devnet.sui.io" var ( //https://explorer.sui.io/ 查找最新的CapyRegistry和PackageID CapyRegistry = "0xeed1d9254e7cdc52e14e48031e9da4f85080f52d" Module = "capy" PackageID = "0x5caccea44ca885b4be2497434c1db7a5ed86b16b" ) func ...]]></description>
            <content:encoded><![CDATA[<p>SUI测试网Capy Breed</p><p>开发语言: go</p><p>Discord交流: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://discord.gg/q8QK4w3RtE">Link</a></p><p>Twitter：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/ananpt0">@ananpt0</a></p><pre data-type="codeBlock" text="package main

import (
    &quot;fmt&quot;
    &quot;github.com/coming-chat/go-sui/account&quot;
    &quot;github.com/coming-chat/go-sui/client&quot;
    &quot;github.com/coming-chat/go-sui/types&quot;
    &quot;golang.org/x/net/context&quot;
    &quot;net/url&quot;
)

const DevnetRpcUrl = &quot;https://fullnode.devnet.sui.io&quot;

var (
    //https://explorer.sui.io/ 查找最新的CapyRegistry和PackageID
    CapyRegistry = &quot;0xeed1d9254e7cdc52e14e48031e9da4f85080f52d&quot;
    Module       = &quot;capy&quot;
    PackageID    = &quot;0x5caccea44ca885b4be2497434c1db7a5ed86b16b&quot;
)

func BreedAndKeep(client *client.Client, ctx context.Context, signer types.Address, capyLeft, capyRight string, gas *types.ObjectId, gasBudget uint64) (*types.TransactionBytes, error) {
    packageId, _ := types.NewAddressFromHex(PackageID)
    args := []any{
        CapyRegistry, capyLeft, capyRight,
    }
    return client.MoveCall(ctx, signer, *packageId, Module, &quot;breed_and_keep&quot;, args, gas, gasBudget)
}

func Breed(mnemonic, capyLeft, capyRight string) (*types.Base64Data, error) {
    fmt.Printf(&quot;[+]Capy Breed: %s + %s\n&quot;, capyLeft, capyRight)

    acc, _ := account.NewAccountWithMnemonic(mnemonic)
    signer, _ := types.NewAddressFromHex(acc.Address)
    suiClient, err := client.Dial(DevnetRpcUrl)
    if err != nil {
        return nil, err
    }

    gasBudget := uint64(100000)
    txnBytes, err := BreedAndKeep(suiClient, context.Background(), *signer, capyLeft, capyRight, nil, gasBudget)
    if err != nil {
        return nil, err
    }
    signedTxn := txnBytes.SignWith(acc.PrivateKey)
    txnResponse, err := suiClient.ExecuteTransaction(context.Background(), *signedTxn, types.TxnRequestTypeWaitForLocalExecution)
    if err != nil {
        return nil, err
    }
    oID := txnResponse.EffectsCert.Effects.Effects.Created[0].Reference.ObjectId.String()
    fmt.Println(&quot;[+]New Capy ID: &quot;, oID)
    return txnResponse.EffectsCert.Effects.Effects.TransactionDigest, nil
}

func main() {
    //助记词
    mnemonic := &quot;&quot;

    //左侧capy ID
    capyLeft := &quot;&quot;

    //右侧capy ID
    capyRight := &quot;&quot;

    if tid, err := Breed(mnemonic, capyLeft, capyRight); err != nil {
        fmt.Println(&quot;[+]&quot;, err)
    } else {
        fmt.Printf(&quot;[+]Check https://explorer.sui.io/transactions/%s\n&quot;, url.QueryEscape(tid.String()))
    }
}
"><code>package main

<span class="hljs-keyword">import</span> (
    <span class="hljs-string">"fmt"</span>
    <span class="hljs-string">"github.com/coming-chat/go-sui/account"</span>
    <span class="hljs-string">"github.com/coming-chat/go-sui/client"</span>
    <span class="hljs-string">"github.com/coming-chat/go-sui/types"</span>
    <span class="hljs-string">"golang.org/x/net/context"</span>
    <span class="hljs-string">"net/url"</span>
)

<span class="hljs-title">const</span> <span class="hljs-title">DevnetRpcUrl</span> <span class="hljs-operator">=</span> <span class="hljs-string">"https://fullnode.devnet.sui.io"</span>

<span class="hljs-title"><span class="hljs-keyword">var</span></span> (
    <span class="hljs-comment">//https://explorer.sui.io/ 查找最新的CapyRegistry和PackageID</span>
    <span class="hljs-title">CapyRegistry</span> <span class="hljs-operator">=</span> <span class="hljs-string">"0xeed1d9254e7cdc52e14e48031e9da4f85080f52d"</span>
    <span class="hljs-title">Module</span>       <span class="hljs-operator">=</span> <span class="hljs-string">"capy"</span>
    <span class="hljs-title">PackageID</span>    <span class="hljs-operator">=</span> <span class="hljs-string">"0x5caccea44ca885b4be2497434c1db7a5ed86b16b"</span>
)

<span class="hljs-title">func</span> <span class="hljs-title">BreedAndKeep</span>(<span class="hljs-title">client</span> <span class="hljs-operator">*</span><span class="hljs-title">client</span>.<span class="hljs-title">Client</span>, <span class="hljs-title">ctx</span> <span class="hljs-title">context</span>.<span class="hljs-title">Context</span>, <span class="hljs-title">signer</span> <span class="hljs-title">types</span>.<span class="hljs-title">Address</span>, <span class="hljs-title">capyLeft</span>, <span class="hljs-title">capyRight</span> <span class="hljs-title"><span class="hljs-keyword">string</span></span>, <span class="hljs-title">gas</span> <span class="hljs-operator">*</span><span class="hljs-title">types</span>.<span class="hljs-title">ObjectId</span>, <span class="hljs-title">gasBudget</span> <span class="hljs-title"><span class="hljs-keyword">uint64</span></span>) (<span class="hljs-operator">*</span><span class="hljs-title">types</span>.<span class="hljs-title">TransactionBytes</span>, <span class="hljs-title"><span class="hljs-keyword">error</span></span>) {
    <span class="hljs-title">packageId</span>, <span class="hljs-title"><span class="hljs-keyword">_</span></span> :<span class="hljs-operator">=</span> <span class="hljs-title">types</span>.<span class="hljs-title">NewAddressFromHex</span>(<span class="hljs-title">PackageID</span>)
    <span class="hljs-title">args</span> :<span class="hljs-operator">=</span> []<span class="hljs-title">any</span>{
        <span class="hljs-title">CapyRegistry</span>, <span class="hljs-title">capyLeft</span>, <span class="hljs-title">capyRight</span>,
    }
    <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">client</span>.<span class="hljs-title">MoveCall</span>(<span class="hljs-title">ctx</span>, <span class="hljs-title">signer</span>, <span class="hljs-operator">*</span><span class="hljs-title">packageId</span>, <span class="hljs-title">Module</span>, <span class="hljs-string">"breed_and_keep"</span>, <span class="hljs-title">args</span>, <span class="hljs-title">gas</span>, <span class="hljs-title">gasBudget</span>)
}

<span class="hljs-title">func</span> <span class="hljs-title">Breed</span>(<span class="hljs-title">mnemonic</span>, <span class="hljs-title">capyLeft</span>, <span class="hljs-title">capyRight</span> <span class="hljs-title"><span class="hljs-keyword">string</span></span>) (<span class="hljs-operator">*</span><span class="hljs-title">types</span>.<span class="hljs-title">Base64Data</span>, <span class="hljs-title"><span class="hljs-keyword">error</span></span>) {
    <span class="hljs-title">fmt</span>.<span class="hljs-title">Printf</span>(<span class="hljs-string">"[+]Capy Breed: %s + %s\n"</span>, <span class="hljs-title">capyLeft</span>, <span class="hljs-title">capyRight</span>)

    <span class="hljs-title">acc</span>, <span class="hljs-title"><span class="hljs-keyword">_</span></span> :<span class="hljs-operator">=</span> <span class="hljs-title">account</span>.<span class="hljs-title">NewAccountWithMnemonic</span>(<span class="hljs-title">mnemonic</span>)
    <span class="hljs-title">signer</span>, <span class="hljs-title"><span class="hljs-keyword">_</span></span> :<span class="hljs-operator">=</span> <span class="hljs-title">types</span>.<span class="hljs-title">NewAddressFromHex</span>(<span class="hljs-title">acc</span>.<span class="hljs-title">Address</span>)
    <span class="hljs-title">suiClient</span>, <span class="hljs-title">err</span> :<span class="hljs-operator">=</span> <span class="hljs-title">client</span>.<span class="hljs-title">Dial</span>(<span class="hljs-title">DevnetRpcUrl</span>)
    <span class="hljs-title"><span class="hljs-keyword">if</span></span> <span class="hljs-title">err</span> <span class="hljs-operator">!</span><span class="hljs-operator">=</span> <span class="hljs-title">nil</span> {
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">nil</span>, <span class="hljs-title">err</span>
    }

    <span class="hljs-title">gasBudget</span> :<span class="hljs-operator">=</span> <span class="hljs-title"><span class="hljs-keyword">uint64</span></span>(100000)
    <span class="hljs-title">txnBytes</span>, <span class="hljs-title">err</span> :<span class="hljs-operator">=</span> <span class="hljs-title">BreedAndKeep</span>(<span class="hljs-title">suiClient</span>, <span class="hljs-title">context</span>.<span class="hljs-title">Background</span>(), <span class="hljs-operator">*</span><span class="hljs-title">signer</span>, <span class="hljs-title">capyLeft</span>, <span class="hljs-title">capyRight</span>, <span class="hljs-title">nil</span>, <span class="hljs-title">gasBudget</span>)
    <span class="hljs-title"><span class="hljs-keyword">if</span></span> <span class="hljs-title">err</span> <span class="hljs-operator">!</span><span class="hljs-operator">=</span> <span class="hljs-title">nil</span> {
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">nil</span>, <span class="hljs-title">err</span>
    }
    <span class="hljs-title">signedTxn</span> :<span class="hljs-operator">=</span> <span class="hljs-title">txnBytes</span>.<span class="hljs-title">SignWith</span>(<span class="hljs-title">acc</span>.<span class="hljs-title">PrivateKey</span>)
    <span class="hljs-title">txnResponse</span>, <span class="hljs-title">err</span> :<span class="hljs-operator">=</span> <span class="hljs-title">suiClient</span>.<span class="hljs-title">ExecuteTransaction</span>(<span class="hljs-title">context</span>.<span class="hljs-title">Background</span>(), <span class="hljs-operator">*</span><span class="hljs-title">signedTxn</span>, <span class="hljs-title">types</span>.<span class="hljs-title">TxnRequestTypeWaitForLocalExecution</span>)
    <span class="hljs-title"><span class="hljs-keyword">if</span></span> <span class="hljs-title">err</span> <span class="hljs-operator">!</span><span class="hljs-operator">=</span> <span class="hljs-title">nil</span> {
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">nil</span>, <span class="hljs-title">err</span>
    }
    <span class="hljs-title">oID</span> :<span class="hljs-operator">=</span> <span class="hljs-title">txnResponse</span>.<span class="hljs-title">EffectsCert</span>.<span class="hljs-title">Effects</span>.<span class="hljs-title">Effects</span>.<span class="hljs-title">Created</span>[0].<span class="hljs-title">Reference</span>.<span class="hljs-title">ObjectId</span>.<span class="hljs-title">String</span>()
    <span class="hljs-title">fmt</span>.<span class="hljs-title">Println</span>(<span class="hljs-string">"[+]New Capy ID: "</span>, <span class="hljs-title">oID</span>)
    <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">txnResponse</span>.<span class="hljs-title">EffectsCert</span>.<span class="hljs-title">Effects</span>.<span class="hljs-title">Effects</span>.<span class="hljs-title">TransactionDigest</span>, <span class="hljs-title">nil</span>
}

<span class="hljs-title">func</span> <span class="hljs-title">main</span>() {
    <span class="hljs-comment">//助记词</span>
    <span class="hljs-title">mnemonic</span> :<span class="hljs-operator">=</span> <span class="hljs-string">""</span>

    <span class="hljs-comment">//左侧capy ID</span>
    <span class="hljs-title">capyLeft</span> :<span class="hljs-operator">=</span> <span class="hljs-string">""</span>

    <span class="hljs-comment">//右侧capy ID</span>
    <span class="hljs-title">capyRight</span> :<span class="hljs-operator">=</span> <span class="hljs-string">""</span>

    <span class="hljs-title"><span class="hljs-keyword">if</span></span> <span class="hljs-title">tid</span>, <span class="hljs-title">err</span> :<span class="hljs-operator">=</span> <span class="hljs-title">Breed</span>(<span class="hljs-title">mnemonic</span>, <span class="hljs-title">capyLeft</span>, <span class="hljs-title">capyRight</span>); err <span class="hljs-operator">!</span><span class="hljs-operator">=</span> nil {
        fmt.Println(<span class="hljs-string">"[+]"</span>, err)
    } <span class="hljs-keyword">else</span> {
        fmt.Printf(<span class="hljs-string">"[+]Check https://explorer.sui.io/transactions/%s\n"</span>, url.QueryEscape(tid.String()))
    }
}
</code></pre><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/6d423d7a10638bc88ae7b03c1ea15a7d20e16389dde136c3986d14e357336e41.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure>]]></content:encoded>
            <author>bsd@newsletter.paragraph.com (BSD)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/36ae83b4a278e12c228d7d0498f4438fad333d62b1798db19397287101dacc2d.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[SUI交互之自动化Mint脚本]]></title>
            <link>https://paragraph.com/@bsd/sui-mint</link>
            <guid>T96TVskGQku0gy8jJNvt</guid>
            <pubDate>Wed, 16 Nov 2022 08:17:25 GMT</pubDate>
            <description><![CDATA[SUI交互之自动化Mint脚本 开发语言：go Discord交流: Link Twitter：@ananpt0package main import ( "context" "fmt" "github.com/coming-chat/go-sui/account" "github.com/coming-chat/go-sui/client" "github.com/coming-chat/go-sui/types" "net/url" "time" ) const DevnetRpcUrl = "https://fullnode.devnet.sui.io" func Mint(mnemonic, name string) (*types.Base64Data, error) { fmt.Println("[+]TYPE: Call Mint NFT") acc, _ := account.NewAccountWithMnemonic(mnemonic) fmt.Printf("[+]Wallet: %s\n", acc.Address) suiClient, err := c...]]></description>
            <content:encoded><![CDATA[<p>SUI交互之自动化Mint脚本</p><p>开发语言：go</p><p>Discord交流: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://discord.gg/q8QK4w3RtE">Link</a></p><p>Twitter：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/ananpt0">@ananpt0</a></p><pre data-type="codeBlock" text="package main

import (
    &quot;context&quot;
    &quot;fmt&quot;
    &quot;github.com/coming-chat/go-sui/account&quot;
    &quot;github.com/coming-chat/go-sui/client&quot;
    &quot;github.com/coming-chat/go-sui/types&quot;
    &quot;net/url&quot;
    &quot;time&quot;
)

const DevnetRpcUrl = &quot;https://fullnode.devnet.sui.io&quot;

func Mint(mnemonic, name string) (*types.Base64Data, error) {
    fmt.Println(&quot;[+]TYPE: Call Mint NFT&quot;)
    acc, _ := account.NewAccountWithMnemonic(mnemonic)
    fmt.Printf(&quot;[+]Wallet: %s\n&quot;, acc.Address)
    suiClient, err := client.Dial(DevnetRpcUrl)
    if err != nil {
        return nil, err
    }
    signer, err := types.NewAddressFromHex(acc.Address)
    if err != nil {
        return nil, err
    }
    gasBudget := uint64(10000)

    var (
        timeNow = time.Now().Format(&quot;06-01-02 15:04&quot;)
        nftName = &quot;NFT at &quot; + timeNow
        nftDesc = &quot;This is a NFT created by &quot; + name
        nftUrl  = &quot;https://go.dev/images/logos/twitter.svg&quot;
    )

    txnBytes, err := suiClient.MintDevnetNFT(context.Background(), *signer, nftName, nftDesc, nftUrl, nil, gasBudget)
    if err != nil {
        return nil, err
    }
    // sign &amp; send
    signedTxn := txnBytes.SignWith(acc.PrivateKey)
    response, err := suiClient.ExecuteTransaction(context.Background(), *signedTxn, types.TxnRequestTypeWaitForLocalExecution)
    if err != nil {
        return nil, err
    }
    fmt.Println(&quot;[+]TRANSACTION ID: &quot;, response.EffectsCert.Effects.Effects.TransactionDigest)
    return response.EffectsCert.Effects.Effects.TransactionDigest, nil
}

func main() {
    //助记词
    mnemonic := &quot;fork vocal captain early crisp that shuffle magic dune crop ask ribbon view industry scorpion orphan prize stone eye hover first frown fantasy first&quot;
    name := &quot;sui&quot;
    if tid, err := Mint(mnemonic, name); err != nil {
        fmt.Println(&quot;[+]&quot;, err)
    } else {
        fmt.Printf(&quot;[+]Mint check https://explorer.devnet.sui.io/transactions/%s\n&quot;, url.QueryEscape(tid.String()))
    }
}
"><code>package main

<span class="hljs-keyword">import</span> (
    <span class="hljs-string">"context"</span>
    <span class="hljs-string">"fmt"</span>
    <span class="hljs-string">"github.com/coming-chat/go-sui/account"</span>
    <span class="hljs-string">"github.com/coming-chat/go-sui/client"</span>
    <span class="hljs-string">"github.com/coming-chat/go-sui/types"</span>
    <span class="hljs-string">"net/url"</span>
    <span class="hljs-string">"time"</span>
)

<span class="hljs-title">const</span> <span class="hljs-title">DevnetRpcUrl</span> <span class="hljs-operator">=</span> <span class="hljs-string">"https://fullnode.devnet.sui.io"</span>

<span class="hljs-title">func</span> <span class="hljs-title">Mint</span>(<span class="hljs-title">mnemonic</span>, <span class="hljs-title">name</span> <span class="hljs-title"><span class="hljs-keyword">string</span></span>) (<span class="hljs-operator">*</span><span class="hljs-title">types</span>.<span class="hljs-title">Base64Data</span>, <span class="hljs-title"><span class="hljs-keyword">error</span></span>) {
    <span class="hljs-title">fmt</span>.<span class="hljs-title">Println</span>(<span class="hljs-string">"[+]TYPE: Call Mint NFT"</span>)
    <span class="hljs-title">acc</span>, <span class="hljs-title"><span class="hljs-keyword">_</span></span> :<span class="hljs-operator">=</span> <span class="hljs-title">account</span>.<span class="hljs-title">NewAccountWithMnemonic</span>(<span class="hljs-title">mnemonic</span>)
    <span class="hljs-title">fmt</span>.<span class="hljs-title">Printf</span>(<span class="hljs-string">"[+]Wallet: %s\n"</span>, <span class="hljs-title">acc</span>.<span class="hljs-title">Address</span>)
    <span class="hljs-title">suiClient</span>, <span class="hljs-title">err</span> :<span class="hljs-operator">=</span> <span class="hljs-title">client</span>.<span class="hljs-title">Dial</span>(<span class="hljs-title">DevnetRpcUrl</span>)
    <span class="hljs-title"><span class="hljs-keyword">if</span></span> <span class="hljs-title">err</span> <span class="hljs-operator">!</span><span class="hljs-operator">=</span> <span class="hljs-title">nil</span> {
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">nil</span>, <span class="hljs-title">err</span>
    }
    <span class="hljs-title">signer</span>, <span class="hljs-title">err</span> :<span class="hljs-operator">=</span> <span class="hljs-title">types</span>.<span class="hljs-title">NewAddressFromHex</span>(<span class="hljs-title">acc</span>.<span class="hljs-title">Address</span>)
    <span class="hljs-title"><span class="hljs-keyword">if</span></span> <span class="hljs-title">err</span> <span class="hljs-operator">!</span><span class="hljs-operator">=</span> <span class="hljs-title">nil</span> {
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">nil</span>, <span class="hljs-title">err</span>
    }
    <span class="hljs-title">gasBudget</span> :<span class="hljs-operator">=</span> <span class="hljs-title"><span class="hljs-keyword">uint64</span></span>(10000)

    <span class="hljs-title"><span class="hljs-keyword">var</span></span> (
        <span class="hljs-title">timeNow</span> <span class="hljs-operator">=</span> <span class="hljs-title">time</span>.<span class="hljs-title">Now</span>().<span class="hljs-title">Format</span>(<span class="hljs-string">"06-01-02 15:04"</span>)
        <span class="hljs-title">nftName</span> <span class="hljs-operator">=</span> <span class="hljs-string">"NFT at "</span> <span class="hljs-operator">+</span> <span class="hljs-title">timeNow</span>
        <span class="hljs-title">nftDesc</span> <span class="hljs-operator">=</span> <span class="hljs-string">"This is a NFT created by "</span> <span class="hljs-operator">+</span> <span class="hljs-title">name</span>
        <span class="hljs-title">nftUrl</span>  <span class="hljs-operator">=</span> <span class="hljs-string">"https://go.dev/images/logos/twitter.svg"</span>
    )

    <span class="hljs-title">txnBytes</span>, <span class="hljs-title">err</span> :<span class="hljs-operator">=</span> <span class="hljs-title">suiClient</span>.<span class="hljs-title">MintDevnetNFT</span>(<span class="hljs-title">context</span>.<span class="hljs-title">Background</span>(), <span class="hljs-operator">*</span><span class="hljs-title">signer</span>, <span class="hljs-title">nftName</span>, <span class="hljs-title">nftDesc</span>, <span class="hljs-title">nftUrl</span>, <span class="hljs-title">nil</span>, <span class="hljs-title">gasBudget</span>)
    <span class="hljs-title"><span class="hljs-keyword">if</span></span> <span class="hljs-title">err</span> <span class="hljs-operator">!</span><span class="hljs-operator">=</span> <span class="hljs-title">nil</span> {
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">nil</span>, <span class="hljs-title">err</span>
    }
    <span class="hljs-comment">// sign &#x26; send</span>
    <span class="hljs-title">signedTxn</span> :<span class="hljs-operator">=</span> <span class="hljs-title">txnBytes</span>.<span class="hljs-title">SignWith</span>(<span class="hljs-title">acc</span>.<span class="hljs-title">PrivateKey</span>)
    <span class="hljs-title">response</span>, <span class="hljs-title">err</span> :<span class="hljs-operator">=</span> <span class="hljs-title">suiClient</span>.<span class="hljs-title">ExecuteTransaction</span>(<span class="hljs-title">context</span>.<span class="hljs-title">Background</span>(), <span class="hljs-operator">*</span><span class="hljs-title">signedTxn</span>, <span class="hljs-title">types</span>.<span class="hljs-title">TxnRequestTypeWaitForLocalExecution</span>)
    <span class="hljs-title"><span class="hljs-keyword">if</span></span> <span class="hljs-title">err</span> <span class="hljs-operator">!</span><span class="hljs-operator">=</span> <span class="hljs-title">nil</span> {
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">nil</span>, <span class="hljs-title">err</span>
    }
    <span class="hljs-title">fmt</span>.<span class="hljs-title">Println</span>(<span class="hljs-string">"[+]TRANSACTION ID: "</span>, <span class="hljs-title">response</span>.<span class="hljs-title">EffectsCert</span>.<span class="hljs-title">Effects</span>.<span class="hljs-title">Effects</span>.<span class="hljs-title">TransactionDigest</span>)
    <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">response</span>.<span class="hljs-title">EffectsCert</span>.<span class="hljs-title">Effects</span>.<span class="hljs-title">Effects</span>.<span class="hljs-title">TransactionDigest</span>, <span class="hljs-title">nil</span>
}

<span class="hljs-title">func</span> <span class="hljs-title">main</span>() {
    <span class="hljs-comment">//助记词</span>
    <span class="hljs-title">mnemonic</span> :<span class="hljs-operator">=</span> <span class="hljs-string">"fork vocal captain early crisp that shuffle magic dune crop ask ribbon view industry scorpion orphan prize stone eye hover first frown fantasy first"</span>
    <span class="hljs-title">name</span> :<span class="hljs-operator">=</span> <span class="hljs-string">"sui"</span>
    <span class="hljs-title"><span class="hljs-keyword">if</span></span> <span class="hljs-title">tid</span>, <span class="hljs-title">err</span> :<span class="hljs-operator">=</span> <span class="hljs-title">Mint</span>(<span class="hljs-title">mnemonic</span>, <span class="hljs-title">name</span>); err <span class="hljs-operator">!</span><span class="hljs-operator">=</span> nil {
        fmt.Println(<span class="hljs-string">"[+]"</span>, err)
    } <span class="hljs-keyword">else</span> {
        fmt.Printf(<span class="hljs-string">"[+]Mint check https://explorer.devnet.sui.io/transactions/%s\n"</span>, url.QueryEscape(tid.String()))
    }
}
</code></pre><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/3350a2eb03b265e75ca800f8c1fe24384b938816a48c76782c5bdb668e042481.png" alt="开始交互" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">开始交互</figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/232147a98bd77f7bc0f4d33960f733588d756c8a20ae9f63b3a7d925bc348165.png" alt="交互记录" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">交互记录</figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/50f5b068efac11861b1a90362669649dc7134c02bef3e58cf37890e72889da67.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure>]]></content:encoded>
            <author>bsd@newsletter.paragraph.com (BSD)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/36ae83b4a278e12c228d7d0498f4438fad333d62b1798db19397287101dacc2d.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[SUI交互测试网自动领水脚本]]></title>
            <link>https://paragraph.com/@bsd/sui-2</link>
            <guid>kLLGFF5oDh7lHMwcxc8w</guid>
            <pubDate>Wed, 16 Nov 2022 06:35:10 GMT</pubDate>
            <description><![CDATA[SUI交互测试网自动领水脚本 开发语言：go Discord交流: Link Twitter：@ananpt0package main import ( "errors" "fmt" "github.com/go-resty/resty/v2" "strings" ) type GasReq struct { FixedAmountRequest FixedAmount `json:"FixedAmountRequest"` } type FixedAmount struct { Recipient string `json:"recipient"` } var FaucetURL = "https://faucet.devnet.sui.io/gas" func Faucet(address string, proxy string) error { fmt.Println("[+]Request DevNet SUI Tokens") req := FixedAmount{ Recipient: address, } gas := GasReq{FixedAmountRequ...]]></description>
            <content:encoded><![CDATA[<p>SUI交互测试网自动领水脚本</p><p>开发语言：go</p><p>Discord交流: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://discord.gg/q8QK4w3RtE">Link</a></p><p>Twitter：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/ananpt0">@ananpt0</a></p><pre data-type="codeBlock" text="package main

import (
    &quot;errors&quot;
    &quot;fmt&quot;
    &quot;github.com/go-resty/resty/v2&quot;
    &quot;strings&quot;
)

type GasReq struct {
    FixedAmountRequest FixedAmount `json:&quot;FixedAmountRequest&quot;`
}

type FixedAmount struct {
    Recipient string `json:&quot;recipient&quot;`
}

var FaucetURL = &quot;https://faucet.devnet.sui.io/gas&quot;

func Faucet(address string, proxy string) error {
    fmt.Println(&quot;[+]Request DevNet SUI Tokens&quot;)
    req := FixedAmount{
        Recipient: address,
    }
    gas := GasReq{FixedAmountRequest: req}
    httpClient := resty.New()
    if len(proxy) &gt; 0 {
        httpClient.SetProxy(proxy)
    }
    resp, err := httpClient.R().
        SetBody(gas).
        Post(FaucetURL)
    if err != nil {
        fmt.Println(err)
        return err
    }
    b := resp.Body()

    if strings.Contains(string(b), &quot;error code: 1015&quot;) {
        return errors.New(&quot;fail&quot;)
    }
    return nil
}

func main() {
    //钱包地址：0x
    walletAddress := &quot;&quot;
    //http代理服务器地址 示例:http://127.0.0.1:8001
    proxy := &quot;&quot;
    if err := Faucet(walletAddress, proxy); err == nil {
        fmt.Printf(&quot;[+] 5 test Sui objects are heading to your wallet,check https://explorer.devnet.sui.io/addresses/%s\n&quot;, walletAddress)
    } else {
        //失败后可以更换Http代理
        fmt.Println(&quot;Request limit reached, please try again later or change proxy.&quot;)
    }
}
"><code>package main

<span class="hljs-keyword">import</span> (
    <span class="hljs-string">"errors"</span>
    <span class="hljs-string">"fmt"</span>
    <span class="hljs-string">"github.com/go-resty/resty/v2"</span>
    <span class="hljs-string">"strings"</span>
)

<span class="hljs-title"><span class="hljs-keyword">type</span></span> <span class="hljs-title">GasReq</span> <span class="hljs-title"><span class="hljs-keyword">struct</span></span> {
    <span class="hljs-title">FixedAmountRequest</span> <span class="hljs-title">FixedAmount</span> `<span class="hljs-title">json</span>:<span class="hljs-string">"FixedAmountRequest"</span>`
}

<span class="hljs-title"><span class="hljs-keyword">type</span></span> <span class="hljs-title">FixedAmount</span> <span class="hljs-title"><span class="hljs-keyword">struct</span></span> {
    <span class="hljs-title">Recipient</span> <span class="hljs-title"><span class="hljs-keyword">string</span></span> `<span class="hljs-title">json</span>:<span class="hljs-string">"recipient"</span>`
}

<span class="hljs-title"><span class="hljs-keyword">var</span></span> <span class="hljs-title">FaucetURL</span> <span class="hljs-operator">=</span> <span class="hljs-string">"https://faucet.devnet.sui.io/gas"</span>

<span class="hljs-title">func</span> <span class="hljs-title">Faucet</span>(<span class="hljs-title"><span class="hljs-keyword">address</span></span> <span class="hljs-title"><span class="hljs-keyword">string</span></span>, <span class="hljs-title">proxy</span> <span class="hljs-title"><span class="hljs-keyword">string</span></span>) <span class="hljs-title"><span class="hljs-keyword">error</span></span> {
    <span class="hljs-title">fmt</span>.<span class="hljs-title">Println</span>(<span class="hljs-string">"[+]Request DevNet SUI Tokens"</span>)
    <span class="hljs-title">req</span> :<span class="hljs-operator">=</span> <span class="hljs-title">FixedAmount</span>{
        <span class="hljs-title">Recipient</span>: <span class="hljs-title"><span class="hljs-keyword">address</span></span>,
    }
    <span class="hljs-title">gas</span> :<span class="hljs-operator">=</span> <span class="hljs-title">GasReq</span>{<span class="hljs-title">FixedAmountRequest</span>: <span class="hljs-title">req</span>}
    <span class="hljs-title">httpClient</span> :<span class="hljs-operator">=</span> <span class="hljs-title">resty</span>.<span class="hljs-title">New</span>()
    <span class="hljs-title"><span class="hljs-keyword">if</span></span> <span class="hljs-title">len</span>(<span class="hljs-title">proxy</span>) <span class="hljs-operator">></span> 0 {
        <span class="hljs-title">httpClient</span>.<span class="hljs-title">SetProxy</span>(<span class="hljs-title">proxy</span>)
    }
    <span class="hljs-title">resp</span>, <span class="hljs-title">err</span> :<span class="hljs-operator">=</span> <span class="hljs-title">httpClient</span>.<span class="hljs-title">R</span>().
        <span class="hljs-title">SetBody</span>(<span class="hljs-title">gas</span>).
        <span class="hljs-title">Post</span>(<span class="hljs-title">FaucetURL</span>)
    <span class="hljs-title"><span class="hljs-keyword">if</span></span> <span class="hljs-title">err</span> <span class="hljs-operator">!</span><span class="hljs-operator">=</span> <span class="hljs-title">nil</span> {
        <span class="hljs-title">fmt</span>.<span class="hljs-title">Println</span>(<span class="hljs-title">err</span>)
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">err</span>
    }
    <span class="hljs-title">b</span> :<span class="hljs-operator">=</span> <span class="hljs-title">resp</span>.<span class="hljs-title">Body</span>()

    <span class="hljs-title"><span class="hljs-keyword">if</span></span> <span class="hljs-title">strings</span>.<span class="hljs-title">Contains</span>(<span class="hljs-title"><span class="hljs-keyword">string</span></span>(<span class="hljs-title">b</span>), <span class="hljs-string">"error code: 1015"</span>) {
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">errors</span>.<span class="hljs-title">New</span>(<span class="hljs-string">"fail"</span>)
    }
    <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">nil</span>
}

<span class="hljs-title">func</span> <span class="hljs-title">main</span>() {
    <span class="hljs-comment">//钱包地址：0x</span>
    <span class="hljs-title">walletAddress</span> :<span class="hljs-operator">=</span> <span class="hljs-string">""</span>
    <span class="hljs-comment">//http代理服务器地址 示例:http://127.0.0.1:8001</span>
    <span class="hljs-title">proxy</span> :<span class="hljs-operator">=</span> <span class="hljs-string">""</span>
    <span class="hljs-title"><span class="hljs-keyword">if</span></span> <span class="hljs-title">err</span> :<span class="hljs-operator">=</span> <span class="hljs-title">Faucet</span>(<span class="hljs-title">walletAddress</span>, <span class="hljs-title">proxy</span>); err <span class="hljs-operator">=</span><span class="hljs-operator">=</span> nil {
        fmt.Printf(<span class="hljs-string">"[+] 5 test Sui objects are heading to your wallet,check https://explorer.devnet.sui.io/addresses/%s\n"</span>, walletAddress)
    } <span class="hljs-keyword">else</span> {
        <span class="hljs-comment">//失败后可以更换Http代理</span>
        fmt.Println(<span class="hljs-string">"Request limit reached, please try again later or change proxy."</span>)
    }
}
</code></pre><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/b74cb41a1bc4c40540301484068219051ff65f505134986965b8f5bfe05bd472.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure>]]></content:encoded>
            <author>bsd@newsletter.paragraph.com (BSD)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/36ae83b4a278e12c228d7d0498f4438fad333d62b1798db19397287101dacc2d.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[SUI批量创建钱包地址脚本]]></title>
            <link>https://paragraph.com/@bsd/sui</link>
            <guid>TeRN6ezKvQhTjE0GSGrU</guid>
            <pubDate>Wed, 16 Nov 2022 03:42:51 GMT</pubDate>
            <description><![CDATA[批量生成SUI钱包地址本地保存 脚本语言：go 版本：go1.19 Discord交流: Link Twitter：@ananpt0package main import ( "encoding/json" "fmt" "github.com/coming-chat/go-sui/account" "github.com/tyler-smith/go-bip39" "io/ioutil" ) type SuiWallet struct { Address string `json:"address"` Mnemonic string `json:"mnemonic"` Private string `json:"private"` Public string `json:"public"` } func Create(num int) { fmt.Printf("[+]Create Wallet :%d \n", num) wallets := make([]SuiWallet, 0) for i := 0; i &#x3C; num; i++ { fmt.Printf("[+]...]]></description>
            <content:encoded><![CDATA[<p>批量生成SUI钱包地址本地保存</p><p>脚本语言：go</p><p>版本：go1.19</p><p>Discord交流: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://discord.gg/q8QK4w3RtE">Link</a></p><p>Twitter：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/ananpt0">@ananpt0</a></p><pre data-type="codeBlock" text="package main

import (
    &quot;encoding/json&quot;
    &quot;fmt&quot;
    &quot;github.com/coming-chat/go-sui/account&quot;
    &quot;github.com/tyler-smith/go-bip39&quot;
    &quot;io/ioutil&quot;
)

type SuiWallet struct {
    Address  string `json:&quot;address&quot;`
    Mnemonic string `json:&quot;mnemonic&quot;`
    Private  string `json:&quot;private&quot;`
    Public   string `json:&quot;public&quot;`
}

func Create(num int) {
    fmt.Printf(&quot;[+]Create Wallet :%d \n&quot;, num)
    wallets := make([]SuiWallet, 0)
    for i := 0; i &lt; num; i++ {
        fmt.Printf(&quot;[+]Wallet : %d \n&quot;, i+1)
        entropy, _ := bip39.NewEntropy(256)
        mnemonic, _ := bip39.NewMnemonic(entropy)
        fmt.Println(&quot;[+]Mnemonic : &quot;, mnemonic)
        acc, _ := account.NewAccountWithMnemonic(mnemonic)
        fmt.Printf(&quot;[+]privateKey = %x\n&quot;, acc.PrivateKey[:32])
        fmt.Printf(&quot;[+] publicKey = %x\n&quot;, acc.PublicKey)
        fmt.Printf(&quot;[+]   address = %v\n&quot;, acc.Address)
        wallet := SuiWallet{}
        wallet.Mnemonic = mnemonic
        wallet.Address = acc.Address
        wallet.Private = fmt.Sprintf(&quot;%x&quot;, acc.PrivateKey[:32])
        wallet.Public = fmt.Sprintf(&quot;%x&quot;, acc.PublicKey)
        wallets = append(wallets, wallet)
    }
        //保存到本地json文件
    walletsJson, _ := json.Marshal(wallets)
    ioutil.WriteFile(&quot;wallet.json&quot;, walletsJson, 0666)
}

func main() {
   //创建100个钱包地址
   Create(100)
}
"><code>package main

<span class="hljs-keyword">import</span> (
    <span class="hljs-string">"encoding/json"</span>
    <span class="hljs-string">"fmt"</span>
    <span class="hljs-string">"github.com/coming-chat/go-sui/account"</span>
    <span class="hljs-string">"github.com/tyler-smith/go-bip39"</span>
    <span class="hljs-string">"io/ioutil"</span>
)

<span class="hljs-title"><span class="hljs-keyword">type</span></span> <span class="hljs-title">SuiWallet</span> <span class="hljs-title"><span class="hljs-keyword">struct</span></span> {
    <span class="hljs-title">Address</span>  <span class="hljs-title"><span class="hljs-keyword">string</span></span> `<span class="hljs-title">json</span>:<span class="hljs-string">"address"</span>`
    <span class="hljs-title">Mnemonic</span> <span class="hljs-title"><span class="hljs-keyword">string</span></span> `<span class="hljs-title">json</span>:<span class="hljs-string">"mnemonic"</span>`
    <span class="hljs-title">Private</span>  <span class="hljs-title"><span class="hljs-keyword">string</span></span> `<span class="hljs-title">json</span>:<span class="hljs-string">"private"</span>`
    <span class="hljs-title">Public</span>   <span class="hljs-title"><span class="hljs-keyword">string</span></span> `<span class="hljs-title">json</span>:<span class="hljs-string">"public"</span>`
}

<span class="hljs-title">func</span> <span class="hljs-title">Create</span>(<span class="hljs-title">num</span> <span class="hljs-title"><span class="hljs-keyword">int</span></span>) {
    <span class="hljs-title">fmt</span>.<span class="hljs-title">Printf</span>(<span class="hljs-string">"[+]Create Wallet :%d \n"</span>, <span class="hljs-title">num</span>)
    <span class="hljs-title">wallets</span> :<span class="hljs-operator">=</span> <span class="hljs-title">make</span>([]<span class="hljs-title">SuiWallet</span>, 0)
    <span class="hljs-title"><span class="hljs-keyword">for</span></span> <span class="hljs-title">i</span> :<span class="hljs-operator">=</span> 0; i <span class="hljs-operator">&#x3C;</span> num; i<span class="hljs-operator">+</span><span class="hljs-operator">+</span> {
        fmt.Printf(<span class="hljs-string">"[+]Wallet : %d \n"</span>, i<span class="hljs-operator">+</span><span class="hljs-number">1</span>)
        entropy, <span class="hljs-keyword">_</span> :<span class="hljs-operator">=</span> bip39.NewEntropy(<span class="hljs-number">256</span>)
        mnemonic, <span class="hljs-keyword">_</span> :<span class="hljs-operator">=</span> bip39.NewMnemonic(entropy)
        fmt.Println(<span class="hljs-string">"[+]Mnemonic : "</span>, mnemonic)
        acc, <span class="hljs-keyword">_</span> :<span class="hljs-operator">=</span> account.NewAccountWithMnemonic(mnemonic)
        fmt.Printf(<span class="hljs-string">"[+]privateKey = %x\n"</span>, acc.PrivateKey[:<span class="hljs-number">32</span>])
        fmt.Printf(<span class="hljs-string">"[+] publicKey = %x\n"</span>, acc.PublicKey)
        fmt.Printf(<span class="hljs-string">"[+]   address = %v\n"</span>, acc.Address)
        wallet :<span class="hljs-operator">=</span> SuiWallet{}
        wallet.Mnemonic <span class="hljs-operator">=</span> mnemonic
        wallet.Address <span class="hljs-operator">=</span> acc.Address
        wallet.Private <span class="hljs-operator">=</span> fmt.Sprintf(<span class="hljs-string">"%x"</span>, acc.PrivateKey[:<span class="hljs-number">32</span>])
        wallet.Public <span class="hljs-operator">=</span> fmt.Sprintf(<span class="hljs-string">"%x"</span>, acc.PublicKey)
        wallets <span class="hljs-operator">=</span> append(wallets, wallet)
    }
        <span class="hljs-comment">//保存到本地json文件</span>
    walletsJson, <span class="hljs-keyword">_</span> :<span class="hljs-operator">=</span> json.Marshal(wallets)
    ioutil.WriteFile(<span class="hljs-string">"wallet.json"</span>, walletsJson, 0666)
}

func main() {
   <span class="hljs-comment">//创建100个钱包地址</span>
   Create(<span class="hljs-number">100</span>)
}
</code></pre><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/8a34cadd24d3d1286bedcb1ba257724443e42697fd802ffd38c1bff94971c749.png" alt="开始创建" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">开始创建</figcaption></figure>]]></content:encoded>
            <author>bsd@newsletter.paragraph.com (BSD)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/36ae83b4a278e12c228d7d0498f4438fad333d62b1798db19397287101dacc2d.jpg" length="0" type="image/jpg"/>
        </item>
    </channel>
</rss>