V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
myrual
V2EX  ›  推广

PHP 比特币教程第三课: 创建一个比特币钱包,查比特币余额,发送比特币

  •  
  •   myrual · 2019-02-21 15:34:11 +08:00 · 4061 次点击
    这是一个创建于 2135 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们已经创建过一个回复消息的机器人和一个能自动支付比特币的机器人.

    通过本教程的学习,你可以学到如下内容

    1. 如何创建一个比特币钱包.
    2. 如何读取比特币钱包的余额.
    3. 如何支付比特币并即时确认.
    4. 如何将 Mixin Network 的比特币提现到你的冷钱包或第三方交易所.

    通过 Mixin Network PHP SDK 创建一个比特币钱包

    前期准备:你要有一个 Mixin Network 账户。如果没有账户,一行代码就能创建一个

    $user_info = $mixinSdk->Network()->createUser("Tom cat");
    

    上面的语句会在本地创建一个 RSA 密钥对,然后调用 Mixin Network 来创建帐号,最后输出帐号信息.

    //Create User api include all account information
    print_r($user_info);
    print($user_info["pubKey"]);
    $newConfig = array();
    $newConfig["private_key"] = $user_info["priKey"];
    $newConfig["pin_token"]   = $user_info["pin_token"];
    $newConfig["session_id"]  = $user_info["session_id"];
    $newConfig["client_id"]   = $user_info["user_id"];
    

    帐号创建成功后结果如下:

    Array
    (
        [type] => user
        [user_id] => de06f952-6ec7-3789-8467-9aa79869a6ef
        [identity_number] => 0
        [full_name] => Tom cat
        [avatar_url] =>
        [relationship] =>
        [mute_until] => 0001-01-01T00:00:00Z
        [created_at] => 2019-02-20T12:29:29.86008273Z
        [is_verified] =>
        [session_id] => bc9293e5-ed9a-48da-99f9-915f561a1c60
        [phone] =>
        [pin_token] => TIPyCtRTTYOg2sr+lu0z2D3xS8SOtQAy0ZDnacRrn6u2ytutZinzeEpRTD9N1+DS/T1zJ8VoX4ED19nhF5SApjqjUaRjKI5lga4rQGcePjCvM0D89FdpmKJzNMLjzV2DglKFMPbnJTu1btfILc0XWiSNEiiFr2mHuLI7bYuQzWI=
        [invitation_code] =>
        [code_id] =>
        [code_url] => https://mixin.one/codes/
        [has_pin] =>
        [receive_message_source] => EVERYBODY
        [accept_conversation_source] => EVERYBODY
        [priKey] => -----BEGIN PRIVATE KEY-----
    MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALh0dSy2GcKek/Jp
    4lTMZxJ30AWP+inZ4c+FG+3ch3fenmXysCyM56hgvVZwh4RrRpvVjRt/NNE3k2Wg
    N9LNZqWXCmo4ae/hJjpwuj/EVR/1/HSebF9hcvMoTre8D0iLlk+rf1tgr/ZHmIoa
    8ef45xMBDargfsF4b5k7kUavU9/xAgMBAAECgYB1ShBMOwsMVxvKdIvn0gXkl20e
    bFvtis9szr5gtO8rSNK+DuD5oyuXRNSAh5OUn0ZJxzQv/OZP9x/x6jw0/kk7Aj6c
    jjN3beC7UoayDYms4yNFoWNPqZEXkQ0b2tRsF3mdNj6LVm6Gq7FPDD1TYJ4GR4eO
    cWHCkZWym26HbZ30AQJBAPNFeZ7nd9wQIzu0wN9isrZebnCko3yax64MDsUAsrmP
    B1wdHkdX0tJpCldighYD10Cyi+nSz3ODmmbPbLu8AjECQQDCGyi0lpCoV+skLVR0
    4weU99Msz1neqOw1khQCJLzUW8UdDhsVwfCdzCeuZrCz+gl/aZaJ6d+6rNTMp1hL
    ionBAkBEs34hTiUfVL9egTFm5KyrrAdscFJrQhraIDWblRLkLGxbqy194GN9YIS3
    IO6z4OnNL58rrYlAig30sud2LSZBAkEAjuNXT7kWvBYcbwE/jtwhlLPqrK3nRlWr
    rLPgLsPEjb8Ql5busVGXQ1IqU+QcaCDEJRshSlzz6YOZEx6NjO5rAQJAejvW3DmT
    RjUSDJD8hGr9eCpKQTBDXyUEvyLIMCuRmm9Cbz0HRl4aVXOVblVWoJ6YsGvbCkSl
    LQCrPL2T58JTkg==
    -----END PRIVATE KEY-----
    
        [pubKey] => -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4dHUsthnCnpPyaeJUzGcSd9AF
    j/op2eHPhRvt3Id33p5l8rAsjOeoYL1WcIeEa0ab1Y0bfzTRN5NloDfSzWallwpq
    OGnv4SY6cLo/xFUf9fx0nmxfYXLzKE63vA9Ii5ZPq39bYK/2R5iKGvHn+OcTAQ2q
    4H7BeG+ZO5FGr1Pf8QIDAQAB
    -----END PUBLIC KEY-----
    )
    

    现在你需要小心保管好你的帐号信息,在读取该账户的比特币资产余额或者进行其他操作时,将需要用到这些信息.

    给新建的帐号创建一个比特币钱包

    新账号并不默认内置比特币钱包, 现在读一下比特币余额就可以创建一个比特币钱包。

    $asset_infoNew = $mixinSdkNew->Wallet()->readAsset("c6d0c728-2624-429b-8e0d-d9d19b6592fa");
    echo "BitCoin wallet address is :".$asset_infoNew["public_key"];
    

    创建的帐号的比特币资产详细信息如下,其中 public key 就是比特币的存币地址:

    Array
    (
        [type] => asset
        [asset_id] => c6d0c728-2624-429b-8e0d-d9d19b6592fa
        [chain_id] => c6d0c728-2624-429b-8e0d-d9d19b6592fa
        [symbol] => BTC
        [name] => Bitcoin
        [icon_url] => https://images.mixin.one/HvYGJsV5TGeZ-X9Ek3FEQohQZ3fE9LBEBGcOcn4c4BNHovP4fW4YB97Dg5LcXoQ1hUjMEgjbl1DPlKg1TW7kK6XP=s128
        [balance] => 0
        [public_key] => 195p8R8Y15uzDGMrdVkELVUW2444psqiSq
        [account_name] =>
        [account_tag] =>
        [price_btc] => 1
        [price_usd] => 3928.11498197
        [change_btc] => 0
        [change_usd] => -0.006841408545228452
        [asset_key] => c6d0c728-2624-429b-8e0d-d9d19b6592fa
        [confirmations] => 12
        [capitalization] => 0
    )
    

    这个 API 能够提供若干与比特币有关的信息:

    • 存币地址:[public_key]
    • Logo: [icon_url]
    • 资产名字:[name]
    • 资产在 Mixin Network 的 uuid: [asset_key]
    • 对美元的价格(Coinmarketcap.com 提供): [price_usd]
    • 存币时确认的区块数量:[confirmations]

    比特币私钥呢?

    比特币的私钥呢?这个私钥被 Mixin Network 通过多重签名保护,所以对用户来说是不可见的,比特币资产的提现和转账都需要用户提供正确的的 RSA 签名,PIN 代码与会话密钥才能完成.

    不只是比特币,还有以太坊,EOS 等

    这个帐号不只支持比特币,还支持以太坊,EOS 等, 完整的区块链支持列表. 这个账户同时也支持所有的 ERC20 代币与 EOS 代币.

    创建其它的币的钱包与创建比特币钱包过程一样,读对应的资产余额就可以.

    EOS 的存币地址与其它的币有些不同,它由两部分组成:account_name and account tag, 如果你向 Mixin Network 存入 EOS,你需要填两项数据:account name 是eoswithmixin,备注里输入你的 account_tag,比如0aa2b00fad2c69059ca1b50de2b45569.

    EOS 的资产余额返回结果如下:

    Array
    (
        [type] => asset
        [asset_id] => 6cfe566e-4aad-470b-8c9a-2fd35b49c68d
        [chain_id] => 6cfe566e-4aad-470b-8c9a-2fd35b49c68d
        [symbol] => EOS
        [name] => EOS
        [icon_url] => https://images.mixin.one/a5dtG-IAg2IO0Zm4HxqJoQjfz-5nf1HWZ0teCyOnReMd3pmB8oEdSAXWvFHt2AJkJj5YgfyceTACjGmXnI-VyRo=s128
        [balance] => 0
        [public_key] =>
        [account_name] => eoswithmixin
        [account_tag] => 0aa2b00fad2c69059ca1b50de2b45569
        [price_btc] => 0.00097367
        [price_usd] => 3.87734515
        [change_btc] => 0.05950956117519646
        [change_usd] => 0.07238079041492786
        [asset_key] => eosio.token:EOS
        [confirmations] => 64
        [capitalization] => 0
    )
    

    存入比特币与读取比特币余额

    现在,你可以向比特币的钱包存币了。

    当然,在比特币网络里转币,手续费是相当贵的,费用的中位数在 0.001BTC,按当前 4000 美元的价格,在 4 美元左右,有一个方便的办法,如果你有Mixin Messenger帐号,里面并且有比特币的话,可以直接提现比特币到新创建的帐号的比特币充值地址,它们在同一个 Mixin Network 网络内,手续费为 0,而且 1 秒到账。

    下面的代码,可以读取比特币钱包余额.

    $btc = $mixinSdkNew->Wallet()->readAsset("c6d0c728-2624-429b-8e0d-d9d19b6592fa");
    print_r($btc);
    

    Mixin Network 网内免手续费的,并且即时确认

    任何币在 Mixin Network 内部的交易,都是无手续费的,并且立刻到账。 前期准备: 账户设置了 PIN

    对于新创建的帐号,我们通过 updatePin 来设置新 PIN 码, 代码如下:

    //Create a PIN.
    $pinInfo = $mixinSdkNew->Pin()->updatePin('',PIN);
    print_r($pinInfo);
    

    Mixin Network 帐号之间的比特币支付

    通过 Mixin Messenger,我们可以先转比特币给机器人,然后让机器人转币给新用户。

    $mixinSdk = new MixinSDK(require './config.php');
    //$user_info["user_id"] generated by create user;
    $trans_info = $mixinSdk->Wallet()->transfer(BTC_ASSET_ID,$user_info["user_id"],
                                             $mixinSdk->getConfig()['default']['pin'],AMOUNT);
    print_r($trans_info);
    

    读取 Bitcoin 的余额,来确认比特币是不是转成功了! 注意**$mixinSdkNew**是新用户的。

    $btc = $mixinSdkNew->Wallet()->readAsset(BTC_ASSET_ID);
    print_r($btc);
    

    如何将比特币存入你的冷钱包或者第三方交易所

    如果你希望将币存入你的冷钱包或者第三方交易所, 先要得到冷钱包或者你在第三方交易所的钱包地址,然后将钱包地址提交到 Mixin Network.

    • 要点提示: 提现是需要支付收续费的,准备好比特币包地址!

    增加目的钱包地址到 Mixin Network

    调用 createAddress API, 将会返回一个 address_id,下一步的提现操作会用到这个 id。

    $btcInfo = $mixinSdkNew->Wallet()->createAddress("c6d0c728-2624-429b-8e0d-d9d19b6592fa",
                                                        "14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C",
                                                        $mixinSdkNew->getConfig()['default']['pin'],
                                                        "BTC withdral",false);
    

    这里的 14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C 就是一个比特币钱包地址, 如下所示,提现费用是 0.0025738 BTC, address_id 是"345855b5-56a5-4f3b-ba9e-d99601ef86c1".

    Array
    (
        [type] => address
        [address_id] => 345855b5-56a5-4f3b-ba9e-d99601ef86c1
        [asset_id] => c6d0c728-2624-429b-8e0d-d9d19b6592fa
        [public_key] => 14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C
        [label] => BTC withdral
        [account_name] =>
        [account_tag] =>
        [fee] => 0.0025738
        [reserve] => 0
        [dust] => 0.0001
        [updated_at] => 2019-02-20T01:47:56.44067294Z
    )
    

    创建提现地址成功后,你可以用 readAddress 读取最新的提现费。

    $wdInfo = $mixinSdkNew->Wallet()->readAddress($btcInfo["address_id"]);
    

    提交提现请求,Mixin Network 会即时处理提现请求.

    提交提现请求到 Mixin Network, $btcInfo["address_id"]就是 createAddress 创建的。

    $wdInfo = $mixinSdkNew->Wallet()->withdrawal($btcInfo["address_id"],
                                "0.01",
                                $mixinSdkBot->getConfig()['default']['pin'],
                                "BTC withdral");
    

    可以通过 blockchain explore 来查看进度.

    完整的代码在这儿

    14 条回复    2019-02-28 16:35:26 +08:00
    liuyibao
        1
    liuyibao  
       2019-02-21 17:58:14 +08:00
    不错!
    tanxiaoluo
        2
    tanxiaoluo  
       2019-02-21 18:12:39 +08:00
    https://mixin.one/codes/ 这个 404 咯?
    adkudao
        3
    adkudao  
       2019-02-21 19:27:57 +08:00
    https://mixin.one 跑路了咋办?
    myrual
        4
    myrual  
    OP
       2019-02-21 19:34:27 +08:00
    @adkudao 2 月 28 日主网上线之后就是社区化运足了。不怕跑路了。
    myrual
        5
    myrual  
    OP
       2019-02-21 19:35:40 +08:00
    @tanxiaoluo 你是要找什么呢? Mixin Network 资源汇总在 https://github.com/awesome-mixin-network/index_of_Mixin_Network_resource
    nottheway
        6
    nottheway  
       2019-02-21 20:18:36 +08:00
    有个问题, 怎么防止双花? 以比特币交易为例子,
    >> 任何币在 Mixin Network 内部的交易,都是无手续费的,并且立刻到账
    从上面的描述看 "Mixin Network 内部的交易" 好像没有同步到外部真实的比特币网络.

    假设我有一个 Mixin 账号: Mx_A, 我往这个 Mx_A 充值 10 个比特币, 那么这笔交易是否会被同步到比特币网络,还是这笔交易只被 Mixin Network 记录? 如果这笔交易会同步到比特币网络, 那就是普通的一遍交易,仍然要收取手续费的,如果不同步到比特币网络,那么我把这 10 个比特币又转移到比特币网络中的一个地址,那么我岂不是在 Mixin Network 凭空多出了 10 个比特币,或者 Mixin Network 会检测到我把 10 个比特币已经转移到了其它地址,然后在 Mixin Network 里把我前面的 Mx_A 充值的 10 个比特币作废?
    Livid
        7
    Livid  
    MOD
       2019-02-21 20:21:31 +08:00
    营销内容请只能发到 /go/promotions 这个节点,你的其他主题已经被移动至此。
    myrual
        8
    myrual  
    OP
       2019-02-21 21:41:49 +08:00
    @Livid 好的。
    tanxiaoluo
        9
    tanxiaoluo  
       2019-02-22 09:33:47 +08:00
    #5 我正好看到正文里面有这个链接,就像看看各个资产的 code,结果过去 404 了
    tanxiaoluo
        10
    tanxiaoluo  
       2019-02-22 09:43:39 +08:00   ❤️ 1
    @nottheway 按照我的理解,理论上不会出现你说的那种问题。

    往 Mx_A 账号充值 10 个比特币,会被比特币网络和 Mixin Network 同时记录,是从比特币网络充值到了 Mixin 这个闪电网络,这个手续费跑不脱,然后你从 Mixin 提取比特币到比特币网络,也是一样道理,它的免手续费只是在闪电网络内部

    都同步了,也就没有后续问题,因为你没法直接掌握 Mx_A 账号的比特币私钥,它是被保护在 Mixin Network 中的
    myrual
        11
    myrual  
    OP
       2019-02-22 13:18:28 +08:00
    @tanxiaoluo 确认是个多余输出。已经告诉程序员删掉了。
    myrual
        12
    myrual  
    OP
       2019-02-22 13:20:00 +08:00   ❤️ 1
    @nottheway 主网上线之后所有交易都会经过 pbft 共识签名确认,并且同步到所有节点。只要节点不一起跑路,所有交易都在。资产就都在。
    myrual
        13
    myrual  
    OP
       2019-02-26 13:07:23 +08:00
    python 版本的第三课也做好了。https://www.v2ex.com/t/538840#reply0
    myrual
        14
    myrual  
    OP
       2019-02-28 16:35:26 +08:00
    https://www.v2ex.com/t/539614#reply0 主网上线了,欢迎找 bug
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1038 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:53 · PVG 04:53 · LAX 12:53 · JFK 15:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.