Java比特币开发教程Java编程在开放式交易所限价买卖比特币

上一章介绍了Exincore,你可以1秒完成资产的市价买卖。如果你想限定价格买卖,或者买卖一些exincore不支持的资产,你需要OceanOne。 方案二: 挂单Ocean.One交易所Ocean.one是基于Mixin Network的去中心化交易所,它中心化交易所一样友好。你可以在OceanOne上交易任何资产,只需要将你的币转给OceanOne, 将交易信息写在交易的memo里,OceanOne会在市场里列出你的交易需求,交易成功后,会将目标币转入到你的MixinNetwork帐上,它有三大特点与优势: 不需要在OceanOne注册不需要存币到交易所支持所有Mixin Network上能够转账的资产,所有的ERC20 EOS代币。预备知识:你先需要创建一个机器人, 方法在 教程一. 安装依赖包正如教程一里我们介绍过的, 我们需要依赖 mixin-java-sdk, 你应该先安装过它了,zhang/mixin_labs-java-bot/blob/master/README.md). Install required packages第四课, 在上一课中已经安装好了. 充币到 Mixin Network, 并读出它的余额.此处演示用 USDT购买BTC 或者 用BTC购买USDT。交易前,先检查一下钱包地址。完整的步骤如下: 检查比特币或USDT的余额,钱包地址。并记下钱包地址。从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。再检查一下币的余额,看到帐与否。(比特币的到帐时间是5个区块的高度,约100分钟)。比特币与USDT的充值地址是一样的。 private static final String BTC_ASSET_ID = "c6d0c728-2624-429b-8e0d-d9d19b6592fa"; private static final String EOS_ASSET_ID = "6cfe566e-4aad-470b-8c9a-2fd35b49c68d"; private static final String USDT_ASSET_ID = "815b0b1a-2764-3736-8faa-42d694fa620a"; MixinAPI mixinApiUser = generateAPI_FromCSV(); JsonObject asset = mixinApiUser.getAsset(BTC_ASSET_ID); System.out.println(asset); System.out.println("------------------------BTC------Information---------------------------"); System.out.println("The BTC wallet address is " + asset.get("public_key").getAsString()); System.out.println("The BTC wallet balance is " + asset.get("balance").getAsString()); System.out.println("-----------------------------------------------------------------------");取得Ocean.one的市场价格信息如何来查询Ocean.one市场的价格信息呢?你要先了解你交易的基础币是什么,如果你想买比特币,卖出USDT,那么基础货币就是USDT;如果你想买USDT,卖出比特币,那么基础货币就是比特币. ...

April 27, 2019 · 4 min · jiezi

去中心化交易所的意义在哪里

比特币作为一个点对点电子现金系统,却需要一个中心化的交易所来撮合交易。这虽然不符合点对点的精神。但是依然被客户迅速的接受了。 中心化交易所的风险资产安全封闭化运行的交易所的资金安全性高度依赖团队技术能力和信用。 因为内鬼和黑客破坏造成的损失非常多。 隐私安全这些交易所都要求用户提供身份信息。这是一个极大的风险,想象一下交易所如果倒闭,那么里面的身份信息一定会被卖掉。 基于以太坊和EOS的去中心化交易所方案ddex, 鲸交所 交易所无论基于以太坊,还是EOS,本身能交易的资产都太少。不能交易比特币,可是比特币的价值超过整个数字货币的一半,一个不能交易比特币的交易所是很难有价值的。 比特币的进展随着比特币脚本支持HTLC (Hash Time-Locked Contract)。现在已经可以实现比特币与莱特币,量子链的原子交换。原子交换的意思就是交易双方经过协商构造一个交易广播,只有自己把钱真的打给某个地址之后,才能动对方打转过来的币。这里有一个介绍 这个方案可以说是非常安全,而且非常有用。但是这个方案本身只能用于支持比特币脚本的那些语言,莱特币,量子。使用账户体系的以太坊和EOS就很难接入这个技术,导致稳定币也无法进入这个交易所。 合理的交易所应该是什么样子符合比特币精神的交易所应该 不需要注册不需要充值到交易所指定的钱包订单撮合成功后资金应该回到用户自己的钱包里面,而不是需要审批才能提走。但是只有比特币的精神还不够,这个交易所要对人们有用,就还需要两个特性: 支持比特币和主流币种,特别是稳定币。转账速度足够快,不能是以太坊上那个确认速度。还有那些特性是未来一定需要的呢? 自由添加交易对。为什么要填写申请表才能挂一个新的品种呢?不能直接就挂单么?小型社区自己发币自己组成交易市场难道不是很合理么?资产交易对公众可验证,但是匿名。买卖资产的动作被所有人知道难道不是一件很可怕的事情么?那么有这样的交易所么?有。 https://ocean.one, 无需注册,有一个Mixin Networt钱包就能挂单. Mixin Networ现在有很多种钱包,有6种sdk支持创建钱包。不需要充值到交易所账户撮合成功后直接资产到用户的Mixin Network钱包,非常安全。基于Mixin Network支持很多资产:比特币,USDT,ERC20,EOS token基于Mixin Network交易确认极快,挂单1秒钟,撮合1秒钟,打币1秒钟自由添加交易对,几乎可以买卖任何资产,无需审批。基于Mixin Network交易匿名但是可以验证挂单在这个交易所挂单就是把要卖的资产付到交易所地址,然后把要买的资产信息和价格写在付款memo里面。一旦撮合成功,资产原路返回用户钱包。 取消订单取消订单的方式也很直接,把要取消的订单号写在memo里面,然后付一笔足够小的任意资产给交易所就可以了。 这个交易所本身运行在Mixin Network这个公链上。这个主网代码开源而且已经上线了,现在有15个节点,还有5个节点即将加入。主网代码。 你也可以搭建一个交易所这个交易所是开源的的,所以任何人都可以搭建一个自己的交易所,可以设定自己的手续费。 不完美Ocean还不是一个完美的方案, 他的撮合依然是不上链的没有匹配的订单资产依然属于Ocean,目前Ocean是由Mixin 团队来搭建的。由于没有上币审批流程,所以需要在客户端展示交易对的详细信息来提高诈骗难度。一定会出现假BNB token谁能在去中心化交易场景下赚到钱如果只有少数人能赚到钱,那么注定这个模式走不下去。我们猜想一下谁能赚到钱。 建立撮合引擎的人他可以收手续费。但是这个场景下市场是充分开放的,人们换交易所的成本是0,一旦一个交易所性价比降低,人们将逃跑 在中心化交易所和去中心化交易所之间搬砖的人这个场景可以保护个人隐私,而且完成单笔交易无需二次充值提现,所以交易速度更快,因此理论上重视隐私和重视速度的用户会愿意多付一点钱来完成交易。因此此处一定有愿意来赚差价的商人。 钱包开发者由于开源特性,钱包开发者从用户那里可能不太容易赚到钱。 总结:在数字世界保护个人财产和隐私的路上,还有很长的路要走,大家共勉。

April 26, 2019 · 1 min · jiezi

我们应该相信那些狂热的天才工程师么

先声明一下,一个人逻辑好,数学好,不代表这个人是理性的。理性的意思是一个人能正确的认识现实情况,从而设定合理的目标。我国现实案例一则 狂热工程师的特点不断的添加特性他们觉得比特币脚本太简陋了,于是发明图灵完整的EVM虚拟机。后来者觉得EVM太low了于是引入更加高级的WASM,还有更狂热的把lua脚本都塞进来。 用区块链解决一切问题觉得区块链能解决很多问题,所以一定要搞一个特别酷的通用平台,如果只是专注转账简直不好意思见人。 藐视专业相信自己比数学家更厉害,能发明安全的哈希算法。 藐视市场相信一个商品的价格可以由数学公式来决定,而不是市场。 专断口口声声说自己是去中心化系统,却可以发出指令封禁别人账户。被人诟病之后,以打破之前的承诺为代价,直接强行部署新规则。 不承认现实情况设计一个高速的layer2,example1, example2, example3,却无法为比特币实现onchain或者offchain服务。 滥用比喻他们将自己定义为区块链届的TCP/IP层 根本不酷炫的实用主义开发者是如何做的收敛比特币直到今天也不是图灵完整。但是通过扎实的开发工作,实现了若干次稳妥而扎实的进步,支持了闪电网络。 专注没有那么大的野心,直到今天,比特币和闪电网络依然是点对点电子现金系统。 谦逊不自己发明新算法,不使用未经验证的算法。 不忘初心比特币和闪电网络一直以来都从permissionless出发,保证资金安全的前提下尝试提高性能。 承认有些问题无法彻底解决比特币就是51%算力说了算,BFT就是2f+1说了算。坏人太多怎么办?先打倒坏人。 TCP/IP是牛逼专家闭门想出来么?这里有一个帖子很有意思,简单说结论: 在计算机科学发展的历史上,一直就存在着实用化和理论上更为先进这两个声音的不断争执。而每每都是那个取得比较合适的折衷并且能真正符合实际需要的那一方才能胜出。

April 24, 2019 · 1 min · jiezi

Java比特币开发教程:Java编程买卖比特币

方案一: 通过ExinCore API进行币币交易Exincore 提供了基于Mixin Network的币币交易API. 你可以支付USDT给ExinCore, ExinCore会以最低的价格,最优惠的交易费将你购买的比特币转给你, 每一币交易都是匿名的,并且可以在链上进行验证,交易的细节只有你与ExinCore知道! ExinCore 也不知道你是谁,它只知道你的UUID. 预备知识:你先需要创建一个机器人, 方法在 教程一. 安装依赖包正如教程一里我们介绍过的, 我们需要依赖 mixin-java-sdk, 你应该先安装过它了, 这儿我们再安装其它的软件包.下载地址: mvnrepositorybuild.gradle.kts的dependencies,加入如下依赖的包: implementation("com.google.guava:guava:27.0.1-jre") implementation("commons-codec:commons-codec:1.11") implementation("com.auth0:java-jwt:3.8.0") compile(files("libs/mixin-java-sdk.jar")) implementation("com.squareup.okhttp3:okhttp:3.12.1") implementation("com.squareup.okio:okio:2.2.2") implementation("com.google.code.gson:gson:2.8.5") implementation("org.bouncycastle:bcprov-jdk16:1.46") implementation("org.apache.commons:commons-csv:1.6") implementation("org.msgpack:msgpack-core:0.8.16") implementation("com.fasterxml.jackson.core:jackson-databind:2.9.8") implementation("com.fasterxml.jackson.core:jackson-core:2.9.8") implementation("org.jetbrains.kotlin:kotlin-stdlib:1.3.30")充币到 Mixin Network, 并读出它的余额.通过ExinCore API, 可以进行BTC, USDT, EOS, ETH 等等交易, 此处演示用 USDT购买BTC 或者 用BTC购买USDT。交易前,先检查一下钱包地址。完整的步骤如下: 检查比特币或USDT的余额,钱包地址。并记下钱包地址。从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。再检查一下币的余额,看到帐与否。(比特币的到帐时间是5个块的高度,约100分钟)。比特币与USDT的充值地址是一样的。 private static final String BTC_ASSET_ID = "c6d0c728-2624-429b-8e0d-d9d19b6592fa"; private static final String EOS_ASSET_ID = "6cfe566e-4aad-470b-8c9a-2fd35b49c68d"; private static final String USDT_ASSET_ID = "815b0b1a-2764-3736-8faa-42d694fa620a"; MixinAPI mixinApiUser = generateAPI_FromCSV(); JsonObject asset = mixinApiUser.getAsset(BTC_ASSET_ID); System.out.println(asset); System.out.println("------------------------BTC------Information---------------------------"); System.out.println("The BTC wallet address is " + asset.get("public_key").getAsString()); System.out.println("The BTC wallet balance is " + asset.get("balance").getAsString()); System.out.println("-----------------------------------------------------------------------");查询ExinCore市场的价格信息如何来查询ExinCore市场的价格信息呢?你要先了解你交易的基础币是什么,如果你想买比特币,卖出USDT,那么基础货币就是USDT;如果你想买USDT,卖出比特币,那么基础货币就是比特币. ...

April 22, 2019 · 4 min · jiezi

Mixin Network送出1000美金给 Java SDK 赏金任务猎人

Mixin Network在1个月以前发布了赏金任务: 完善Java SDK如今作品揭晓: yuantops/mixin_java_sdk作者已经获得由CEO cedric 颁发的5 XIN token奖励,价值1000美金。到现在,支持Mixin network的sdk已经包括PHP, Java, C#, Node.js, Python,Go, Ruby编程入门教程内容包括创建聊天机器人,机器人收发比特币,创建独立的比特币钱包,和买卖比特币。入门教程演示代码已经包括PHP, Java, C#, Node.js, Python,Go。Mixin Network 资源汇总开发者资源汇总

April 20, 2019 · 1 min · jiezi

安倍慌了,中国码农都能2秒买到比特币?

ExinCore 提供了一个实时买卖API。买卖比特币和其他资产只需2两秒钟。1秒付款,1秒收款。资产始终在自己手里。支持exincore api的开源钱包:Python wallet多语言教程PHP 买卖比特币Go 买卖比特币Javascript 买卖比特币C#买卖比特币ExinCore是一个基于Mixin Network 公链的服务。Mixin Network为开发者提供了丰富的开发资料,开发者可以30分钟搭建自己的数字货币支付服务。

April 10, 2019 · 1 min · jiezi

Node.js买卖比特币 教程

通过 Nodejs 买卖BitcoinGithub Repo方案一: 通过ExinCore API进行币币交易Exincore 提供了基于Mixin Network的币币交易API.你可以支付USDT给ExinCore, ExinCore会以最低的价格,最优惠的交易费将你购买的比特币转给你, 每一币交易都是匿名的,并且可以在区块链上进行验证,交易的细节只有你与ExinCore知道!ExinCore 也不知道你是谁,它只知道你的UUID.预备知识:你先需要创建一个机器人, 方法在 教程一.安装依赖包正如教程一里我们介绍过的, 我们需要依赖 mixin-node-client, 你应该先安装过它了, 这儿我们再安装其它的软件包. yarn add fast-csv inquirer msgpack5 path pem-fileor npm i fast-csv inquirer msgpack5 path pem-file充币到 Mixin Network, 并读出它的余额.通过ExinCore API, 可以进行BTC, USDT, EOS, ETH 等等交易, 此处演示用 USDT购买BTC 或者 用BTC购买USDT。交易前,先检查一下钱包地址。完整的步骤如下:检查比特币或USDT的余额,钱包地址。并记下钱包地址。从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。再检查一下币的余额,看到帐与否。(比特币的到帐时间是5个区块的高度,约100分钟)。比特币与USDT的充值地址是一样的。 let aesKey = ‘’; const privateKeyBytes = pem.decode(Buffer.from(data[0])); const aesKeyBuffer = await oaepDecrypt( Buffer.from(data[1], ‘base64’), privateKeyBytes, ‘SHA-256’, Buffer.from(data[2]) ); aesKey = Buffer.from(aesKeyBuffer).toString(‘base64’); // console.log(aesKey); const newUserConfig = {clientId: data[3], aesKey: aesKey, privateKey: data[0], sessionId: data[2], clientSecret: “do not need”, assetPin: data[4]}; // console.log(newUserConfig); const newUserClient = new HttpClient(newUserConfig); if ( args.type === TYPE_ASSETS_INFO ) { const assetsInfo = await newUserClient.getUserAssets(); console.log(assetsInfo); } else if (args.type === TYPE_BITCOIN_INFO) { // console.log(‘You choice to 1:’, args); const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID); console.log(“Bitcoin address is “, assetInfo.public_key); console.log(“Bitcoin balance is “, assetInfo.balance); console.log(“Bitcoin price is (USD) “, assetInfo.price_usd);查询ExinCore市场的价格信息如何来查询ExinCore市场的价格信息呢?你要先了解你交易的基础币是什么,如果你想买比特币,卖出USDT,那么基础货币就是USDT;如果你想买USDT,卖出比特币,那么基础货币就是比特币. if ( args.type === TYPE_FETCH_USDT_MARKETINFO ) { // Make a request var instance = axios.create({ baseURL: ‘https://exinone.com/exincore/markets', timeout: 3000, headers: {‘X-Custom-Header’: ‘foobar’} }); instance.get(’?base_asset=’ + USDT_ASSET_ID) .then(function(response) { console.log(response.data.data); }); } else if ( args.type === TYPE_FETCH_BTC_MARKETINFO ) { var instance = axios.create({ baseURL: ‘https://exinone.com/exincore/markets', timeout: 3000, headers: {‘X-Custom-Header’: ‘foobar’} }); instance.get(’?base_asset=’ + BTC_ASSET_ID) .then(function(response) { console.log(response.data.data); }); }交易前,创建一个Memo!在第二章里,基于Mixin Network的 Nodejs 比特币开发教程: 机器人接受比特币并立即退还用户, 我们学习过退还用户比特币,在这里,我们除了给ExinCore支付币外,还要告诉他我们想购买的币是什么,即将想购买的币存到memo里。const bytes = Buffer.from( BTC_ASSET_ID.replace(/-/g, ‘’), ‘hex’);const memo = msgpack .encode({ A: bytes, }) .toString(‘base64’);console.log(memo);币币交易的完整流程转币给ExinCore时,将memo写入你希望购买的币,否则,ExinCore会直接退币给你!如果你想卖出比特币买入USDT,调用方式如下:const EXIN_BOT = “61103d28-3ac2-44a2-ae34-bd956070dab1”;const BTC_ASSET_ID = “c6d0c728-2624-429b-8e0d-d9d19b6592fa”;const EOS_ASSET_ID = “6cfe566e-4aad-470b-8c9a-2fd35b49c68d”;const USDT_ASSET_ID = “815b0b1a-2764-3736-8faa-42d694fa620a”;//change to your third exchange/cold btc wallet addressconst BTC_WALLET_ADDR = “14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C”;const EOS_WALLET_NAME = “huobideposit”;const EOS_WALLET_TAG = “1872050”;//change to your mixin messenger account ’s uuidconst MASTER_UUID = “0b4f49dc-8fb4-4539-9a89-fb3afc613747”;else if ( args.type === TYPE_EXCHANGE_BTC_USDT ) { // Pack memo const bytes = Buffer.from( USDT_ASSET_ID.replace(/-/g, ‘’), ‘hex’ ); const memo = msgpack .encode({ A: bytes, }) .toString(‘base64’); console.log(memo); // gaFBxBDG0McoJiRCm44N2dGbZZL6 const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID); console.log(“The Wallet ’s BTC balance is “, assetInfo.balance); if ( assetInfo.balance >= 0.0001 ) { const Obj = { assetId: BTC_ASSET_ID, recipientId: EXIN_BOT, traceId: newUserClient.getUUID(), amount: “0.0001”, memo: memo, } console.log(Obj); newUserClient.transferFromBot(Obj); } else { console.log(“Not enough BTC!”); }}如果你想卖出USDT买入比特币,调用方式如下:else if ( args.type === TYPE_EXCHANGE_USDT_BTC ) { // Pack memo const bytes = Buffer.from( BTC_ASSET_ID.replace(/-/g, ‘’), ‘hex’ ); const memo = msgpack .encode({ A: bytes, }) .toString(‘base64’); console.log(memo); const assetInfo = await newUserClient.getUserAsset(USDT_ASSET_ID); console.log(“The Wallet ’s BTC balance is “, assetInfo.balance); if ( assetInfo.balance >= 1 ) { const Obj = { assetId: USDT_ASSET_ID, recipientId: EXIN_BOT, traceId: newUserClient.getUUID(), amount: “1”, memo: memo, } console.log(Obj); newUserClient.transferFromBot(Obj); } else { console.log(“Not enough USDT!”); }}交易完成后,Exincore会将你需要的币转到你的帐上,同样,会在memo里,记录成交价格,交易费用等信息!你只需要按下面的方式解开即可!getSnapshots 读取钱包的交易记录。if ( args.type === TYPE_READ_SNAPSHOTS ) { const prompts = [ { name: ‘datetime’, type: ‘input’, message: “Input iso8601 datetime: “, }, ]; const answers = await inquirer.prompt(prompts); console.log(answers); console.log(encodeURIComponent(answers.datetime)); const snapshots = await newUserClient.getSnapshots({ limit: 10, asset: USDT_ASSET_ID, offset: answers.datetime, order: “ASC”}); // console.log(snapshots); snapshots.forEach(function(element) { if ( element.amount > 0) { if ( element.data != null ) { console.log(element.amount); console.log(element.data); const buf = Buffer.from(element.data, ‘base64’); console.log(msgpack.decode(buf)); const codeInt = msgpack.decode(buf).C; if ( codeInt === 1000 ) { console.log(“Successful Exchange”); } else { console.log(“Go to there get more info https://github.com/exinone/exincore#code error code: " + codeStr);} const hexStr = Buffer.from(msgpack.decode(buf).FA).toString(‘hex’); const uuid = ${hexStr.slice(0,8)}-${hexStr.slice(8,12)}-${hexStr.slice(12,16)}-${hexStr.slice(16,20)}-${hexStr.slice(20)}; console.log(“Asset uuid is :” + uuid); const priceStr = msgpack.decode(buf).P; console.log(“Price is :” + priceStr); const feeStr = msgpack.decode(buf).F; console.log(“Fee is :” + feeStr); console.log(“percent of Fee is :” + (feeStr/element.amount)* 100 + " %”); const tStr = msgpack.decode(buf).T; console.log(“T is :” + tStr); } } });}一次成功的交易如下:Make your choose 16: Read snapshotsYou choice to : { type: ‘16: Read snapshots’ }You wallet is : 0b10471b-1aed-3944-9eda-5ab947562761? Input iso8601 datetime: 2019-04-08T05:16:33.615253Z{ datetime: ‘2019-04-08T05:16:33.615253Z’ }2019-04-08T05%3A16%3A33.615253Z0.5228004hqFDzQPooVCnNTI0OC45OKFGqTAuMDAxMDQ5OKJGQcQQgVsLGidkNzaPqkLWlPpiCqFUoVKhT8QQeJyt3MrqSGOpbqzFXy5JUw=={ C: 1000, P: ‘5248.98’, F: ‘0.0010498’, FA: <Buffer 81 5b 0b 1a 27 64 37 36 8f aa 42 d6 94 fa 62 0a>, T: ‘R’, O: <Buffer 78 9c ad dc ca ea 48 63 a9 6e ac c5 5f 2e 49 53> }Successful ExchangeAsset uuid is :815b0b1a-2764-3736-8faa-42d694fa620aPrice is :5248.98Fee is :0.0010498percent of Fee is :0.2008032128514056 %T is :R You select the : 0b10471b-1aed-3944-9eda-5ab947562761You select the wallet 0b10471b-1aed-3944-9eda-5ab947562761读取币的余额通过读取币的余额,来确认交易情况!if (args.type === TYPE_BITCOIN_INFO) { // console.log(‘You choice to 1:’, args); const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID); console.log(“Bitcoin address is “, assetInfo.public_key); console.log(“Bitcoin balance is “, assetInfo.balance); console.log(“Bitcoin price is (USD) “, assetInfo.price_usd);}源代码执行编译执行,即可开始交易了.[x] node bitcoin-wallet-nodejs.js 编译项目.本代码执行时的命令列表:Make your choose(select the uuid for open the specified wallet): 0b10471b-1aed-3944-9eda-5ab947562761 You select the : 0b10471b-1aed-3944-9eda-5ab947562761You select the wallet 0b10471b-1aed-3944-9eda-5ab947562761?Make your choose (Use arrow keys)0: Read All Asssets Balance1: Read Bitcoin Balance & Address2: Read USDT Balance & Address3: Read EOS Balance & Address4: Transfer BTC from Bot to Wallet5: Transfer EOS from Bot to Wallet6: Transfer BTC from Wallet to Master7: Transfer EOS from Wallet to Master8: Verify Wallet PIN9: BTC withdraw10: EOS withdraw11: Fetch BTC withdrawal info12: Fetch EOS withdrawal info13: Fetch USDT Market info14: Fetch BTC Market info14: Transfer 0.0001 BTC buy USDT15: Transfer USDT $1 buy BTC16: Read snapshotsExit完整代码Solution Two: List your order on Ocean.One exchange ...

April 10, 2019 · 4 min · jiezi

Nodejs 比特币开发教程: 创建比特币钱包

基于Mixin Network的 Nodejs 比特币开发教程: 创建比特币钱包我们已经创建过一个回复消息的机器人和一个能自动支付比特币的机器人.通过本教程的学习,你可以学到如下内容如何创建一个比特币钱包.如何读取比特币钱包的余额.如何支付比特币并即时确认.如何将Mixin Network的比特币提现到你的冷钱包或第三方交易所.前期准备:你要有一个Mixin Network账户。下面的代码创建一个帐号,并写到csv文件里。console.log(“create wallet ….”);const { generateKeyPairSync } = require(‘crypto’);const { publicKey, privateKey } = generateKeyPairSync(‘rsa’,{ modulusLength: 1024, // the length of your key in bits publicKeyEncoding: { type: ‘spki’, // recommended to be ‘spki’ by the Node.js docs format: ‘pem’ }, privateKeyEncoding: { type: ‘pkcs1’, // recommended to be ‘pkcs8’ by the Node.js docs format: ‘pem’, //cipher: ‘aes-256-cbc’, // optional //passphrase: ’top secret’ // optional }});publicKey1 = publicKey.replace("—–BEGIN PUBLIC KEY—–","");publicKey2 = publicKey1.replace("—–END PUBLIC KEY—–","");publicKey3 = publicKey2.replace(/\r?\n|\r/g, “”);console.log(publicKey);console.log(publicKey3);(async () => { const info = await clientBot.createUser({full_name : “nodejs bitcoin wallet”, session_secret: publicKey3, });上面的语句会在本地创建一个RSA密钥对,然后调用Mixin Network来创建帐号,最后保存帐号信息到csv文件. let aesKey = ‘’; const privateKeyBytes = pem.decode(Buffer.from(privateKey)); const aesKeyBuffer = await oaepDecrypt( Buffer.from(info.pin_token, ‘base64’), privateKeyBytes, ‘SHA-256’, Buffer.from(info.session_id) ); aesKey = Buffer.from(aesKeyBuffer).toString(‘base64’); console.log(aesKey); var csvStream = csv.createWriteStream({headers: false, ignoreEmpty: true}), writableStream = fs.createWriteStream(WalletName, {flags: ‘a’}); writableStream.on(“finish”, function(){ console.log(“Bitcoin wallet DONE!”); }); csvStream.pipe(writableStream); csvStream.write({a: privateKey, b: info.pin_token, c: info.session_id, d: info.user_id, e: “123456”} ); csvStream.end(); fs.appendFile(WalletName, require(“os”).EOL, function(){}); const newUserConfig = {clientId: info.user_id, aesKey: aesKey, privateKey: privateKey, sessionId: info.session_id, clientSecret: “do not need”, assetPin: “123456”}; console.log(newUserConfig); const newUserClient = new HttpClient(newUserConfig); var info2 = await newUserClient.updatePin({oldPin : “”, newPin: “123456”, }); console.log(info2); const verifyPin = await newUserClient.verifyPin(“123456”); console.log({ verifyPin });现在你需要小心保管好你的帐号信息,在读取该账户的比特币资产余额或者进行其他操作时,将需要用到这些信息.给新建的帐号创建一个比特币钱包新账号并不默认内置比特币钱包, 现在读一下比特币余额就可以创建一个比特币钱包。 const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID); console.log(“Bitcoin address is “, assetInfo.public_key); console.log(“Bitcoin balance is “, assetInfo.balance); console.log(“Bitcoin price is (USD) “, assetInfo.price_usd);创建的帐号的比特币资产详细信息如下,其中public key就是比特币的存币地址: Make your choose(select the uuid for open the specified wallet): 0b10471b-1aed-3944-9eda-5ab947562761 You select the : 0b10471b-1aed-3944-9eda-5ab947562761 You select the wallet 0b10471b-1aed-3944-9eda-5ab947562761 ? Make your choose 1: Read Bitcoin Balance & Address You choice to : { type: ‘1: Read Bitcoin Balance & Address’ } You wallet is : 0b10471b-1aed-3944-9eda-5ab947562761 Bitcoin address is 15MySY7UnA827TRMQWuCKGiogCYXUmt21M Bitcoin balance is 0 Bitcoin price is (USD) 5029.59915767 You select the : 0b10471b-1aed-3944-9eda-5ab947562761 You select the wallet 0b10471b-1aed-3944-9eda-5ab947562761这个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 代币.创建其它的币的钱包与创建比特币钱包过程一样,读对应的资产余额就可以.Mixin Network 当前支持的加密货币 (2019-02-19)cryptouuid in Mixin NetworkEOS6cfe566e-4aad-470b-8c9a-2fd35b49c68dCNB965e5c6e-434c-3fa9-b780-c50f43cd955cBTCc6d0c728-2624-429b-8e0d-d9d19b6592faETC2204c1ee-0ea2-4add-bb9a-b3719cfff93aXRP23dfb5a5-5d7b-48b6-905f-3970e3176e27XEM27921032-f73e-434e-955f-43d55672ee31ETH43d61dcd-e413-450d-80b8-101d5e903357DASH6472e7e3-75fd-48b6-b1dc-28d294ee1476DOGE6770a1e5-6086-44d5-b60f-545f9d9e8ffdLTC76c802a2-7c88-447f-a93e-c29c9e5dd9c8SC990c4c29-57e9-48f6-9819-7d986ea44985ZENa2c5d22b-62a2-4c13-b3f0-013290dbac60ZECc996abc9-d94e-4494-b1cf-2a3fd3ac5714BCHfd11b6e3-0b87-41f1-a41f-f0e9b49e5bf0EOS的存币地址与其它的币有些不同,它由两部分组成: account_name and account tag, 如果你向Mixin Network存入EOS,你需要填两项数据: account name 是eoswithmixin,备注里输入你的account_tag,比如0aa2b00fad2c69059ca1b50de2b45569.EOS的资产余额返回结果如下: Make your choose 3: Read EOS Balance & Address You choice to : { type: ‘3: Read EOS Balance & Address’ } You wallet is : 0b10471b-1aed-3944-9eda-5ab947562761 EOS account name is eoswithmixin tag is 30f0c36057b9b22151173b309bd0d79c EOS balance is 0 EOS price is (USD) 5.26225922 You select the : 0b10471b-1aed-3944-9eda-5ab947562761 You select the wallet 0b10471b-1aed-3944-9eda-5ab947562761存入比特币与读取比特币余额现在,你可以向比特币的钱包存币了。当然,在比特币网络里转币,手续费是相当贵的,费用的中位数在0.001BTC,按当前4000美元的价格,在4美元左右,有一个方便的办法,如果你有Mixin Messenger帐号,里面并且有比特币的话,可以直接提现比特币到新创建的帐号的比特币充值地址,它们在同一个Mixin Network网络内,手续费为0,而且1秒到账。下面的代码,可以读取比特币钱包余额. const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID); console.log(“Bitcoin address is “, assetInfo.public_key); console.log(“Bitcoin balance is “, assetInfo.balance); console.log(“Bitcoin price is (USD) “, assetInfo.price_usd);Mixin Network网内免手续费的,并且即时确认任何币在Mixin Network内部的交易,都是无手续费的,并且立刻到账。前期准备: 账户设置了PIN对于新创建的帐号,我们通过updatePin来设置新PIN码, 代码如下: var info2 = await newUserClient.updatePin({oldPin : “”, newPin: “123456”, }); console.log(info2); const verifyPin = await newUserClient.verifyPin(“123456”); console.log({ verifyPin });Mixin Network帐号之间的比特币支付通过Mixin Messenger,我们可以先转比特币给机器人,然后让机器人转币给新用户。 const assetInfo = await newUserClient.getUserAsset(EOS_ASSET_ID); console.log(“The Wallet ’s EOS balance is “, assetInfo.balance); if ( assetInfo.balance > 0 ) { const Obj = { assetId: BTC_ASSET_ID, recipientId: MASTER_UUID, traceId: newUserClient.getUUID(), amount: assetInfo.balance, memo: ‘’, }; console.log(Obj); newUserClient.transferFromBot(Obj); }读取Bitcoin的余额,来确认比特币是不是转成功了! 注意newUserClient是新用户的。 const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID); console.log(“Bitcoin address is “, assetInfo.public_key); console.log(“Bitcoin balance is “, assetInfo.balance);如何将比特币存入你的冷钱包或者第三方交易所如果你希望将币存入你的冷钱包或者第三方交易所, 先要得到冷钱包或者你在第三方交易所的钱包地址,然后将钱包地址提交到Mixin Network.要点提示: 提现是需要支付收续费的,准备好比特币包地址!增加目的钱包地址到Mixin Network调用createAddress API, 将会返回一个address_id,下一步的提现操作会用到这个id。 const withdrawAddress = await newUserClient.createWithdrawAddress({ assetId: BTC_ASSET_ID, label: ‘BTC withdraw’, publicKey: BTC_WALLET_ADDR, });这里的 14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C 就是一个比特币钱包地址, 如下所示,提现费用是0.0025738 BTC, address_id 是"345855b5-56a5-4f3b-ba9e-d99601ef86c1”.Make your choose 9: BTC withdrawYou choice to : { type: ‘9: BTC withdraw’ }You wallet is : 0b10471b-1aed-3944-9eda-5ab947562761{ type: ‘address’, address_id: ‘a513da38-a18a-4536-abe4-d1c29ca3a1a8’, asset_id: ‘c6d0c728-2624-429b-8e0d-d9d19b6592fa’, public_key: ‘14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C’, label: ‘BTC withdraw’, account_name: ‘’, account_tag: ‘’, fee: ‘0.00212232’, reserve: ‘0’, dust: ‘0.0001’, updated_at: ‘2019-04-04T02:20:42.552274992Z’ }? Input you BTC amount:创建提现地址成功后,你可以用readAddress读取最新的提现费。 const addressList = await newUserClient.getWithdrawAddress(BTC_ASSET_ID); console.log(addressList);提交提现请求,Mixin Network会即时处理提现请求.提交提现请求到 Mixin Network, withdrawAddress.address_id 就是createAddress创建的。 console.log(withdrawAddress); const prompts = [ { name: ‘amount’, type: ‘input’, message: “Input you BTC amount: “, }, ]; const answers = await inquirer.prompt(prompts); console.log(answers); const withdrawResult = await newUserClient.withdraw({ addressId: withdrawAddress.address_id, assetId: BTC_ASSET_ID, amount: answers.amount, memo: ‘withdraw by nodejs’, }); console.log(withdrawResult);可以通过blockchain explore来查看进度.完整的代码在这儿 ...

April 5, 2019 · 3 min · jiezi

如何开发一款以太坊安卓钱包系列3 - 资产信息展示

这是如何开发以太坊(安卓)钱包系列第3篇, 钱包账号资产信息展示,展示信息主要包括账号地址、eth余额及该账号所拥有的Token及余额。预备知识 MVVM本文会涉及和UI界面的交互,提前理解下界面和数据如何交互是非常有必要的,如果你已经很熟悉MVVM,可跳过这一小节。最早写Android的时候,数据和界面经常耦合在一起,一个Activity文件总是特别大,每当产品界面改版就非常痛苦,吐槽下,很多产品经理都喜欢对界面改来改去。后来Google 推荐多个架构模式: MPV、 MVVM模式来解决数据和UI耦合的问题,登链钱包代码,使用的就是MVVM模式,所以对它做一个简单介绍,下面是MVVM的视图和数据的交互图:View 通常对应于Activity/Fragment/自定义ViewModel:则是和数据相关的模块。View 与 Model 不直接发生联系, 而是通过ViewModel负责接收View层的事件以及获取并处理数据,ViewModel层的数据变化也会通知给View层进行相应的UI的更新,从而实现业务逻辑和Ui的隔离。使用MVVM模式最大的优点就是解耦, 因为数据处理逻辑是独立于View, 在UI更改时,ViewModel 不用做太多改动。我们使用了Google在I/O大会推出的一套遵循MVVM开发模式的LiveData和ViewModel组件架构。ViewModel 和 LiveDataViewModel 会关注UI生命周期来存储和管理数据,在Activity发生变化(锁屏开屏、旋转)时,ViewModel 会自动保留之前的数据并给新的Activity或Fragment使用,当界面被系统销毁时,ViewModel也会进行资源清理,避免内存泄漏。ViewModel 还可以用于不同界面间数据共享。LiveData是一个可观察的数据持有者类。观察者可以方便我们以异步的方式获取数据,同时LiveData也是有生命周期感知的。如果其生命周期处于STARTED或RESUMED状态。LiveData会将观察者视为活动状态,并通知其数据的变化。LiveData未注册的观察对象以及非活动观察者是不会收到有关更新的通知。了解更多,可自行以关键字: Lifecycle、ViewModel、LiveData 进行搜索。账号信息展示展示信息主要包括账号地址、eth余额及该账号所拥有的Token及余额, 其界面效果如下:这个界面应的是登链钱包的PropertyFragment,上图的UPT 是我自己发行的Token,所以没有显示价格现在我们来思考一下, 怎么来展现上面的数据, 别着急往下看, 可以先想想。先对问题做一个拆分,把数据拆分为4个部分:显示当前选中的账号显示当前账号 ETH 余额显示当前账号下 Token 数量显示对应的法币金额。为了避免 UI 与上面4个数据的耦合,代码使用了一个TokensViewModel, 获取到的数据用 LiveData做了一个Wrap,以便UI可以订阅数据,TokensViewModel类像下面,代码有删减:public class TokensViewModel extends ViewModel { private final MutableLiveData<ETHWallet> defaultWallet; private final MutableLiveData<NetworkInfo> defaultNetwork; private final MutableLiveData<Token[]> tokens; private final MutableLiveData<Ticker> prices;}MutableLiveData 是前面提到的 LiveData的子类,在UI界面中就可以对数据进行订阅,下面我们逐一拆解下每个数据。显示当前账号可以分为两个步骤:从数据库中读取账号;界面显示账号TokensViewModel中定义了一个MutableLiveData<ETHWallet> defaultWallet ,从数据库中读取账号会保存在defaultWallet中,然后UI对 defaultWallet 进行观察显示。注解: 登链钱包 里大量使用的这个方式,通过一个LiveData 做数据桥接。在上一篇导入账号及账号管理,所有的账号使用greenDao 存储起来, 因此我们只需要把所有账号从加载出来,挑选出当前选中的那一个。 结合代码看一看:// WalletDaoUtils.java public static ETHWallet getCurrent() { List<ETHWallet> ethWallets = ethWalletDao.loadAll(); for (ETHWallet ethwallet : ethWallets) { if (ethwallet.isCurrent()) { ethwallet.setCurrent(true); return ethwallet; } } return null; }上面代码先用 ETHWalletDao.loadAll 加载出所有的账号,返回当前选中的,上面的代码会被FetchWalletInteract 类的 findDefault方法调用,在ViewModle里,很多时候以数据进行交互的类,我们会命名为 xxxInteract,这也是一个习惯用法。其代码如下: // FetchWalletInteract.java // 返回一个可订阅的Single<ETHWallet> 对象 public Single<ETHWallet> findDefault() { return Single.fromCallable(() -> { return WalletDaoUtils.getCurrent(); }).subscribe(this::onDefaultWallet); } // 获取到默认钱包账号 设置到 defaultWallet 这个LiveData private void onDefaultWallet(ETHWallet wallet) { defaultWallet.setValue(wallet); }findDefault()返回一个可订阅的Single<ETHWallet> 对象,如果不熟悉可参考后面的文档。之后,在UI界面 PropertyFragment.java 中, 就可以对 defaultWallet 进行订阅:tokensViewModel.defaultWallet().observe(this, this::showWallet);当获取到默认账号时,就会回调showWallet:// UI 显示 public void showWallet(ETHWallet wallet) { tvWalletName.setText(wallet.getName()); tvWalletAddress.setText(wallet.getAddress()); }这样, 界面的显示就完成了,下一篇继续介绍获取余额。参考文档lifecycle官方文档地址RxAndroid 了解更多响应式编程我创建了一个专门讨论钱包开发的微信群,加微信:xlbxiong 备注:钱包。加入知识星球,和一群优秀的区块链从业者一起学习。深入浅出区块链 - 系统学习区块链,学区块链的都在这里,打造最好的区块链技术博客。本文原文链接 ...

April 4, 2019 · 1 min · jiezi

通过 C# 买卖Bitcoin

方案一: 通过ExinCore API进行币币交易Exincore 提供了基于Mixin Network的币币交易API.你可以支付USDT给ExinCore, ExinCore会以最低的价格,最优惠的交易费将你购买的比特币转给你, 每一币交易都是匿名的,并且可以在区块链上进行验证,交易的细节只有你与ExinCore知道!ExinCore 也不知道你是谁,它只知道你的UUID.预备知识:你先需要创建一个机器人, 方法在 教程一.安装依赖包正如教程一里我们介绍过的, 我们需要依赖 mixin-csharp-sdk, 你应该先安装过它了, 这儿我们再安装 MsgPack.Cli 软件包. dotnet add package MixinCSharpSdk dotnet add package MsgPack.Cli –version 1.0.1充币到 Mixin Network, 并读出它的余额.通过ExinCore API, 可以进行BTC, USDT, EOS, ETH 等等交易, 此处演示用 USDT购买BTC 或者 用BTC购买USDT。交易前,先检查一下钱包地址。完整的步骤如下:检查比特币或USDT的余额,钱包地址。并记下钱包地址。从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。再检查一下币的余额,看到帐与否。(比特币的到帐时间是5个区块的高度,约100分钟)。比特币与USDT的充值地址是一样的。 MixinApi mixinApiNewUser = new MixinApi(); mixinApiNewUser.Init(UserIDNewUser, “”, SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser); Asset AssetBTC = mixinApiNewUser.ReadAsset(USRCONFIG.ASSET_ID_BTC); Console.WriteLine(“New User " + UserIDNewUser + " ’s BTC balance is " + AssetBTC.balance); Console.WriteLine(“New User " + UserIDNewUser + " ’s BTC address is " + AssetBTC.public_key);查询ExinCore市场的价格信息如何来查询ExinCore市场的价格信息呢?你要先了解你交易的基础币是什么,如果你想买比特币,卖出USDT,那么基础货币就是USDT;如果你想买USDT,卖出比特币,那么基础货币就是比特币.string jsonData = FetchMarketPrice(“815b0b1a-2764-3736-8faa-42d694fa620a”);var marketObj = JsonConvert.DeserializeObject<MarketInfo>(jsonData);foreach (AssetInfo value in marketObj.data){ Console.WriteLine(value);}public class MarketInfo{ public string code { get; set; } public string message { get; set; } public List<AssetInfo> data { get; set; } public override string ToString() { return JsonConvert.SerializeObject(this); }}public class AssetInfo{ public string base_asset { get; set; } public string base_asset_symbol { get; set; } public string exchange_asset_symbol { get; set; } public string price { get; set; } public string minimum_amount { get; set; } public string maximum_amount { get; set; } public List<string> exchanges { get; set; } public override string ToString() { return JsonConvert.SerializeObject(this); }}public static string FetchMarketPrice(string asset_id){ return FetchMarketPriceAsync(asset_id).Result;}public static async Task<string> FetchMarketPriceAsync(string asset_id){ HttpClient client = new HttpClient(); // Call asynchronous network methods in a try/catch block to handle exceptions try { HttpResponseMessage response = await client.GetAsync(“https://exinone.com/exincore/markets?base_asset=" + asset_id); response.EnsureSuccessStatusCode(); string responseBody = await response.Content.ReadAsStringAsync(); // Above three lines can be replaced with new helper method below // string responseBody = await client.GetStringAsync(uri); Console.WriteLine(responseBody); return responseBody; } catch(HttpRequestException e) { Console.WriteLine("\nException Caught!”); Console.WriteLine(“Message :{0} “,e.Message); } return null;}交易前,创建一个Memo!在第二章里,基于Mixin Network的 C# 比特币开发教程: 机器人接受比特币并立即退还用户, 我们学习过退还用户比特币,在这里,我们除了给ExinCore支付币外,还要告诉他我们想购买的币是什么,即将想购买的币存到memo里。private static string TargetAssetID(string asset_id) { Guid guid = new Guid(asset_id); var gbytes = guid.ToByteArray(); Array.Reverse(gbytes,0,4); Array.Reverse(gbytes,4,2); Array.Reverse(gbytes,6,2); var serializer = MessagePackSerializer.Get(gbytes.GetType()); var stream = new MemoryStream(); serializer.Pack(stream, gbytes); return Convert.ToBase64String(stream.ToArray());}币币交易的完整流程转币给ExinCore时,将memo写入你希望购买的币,否则,ExinCore会直接退币给你!如果你想卖出比特币买入USDT,调用方式如下://config.cspublic static string EXIN_BOT = “61103d28-3ac2-44a2-ae34-bd956070dab1”;// public static string EXIN_BOT = “0b1a2027-4fd6-3aa0-b3a3-814778bb7a2e”;public static string MASTER_UUID = “0b4f49dc-8fb4-4539-9a89-fb3afc613747”;public static string ASSET_ID_BTC = “c6d0c728-2624-429b-8e0d-d9d19b6592fa”;public static string ASSET_ID_EOS = “6cfe566e-4aad-470b-8c9a-2fd35b49c68d”;public static string ASSET_ID_USDT= “815b0b1a-2764-3736-8faa-42d694fa620a”;//Program.csif (cmd == “5” ) { var memo = TargetAssetID(USRCONFIG.ASSET_ID_USDT); Console.WriteLine(memo); using (TextReader fileReader = File.OpenText(@“mybitcoin_wallet.csv”)) { var csv = new CsvReader(fileReader); csv.Configuration.HasHeaderRecord = false; while (csv.Read()) { string PrivateKeyNewUser; csv.TryGetField<string>(0, out PrivateKeyNewUser); string PinTokenNewUser; csv.TryGetField<string>(1, out PinTokenNewUser); string SessionIDNewUser; csv.TryGetField<string>(2, out SessionIDNewUser); string UserIDNewUser; csv.TryGetField<string>(3, out UserIDNewUser); string PinNewUser; csv.TryGetField<string>(4, out PinNewUser); MixinApi mixinApiNewUser = new MixinApi(); mixinApiNewUser.Init(UserIDNewUser, “”, SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser); // Console.WriteLine(mixinApiNewUser.CreatePIN(””, “123456”).ToString()); Transfer reqInfo = mixinApiNewUser.Transfer(USRCONFIG.ASSET_ID_BTC, USRCONFIG.EXIN_BOT, “0.0001”, PinNewUser.ToString(), System.Guid.NewGuid().ToString(), memo); Console.WriteLine(reqInfo); } }}如果你想卖出USDT买入比特币,调用方式如下:if (cmd == “6” ) { var memo = TargetAssetID(USRCONFIG.ASSET_ID_BTC); Console.WriteLine(memo); using (TextReader fileReader = File.OpenText(@“mybitcoin_wallet.csv”)) { var csv = new CsvReader(fileReader); csv.Configuration.HasHeaderRecord = false; while (csv.Read()) { string PrivateKeyNewUser; csv.TryGetField<string>(0, out PrivateKeyNewUser); string PinTokenNewUser; csv.TryGetField<string>(1, out PinTokenNewUser); string SessionIDNewUser; csv.TryGetField<string>(2, out SessionIDNewUser); string UserIDNewUser; csv.TryGetField<string>(3, out UserIDNewUser); string PinNewUser; csv.TryGetField<string>(4, out PinNewUser); MixinApi mixinApiNewUser = new MixinApi(); mixinApiNewUser.Init(UserIDNewUser, “”, SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser); // Console.WriteLine(mixinApiNewUser.CreatePIN(””, “123456”).ToString()); Transfer reqInfo = mixinApiNewUser.Transfer(USRCONFIG.ASSET_ID_USDT, USRCONFIG.EXIN_BOT, “1”, PinNewUser.ToString(), System.Guid.NewGuid().ToString(), memo); Console.WriteLine(reqInfo); } }}交易完成后,Exincore会将你需要的币转到你的帐上,同样,会在memo里,记录成交价格,交易费用等信息!你只需要按下面的方式解开即可!NetworkSnapshots 读取钱包的交易记录。using (TextReader fileReader = File.OpenText(@“mybitcoin_wallet.csv”)){ var csv = new CsvReader(fileReader); csv.Configuration.HasHeaderRecord = false; while (csv.Read()) { string PrivateKeyNewUser; csv.TryGetField<string>(0, out PrivateKeyNewUser); string PinTokenNewUser; csv.TryGetField<string>(1, out PinTokenNewUser); string SessionIDNewUser; csv.TryGetField<string>(2, out SessionIDNewUser); string UserIDNewUser; csv.TryGetField<string>(3, out UserIDNewUser); string PinNewUser; csv.TryGetField<string>(4, out PinNewUser); MixinApi mixinApiNewUser = new MixinApi(); mixinApiNewUser.Init(UserIDNewUser, “”, SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser); // Console.WriteLine(mixinApiNewUser.CreatePIN("", “123456”).ToString()); var snaps = mixinApiNewUser.NetworkSnapshots(10,“2019-03-26T01:49:52.462741863Z”, “815b0b1a-2764-3736-8faa-42d694fa620a”, “ASC”,true); // Console.WriteLine(snaps); foreach (var sn in snaps) { if ( Convert.ToDouble(sn.amount) > 0 ) { if ( sn.data != null ) { var memoBytes = Convert.FromBase64String(sn.data); var memoObj = MessagePackSerializer.UnpackMessagePackObject(memoBytes); Console.WriteLine(memoObj.ToString()); var xR = JsonConvert.DeserializeObject<ExchangeResult>(memoObj.ToString()); Console.WriteLine(xR.C); if (xR.C == “1000”) { Console.WriteLine("———–Successfully–Exchange————-"); Console.WriteLine(“You got " + sn.amount.ToString() + " back!”); Console.WriteLine(“Price is " + xR.P + " Fee is " + xR.F + " Percent of fee: " + Convert.ToDouble(xR.F)/Convert.ToDouble(sn.amount)*100 + " %”); Console.WriteLine(“Fee Asset uuid: " + HexStringToUUID(xR.FA)); Console.WriteLine(“trace uuid: " + HexStringToUUID(xR.O)); Console.WriteLine(”———-end of snapshots query————–”); } } } } }}一次成功的交易如下:———–Successfully–Exchange————-You got 0.3923244 back!Price is 3938.62 Fee is 0.0007878 Percent of fee: 0.200803212851406 %Fee Asset uuid: 815b0b1a-2764-3736-8faa-42d694fa620atrace uuid: 1a3d8561-26e7-49bb-8ae3-ed85ce2bb957———-end of snapshots query————–读取币的余额通过读取币的余额,来确认交易情况! MixinApi mixinApiNewUser = new MixinApi(); mixinApiNewUser.Init(UserIDNewUser, “”, SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser); Asset AssetBTC = mixinApiNewUser.ReadAsset(USRCONFIG.ASSET_ID_BTC); Console.WriteLine(“New User " + UserIDNewUser + " ’s BTC balance is " + AssetBTC.balance); Console.WriteLine(“New User " + UserIDNewUser + " ’s BTC address is " + AssetBTC.public_key);源代码执行编译执行,即可开始交易了.[x] dotnet build 编译项目.[x] dotnet bin/Debug/netcoreapp2.2/bitcoin_wallet.dll 运行它.本代码执行时的命令列表:1: Create Bitcoin Wallet and update PIN2: Read Bitcoin balance & address3: Read USDT balance & address4: Read EOS balance & address5: pay 0.0001 BTC buy USDT6: pay $1 USDT buy BTC7: Read Snapshots8: Fetch market price(USDT)9: Fetch market price(BTC)v: Verify Wallet Pinq: ExitMake your choose:完整代码Solution Two: List your order on Ocean.One exchange ...

March 31, 2019 · 4 min · jiezi

跨链技术的分析和思考

当前的区块链底层技术平台百花齐放,不同的业务、不同的技术底层的区块链之间缺乏统一的互联互通的机制,这极大限制了区块链技术和应用生态的健康发展。跨链的需求由此而来,本文通过分析几种主流的跨链方案探讨跨链技术的本质及相应的解决思路。<!– more –>跨链的类型跨链交互根据所跨越的区块链底层技术平台的不同可以分为同构链跨链和异构链跨链:同构链之间安全机制、共识算法、网络拓扑、区块生成验证逻辑都一致,它们之间的跨链交互相对简单。而异构链的跨链交互相对复杂,比如比特币采用PoW算法而联盟链Fabric采用传统确定性共识算法,其区块的组成形式和确定性保证机制均有很大不同,直接跨链交互机制不易设计。异构链之间的跨链交互一般需要第三方辅助服务辅助跨链交互。主流跨链机制概述截至目前,主流的区块链跨链技术方案按照其具体的实现方式主要分为三大类,分别是公证人机制、侧链/中继和哈希锁定:公证人机制(Notary schemes): 公证人也称见证人机制,公证人机制本质上是一种中介的方式。具体而言,假设区块链A和B本身是不能直接进行互操作的,那么他们可以引入一个共同信任的第三方作为中介,由这个共同信任的中介进行跨链消息的验证和转发。公证人机制的优点在于能够灵活地支持各种不同结构的区块链(前提是公证人能够访问相关方的链上信息),缺点在于存在中心化风险。哈希锁定(Hash-locking): 哈希锁定技术主要是支持跨链中的原子资产交换,最早起源自比特币的闪电网络。其典型实现是哈希时间锁定合约HTLC(Hashed TimeLock Contract)。哈希锁定的原理是通过时间差和影藏哈希值来达到资产的原子交换。哈希锁定只能做到交换而不能做到资产或者信息的转移,因此其使用场景有限。侧链/中继链(Sidechains / Relays): 侧链是指完全拥有某链的功能的另一条区块链,侧链可以读取和验证主链上的信息。主链不知道侧链的存在,由侧链主动感知主链信息并进行相应的动作。而中继链则是侧链和公证人机制的结合体,中继链具有访问需要和验证进行互操作的链的关键信息并对两条链的跨链消息进行转移。从这个角度看中继链也是一种去中心的公证人机制。下面就这几种跨链方式的典型实现方式进行详细分析:典型跨链机制实现分析公证人机制最传统的公证人机制是基于中心化交易所得跨链资产交换,这种跨链的方式比较单一,只支持资产的交换,如下图演示了Alice通过交易所,用比特币和Bob交换ETH的过程。 Alice 通过交易所钱包将自己的比特币打入交易所地址;Alice 在交易所上挂上卖单1个BTC卖出20ETH价格;Bob需要将自己的ETH打入交易所的以太坊地址;Bob通过交易所挂出购买比特币的单子 20ETH买一个比特币;交易所将Alice的卖单和Bob的卖单进行撮合;交易所将Alice在交易所存储的1BTC 转移给Bob的比特币地址;交易所将Bob在交易所存储的20ETH 转移给Alice的以太坊地址;至此完成了Alice和Bob的BTC和ETH的交换(案例中省去了交易所的服务费)。通过该例子可以看出交易所的方式目前仅能够支持资产的交换,且资产交换的原子性、安全性完全由中心化的交易所保障存在较大的中心化风险。除此之外还有一种著名的分布式账本技术Ripple,也是采用类似公证人的机制来解决全球金融机构之间的资产交换。Ripple的系统架构如上图所示,Ripple系统中交易通过网络中的验证者进行交易的验证,验证者验证的交易通过加密算法保护交易内容不能被验证着窥探从而保证交易的隐私性。公证人机制的跨链技术实现简单,且能够比较灵活地支持不同类型的底层区块链体系。公证人机制的主要问题在于公证人机制的安全性保障完全由公证人系统保障。参与跨链的相关方需要对中间人给予较大的信任。哈希锁定哈希时间锁定(HTLC)最早出现在比特币的闪电网络,跨链资产交换支持一定数量的A链资产和一定数量的B链资产进行原子交换。哈希时间锁定巧妙地采用了哈希锁和时间锁,迫使资产的接收方在deadline内确定收款并产生一种收款证明给打款人,否则资产会归还给打款人。收款证明能够被付款人用来获取接收人区块链上的等量价值的数量资产或触发其他事件。如下图所示,我们用一个例子来阐述如何使用哈希时间锁定进行跨链的原子资产交换,假设Alice和Bob有资产交换的需求,Alice想用1个BTC和Bob换20个ETH. 那么首先需要在两条链上设置哈希时间锁定合约,然后执行如下步骤:Alice 随机构建一个字符串s,并计算出其哈希 h = hash(s);Alice 将h发送给Bob的合约;Alice锁定自己的1个BTC资产,并设置一个较长的锁定时间t1, 并设置了获取该BTC的一个条件:谁能够提供h的原始值s就可以得到该BTC;Bob观察到Alice 合约中锁定了一个BTC, 然后Bob锁定自己的20个ETH资产,并设置一个相对较短的锁定时间t2, t2 < t1, Bob也设置了同样获取条件(谁提供h的原始值s就可以获取20个ETH);Alice将自己最初生成的字符串s 发送到Bob的合约里取得了20个ETH;Bob观察到步骤5中Alice的s值,将其发送给Alice的合约成功获取1个BTC; 至此Alice和Bob完成了资产的交换。从上述的过程我们可以看出哈希时间锁定合约有一些约束条件:进行跨链资产交换的双方必须能够解析双方的合约内部数据,例如s,例如锁定资产的证明等;哈希锁定的超时时间设置时需要保证存在时间差,这样在单方面作弊时另一方可以及时撤回自己的资产。哈希锁定的思想运用在支付领域较多,例如闪电网络、雷电网络以及跨链资产转移协议Interledger等。但是哈希锁定目前看只适合偏资产或者关键数据的交换,甚至不支持转移因此其试用场景受限。侧链/中继链侧链侧链是相对于主链而言的,最初的侧链提出是针对比特币做新特性的测试和研发。侧链相对主链而言能够验证和解析主链中的区块数据和账本数据。侧链实现的基础技术是双向锚定(Two-way Peg),通过双向锚定技术可以将数字资产在主链上进行锁定,同时将等价的资产在侧链中释放。相反当侧链中相关资产进行锁定时,主链上锚定的等价资产也可以被释放。BTC-Relay是号称的史上第一个侧链,BTC-Relay是通过以太坊构建了一个比特币的侧面,运用以太坊的智能合约允许用户验证比特币的交易。这里我们仍然以Alice 1BTC和Bob的20ETH数字资产交换为例阐述相应原理:Bob将20ETH发送到BTCSwap的合约进行冻结;(该合约只要能够确认BTC网络上Bob接收到来自Alice 1BTC就自动将20ETH转给Alice)Alice 确认Bob冻结信息后,将1 BTC转给Bob比特币账户;BTC Relayer将比特币区块头推送到BTCSwap合约;Alice 接下来就可以调用relay tx;BTCSwap合约结合tx和BTC链的区块链进行SPV验证,验证通过则将20ETH转给Alice以太坊地址。这种跨链的实现方式简单,但是BTC Relay需要额外的信任和维护成本,且智能合约内部的数据存储会有体积膨胀的问题。但是侧链的机制相对哈希锁定而言能够提供更多的跨链交互场景,侧链以及类SPV验证的思想适合所有跨链的场景。中继链中继链本质上算是公证人机制和侧链机制的融合和扩展,目前社区内最活跃的两个跨链项目Cosmos 和 Polkadot 采用的都是基于中继链的多链多层架构,其中Cosmos目前支持的是跨链资产交互而Polkadot则宣称提供任意类型的跨链交互,具体实现还有待观察。CosmosCosmos网络是一个多链混合的区块链网格结构,如下图所示,该网络中主要包括两种角色:Hub: 用于处理跨链交互的中继链;Zone: Cosmos中的平行链, Cosmos中平行链需要具备两个前提条件: 1. 快速确定性(fast finality), 这个特性由共识算法保障,也就是说Cosmos的跨链不直接支持PoW等概率确定模型的区块链; 2. 强监管性(Sovereignty):每个平行链都具有一组验证者能够决定其出块。 为了支持平行链之间的跨链互操作,Cosmos提出了一种跨链交互协议IBC(Inter-Blockchain Communication protocol), 并利用tendermint共识算法的即时确定性实现多个异构链之间的价值和数据传输。首先我们以Chain A 到Chain B 转账10 token为例说明使用IBC的跨链交互: 1. 互相跟踪,也就是说如果A要和B进行跨链交易,那么A和B链需要分别运行相当于对方区块链的轻节点服务,这样互相可以实时接收到对方的区块头信息(方便后续执行类SPV验证); 2. A链上初始化IBC协议,冻结相关资产10 token, 并生成相应的证明发送给B区块链; 3. B链接收到相应的IBC消息,通过A链的区块头信息确定A确实进行相应的资产冻结,然后B链会生成等价值10 token的资产。以上是使用IBC协议的两个平行链直接进行跨链的基本过程,如果区块链很多,那么这种方式的两两跨链复杂度会呈现组合级别增加。因此Cosmos网络又引入了一种Hub的中继链,所有的平行链都通过IBC连接到Hub,让Hub辅助跨链交易的验证和转移,目前Cosmos实现了一个官方的Hub称为Cosmos Hub(如前图所示)。如下图所示是Cosmos 网络的详细架构图,Cosmos为方便平行链开发提供了基本服务CosmosSDK包括:共识、网络以及IBC协议等,这样基于Cosmos SDK开发的子链之间都能够方便地互相交互。此外对于非Cosmos SDK 开发的区块链需要使用Peg Zone进行桥接,如图中的Ethereum。笔者认为Cosmos为跨链带来的最大贡献在于IBC协议的设计,IBC协议提供了一种通用的跨链协议标准。IBC的设计使得跨链交易可以在多个Hub之间进行安全路由和转发,类似目前互联网的TCP/IP 协议。但是遗憾的是目前的Cosmos设计也只能够支持资产的跨链,而且由于不同区块链的业务不同其共识速率的不一致也会影响跨链交易有效性的证明。PolkadotPolkadot也是一种集成平行链和中继链的多层多链架构,Polkadot区块链的整体架构图如下图所示,主要包含三种角色链和四种参与方:三种链角色:中继链(Relay chain): 中继链位于Polkadot的体系的核心地位,主要是为整个系统提供统一的共识和安全性保障;平行链(Parachain): 在Polkadot中平行链负责具体的业务场景,平行链自身不具备区块的共识,它们将共识的职责渡让给了中继链,所有平行链共享来自中继链的安全保障,中继链是Polkadot组成的一部分;桥接链:桥接链指的是非Polkadot体系之外的区块链,如Bitcoin, Ethereum, 这些区块链有自身的共识算法,它们通过不同的Bridge与Polkadot连接在一起进行跨链交互。四种参与方:验证者(Validator): 验证者负责Polkadot的网络出块,会运行一个中继链的客户端,在每一轮区块产生中会对其提名的平行链出的块进行核验。当平行链的跨都被他们的子验证者集合确定好之后,验证者们会将所有平行链区块头组装到中继链的区块并进行共识。核验人(Collator): 帮助验证者收集、验证和提交备选平行链区块,维护了一个平行链的全节点。钓鱼人(Fisherman):钓鱼人主要靠检举非法交易或者区块以获取收益;提名人(Nominator): 拥有stake的相关方,维护和负责验证者的安全性。Polkadot的特性包括两个,一个是共享安全性,一个是不需信任的跨链交互。这里的不需信任的跨链交互其实是和第一个特点共享安全性密切相关的,而且Polkadot的不需信任的跨链交互也主要是只其内部的平行链之间。在Polkadot中如果parachain A 需要发送一笔交易到parachain B的过程如下:A链将跨链交易放到自己的engress(每个平行链有一个消息输出队列engress 和一个消息输入队列ingress);A链的Collator收集A链的普通交易以及跨链交易并提交给A链的验证者集合;A链的验证者集合验证成功,将本次A链的区块头信息以及A链的engress内信息提交到中继链上;中继链运行共识算法进行区块确认以及跨链交易路由,中继链上的验证者会将A链的相应交易从A链的engress queue中移动到B链的ingress queue中。B链执行区块,将ingress queue中相应交易执行并修改自身账本。以上便是Polkadot跨链交易的主要步骤,由于所有平行链的共识同步发生(中继链区块示意图如下),因此跨链交易不会有诸如双花等安全性问题。Polkadot 的平行链之间的跨链交换的安全性保障主要来自共享安全性这个特点,共享安全性使得跨链交易和普通交易同步发生也就不存在其他跨链场景中的双花等跨链数据不一致问题。其次Polkadot中的引入的特殊状态验证方法方便中继链进行跨链等消息的有效性验证。值得一提的是Polkadot项目目前还处在项目初期,对于parachain的设计、Collator的协作以及Validator的共识、工作效率等都未完善。这种共享安全性的方式是否也限制了平行链自身的性能都还有待考证。关于跨链技术的几点思考综合以上的一些主流跨链场景和方案的分析,从跨链的概念以及需求上看跨链的本质其实就是 如何将A链上的消息M安全可信地转移到B链并在B链上产生预期效果。那么一个成功的跨链交互到底需要解决哪些问题呢?笔者认为主要有以下四个问题:消息M的真实性证明,也就是说M是否确实是存在A链上的,也确实是A链发给B链的;消息M的路由,如何让跨链消息安全跨系统路由;消息M的有效性证明,这里的有效性是指来自A链的消息M如何让B链认可其抵达B链时状态仍然有效,比如转移的资产是否是冻结的,没有双花的,如果是状态那么是否在此期间未发生改变等;消息M的执行结果证明,这个是指A链需要确认跨链操作是否成功,以及成功操作的相应回执。那么针对这些关键本质问题,如何去处理呢?笔者设想未来的区块链应该在底层平台的设计之初就需要遵循统一的跨链协议标准,就像现在的操作系统对TCP/IP协议的支持一样。需要进行通用跨链的区块链至少要支持一下功能:提供跨链消息的输入和输出口径,例如Cosmos和Polkadot的跨链队列;提供跨链消息的真实性证明,区块链需要提供类似SPV的证明手段;消息的有效路由需要构建跨链消息的统一格式,定义好消息的来源和去处以及消息内容,如Cosmos的IBC协议;消息的有效性证明,区块链可能需要设计新的类似UTXO的可验证存储结构,方便做类SPV类验证,否则目前的基于KV的数据存储方式做有效性证明几乎不可能;跨链执行结果证明,和有效性证明类似,需要全新的数据结构和运行算法支持。除此之外,跨链系统的设计还需要考虑系统稳定性、可扩展性以及易升级性、容错等等,总而言之,真正的可信互联网建设艰辛蛮长,诸君共勉!本文经作者授权转自BITKING深入浅出区块链 - 系统学习区块链,打造最好的区块链技术博客。????本文原文链接 ...

March 26, 2019 · 1 min · jiezi

Python 开发比特币教程汇总

创建一个接受消息的机器人机器人接受比特币并立即退还用户创建比特币钱包其他编程语言比特币开发教程如下:PHP 比特币开发教程Go 比特币开发教程Java 比特币开发教程Node.js 比特币开发教程C# 比特币开发教程Mixin Network 开发者资源汇总

March 13, 2019 · 1 min · jiezi

5 XIN token 悬赏: Mixin Network Java SDK 补完计划

任务目标: 完善现有的Java SDK,使其可以支持Mixin Network所有的API。奖金: 5 XIN (约值 $700) 给最佳方案提供者流程:通过邮件 lilin at mixin.one, 或者 Mixin Messenger ID 31367 联系负责人创建Github开源库,写代码,告诉我库的地址时间安排:请于2019年4月12日之前提交完代码。最终结果将于2019年4月20日之前公布。Mixin Network开发者资源汇总Python 比特币教程PHP 比特币教程Go 比特币教程Java 比特币教程Node.js 比特币教程C# 比特币教程

March 12, 2019 · 1 min · jiezi

基于Mixin Network的Go语言比特币开发系列教程汇总

创建机器人机器人收比特币,发比特币创建独立的比特币钱包,查余额,转账其他编程语言比特币开发教程如下:PHP 比特币开发教程Python 比特币开发教程Java 比特币开发教程Node.js 比特币开发教程开发者资源汇总

March 9, 2019 · 1 min · jiezi

基于Mixin Network的PHP比特币开发教程: 创建比特币钱包

我们已经创建过一个回复消息的机器人和一个能自动支付比特币的机器人.通过本教程的学习,你可以学到如下内容如何创建一个比特币钱包.如何读取比特币钱包的余额.如何支付比特币并即时确认.如何将Mixin Network的比特币提现到你的冷钱包或第三方交易所.前期准备:你要有一个Mixin Network账户。如果没有账户,一行代码就能创建一个$user_info = $mixinSdk->Network()->createUser(“Tom cat”);上面的语句会在本地创建一个RSA密钥对,然后调用Mixin Network来创建帐号,最后输出帐号信息.//Create User api include all account informationprint_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/Jp4lTMZxJ30AWP+inZ4c+FG+3ch3fenmXysCyM56hgvVZwh4RrRpvVjRt/NNE3k2WgN9LNZqWXCmo4ae/hJjpwuj/EVR/1/HSebF9hcvMoTre8D0iLlk+rf1tgr/ZHmIoa8ef45xMBDargfsF4b5k7kUavU9/xAgMBAAECgYB1ShBMOwsMVxvKdIvn0gXkl20ebFvtis9szr5gtO8rSNK+DuD5oyuXRNSAh5OUn0ZJxzQv/OZP9x/x6jw0/kk7Aj6cjjN3beC7UoayDYms4yNFoWNPqZEXkQ0b2tRsF3mdNj6LVm6Gq7FPDD1TYJ4GR4eOcWHCkZWym26HbZ30AQJBAPNFeZ7nd9wQIzu0wN9isrZebnCko3yax64MDsUAsrmPB1wdHkdX0tJpCldighYD10Cyi+nSz3ODmmbPbLu8AjECQQDCGyi0lpCoV+skLVR04weU99Msz1neqOw1khQCJLzUW8UdDhsVwfCdzCeuZrCz+gl/aZaJ6d+6rNTMp1hLionBAkBEs34hTiUfVL9egTFm5KyrrAdscFJrQhraIDWblRLkLGxbqy194GN9YIS3IO6z4OnNL58rrYlAig30sud2LSZBAkEAjuNXT7kWvBYcbwE/jtwhlLPqrK3nRlWrrLPgLsPEjb8Ql5busVGXQ1IqU+QcaCDEJRshSlzz6YOZEx6NjO5rAQJAejvW3DmTRjUSDJD8hGr9eCpKQTBDXyUEvyLIMCuRmm9Cbz0HRl4aVXOVblVWoJ6YsGvbCkSlLQCrPL2T58JTkg==—–END PRIVATE KEY—– [pubKey] => —–BEGIN PUBLIC KEY—–MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4dHUsthnCnpPyaeJUzGcSd9AFj/op2eHPhRvt3Id33p5l8rAsjOeoYL1WcIeEa0ab1Y0bfzTRN5NloDfSzWallwpqOGnv4SY6cLo/xFUf9fx0nmxfYXLzKE63vA9Ii5ZPq39bYK/2R5iKGvHn+OcTAQ2q4H7BeG+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 代币.创建其它的币的钱包与创建比特币钱包过程一样,读对应的资产余额就可以.Mixin Network 当前支持的加密货币 (2019-02-19)cryptouuid in Mixin NetworkEOS6cfe566e-4aad-470b-8c9a-2fd35b49c68dCNB965e5c6e-434c-3fa9-b780-c50f43cd955cBTCc6d0c728-2624-429b-8e0d-d9d19b6592faETC2204c1ee-0ea2-4add-bb9a-b3719cfff93aXRP23dfb5a5-5d7b-48b6-905f-3970e3176e27XEM27921032-f73e-434e-955f-43d55672ee31ETH43d61dcd-e413-450d-80b8-101d5e903357DASH6472e7e3-75fd-48b6-b1dc-28d294ee1476DOGE6770a1e5-6086-44d5-b60f-545f9d9e8ffdLTC76c802a2-7c88-447f-a93e-c29c9e5dd9c8SC990c4c29-57e9-48f6-9819-7d986ea44985ZENa2c5d22b-62a2-4c13-b3f0-013290dbac60ZECc996abc9-d94e-4494-b1cf-2a3fd3ac5714BCHfd11b6e3-0b87-41f1-a41f-f0e9b49e5bf0EOS的存币地址与其它的币有些不同,它由两部分组成: 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来查看进度.完整的代码在这儿 ...

March 8, 2019 · 2 min · jiezi

基于Mixin Network的Go语言比特币开发教程 : 用 Mixin Messenger 机器人接受和发送比特币

基于Mixin Network的Go语言比特币开发教程 : 用 Mixin Messenger 机器人接受和发送比特币在 上一篇教程中, 我们创建了自动回复消息的机器人,当用户发送消息"Hello,World!“时,机器人会自动回复同一条消息!按本篇教程后学习后完成后,你的机器人将会接受用户发送过来的加密货币,然后立即转回用户。完整代码如下:main.gofpackage mainimport ( “context” “encoding/base64” “encoding/json” “log” “github.com/MooooonStar/mixin-sdk-go/messenger” mixin “github.com/MooooonStar/mixin-sdk-go/network”)type Listener struct { *messenger.Messenger}// interface to implement if you want to handle the messagefunc (l *Listener) OnMessage(ctx context.Context, msg messenger.MessageView, userId string) error { data, err := base64.StdEncoding.DecodeString(msg.Data) if err != nil { return err } if msg.Category == “SYSTEM_ACCOUNT_SNAPSHOT” { var transfer messenger.TransferView if err := json.Unmarshal(data, &transfer); err != nil { return err } log.Println(“I got a coin: “, transfer.Amount) mixin.Transfer(msg.UserId,transfer.Amount,transfer.AssetId,”",messenger.UuidNewV4().String(), PinCode,PinToken,UserId,SessionId,PrivateKey) return nil // return l.SendPlainText(ctx, msg.ConversationId, msg.UserId, string(data)) } else if msg.Category == “PLAIN_TEXT” { log.Printf(“I got a message, it said: %s”, string(data)) if string(data) == “g” { payLinkEOS := “https://mixin.one/pay?recipient=" + msg.UserId + “&asset=” + “6cfe566e-4aad-470b-8c9a-2fd35b49c68d” + “&amount=” + “0.1” + “&trace=” + messenger.UuidNewV4().String() + “&memo=” payLinkBTC := “https://mixin.one/pay?recipient=" + msg.UserId + “&asset=” + “c6d0c728-2624-429b-8e0d-d9d19b6592fa” + “&amount=” + “0.001” + “&trace=” + messenger.UuidNewV4().String() + “&memo=” log.Println(payLinkBTC) BtnEOS := messenger.Button{Label: “Pay EOS 0.1”, Color: “#0080FF”, Action: payLinkEOS} BtnBTC := messenger.Button{Label: “Pay BTC 0.0001”, Color: “#00FF80”, Action: payLinkBTC} if err := l.SendAppButtons(ctx, msg.ConversationId, msg.UserId, BtnEOS, BtnBTC); err != nil { return err } return nil } else if string(data) == “a” { card := messenger.AppCard{Title: “Pay BTC 0.0001”, Description: “topay”, Action: “http://www.google.cn”, IconUrl: “https://images.mixin.one/HvYGJsV5TGeZ-X9Ek3FEQohQZ3fE9LBEBGcOcn4c4BNHovP4fW4YB97Dg5LcXoQ1hUjMEgjbl1DPlKg1TW7kK6XP=s128"} if err := l.SendAppCard(ctx, msg.ConversationId, msg.UserId, card); err != nil { return err } return nil } else if string(data) == “r” { mixin.Transfer(msg.UserId,“0.0001”,“c6d0c728-2624-429b-8e0d-d9d19b6592fa”,”",messenger.UuidNewV4().String(), PinCode,PinToken,UserId,SessionId,PrivateKey) return nil } else { return l.SendPlainText(ctx, msg.ConversationId, msg.UserId, string(data)) } } else { log.Println(“Unknown message!”, msg.Category) return err }}const ( UserId = “21042518-85c7-4903-bb19-f311813d1f51” PinCode = “911424” SessionId = “4267b63d-3daa-449e-bc13-970aa0357776” PinToken = “gUUxpm3fPRVkKZNwA/gk10SHHDtR8LmxO+N6KbsZ/jymmwwVitUHKgLbk1NISdN8jBvsYJgF/5hbkxNnCJER5XAZ0Y35gsAxBOgcFN8otsV6F0FAm5TnWN8YYCqeFnXYJnqmI30IXJTAgMhliLj7iZsvyY/3htaHUUuN5pQ5F5s=” //please delele the blank of PrivateKey the before each line PrivateKey = -----BEGIN RSA PRIVATE KEY-----MIICXQIBAAKBgQCDXiWJRLe9BzPtXmcVe6acaFTY9Ogb4Hc2VHFjKFsp7QRVCytx3KC/LRojTFViwwExaANTZQ6ectwpAxIvzeYeHDZCXCh6JRFIYK/ZuREmYPcPQEWDs92Tv/4XTAdTH8l9UJ4VQY4zwqYMak237N9xEvowT0eR8lpeJG0jAjN97QIDAQABAoGADvORLB1hGCeQtmxvKRfIr7aEKak+HaYfi1RzD0kRjyUFwDQkPrJQrVGRzwCqGzJ8mUXwUvaGgmwqOJS75ir2DL8KPz7UfgQnSsHDUwKqUzULgW6nd/3OdDTYWWaNcDjbkEpsVchOpcdkywvZhhyGXszpM20Vr8emlBcFUOTfpTUCQQDVVjkeMcpRsImVU3tPYyiuqADhBTcgPBb+Ownk/87jyKF1CZOPvJAebNmpfJP0RMxUVvT4B9/U/yxZWNLhLtCXAkEAnaOEuefUxGdE8/55dUTEb7xrr22mNqykJaax3zFK+hSFBrM3gUY5fEETtHnl4gEdX4jCPybRVc1JSFY/GWoyGwJBAKoLti95JHkErEXYavuWYEEHLNwvmgcZnoI6cOKVfEVYEEoHvhTeCkoWHVDZOd2EURIQ1eY18JYIZ0M4Z66R8DUCQCsKiKTR3dA6eiM8qiEQw6nWgniFscpf3PnCx/Iu3U/m5mNr743GhM+eXSj7136b209IYfEoQiPxRz8O/W+NBV0CQQDVPxqJlFD34MC9aQN42l3NV1hDsl1+nSkWkXSyhhNRMpobtV1a7IgJGyt5HxBzgNlBNOayICRf0rRjvCdw6aTP-----END RSA PRIVATE KEY-----)func main() { ctx := context.Background() m := messenger.NewMessenger(UserId, SessionId, PrivateKey) l := &Listener{m} go m.Run(ctx, l) select {}}你好, 比特币!在项目目录下编译并执行cd mixin_labs-go-botgo build./mixin_labs-go-bot开发者可以通过消息面板,给机器人转比特币,当机器人收到比特币后,马上返还给用户!事实上,用户可以发送任意的币种给机器人,它都能马上返还!源代码解释if msg.Category == “SYSTEM_ACCOUNT_SNAPSHOT” { var transfer messenger.TransferView if err := json.Unmarshal(data, &transfer); err != nil { return err } log.Println(“I got a coin: “, transfer.Amount) mixin.Transfer(msg.UserId,transfer.Amount,transfer.AssetId,”",messenger.UuidNewV4().String(), PinCode,PinToken,UserId,SessionId,PrivateKey) return nil // return l.SendPlainText(ctx, msg.ConversationId, msg.UserId, string(data))}调用SDK的 mixin.Transfer 将币返还用户!高级用法APP_BUTTON_GROUP在一些应用场景,比如:有一个交易所想提供换币服务,将比特币换成以太坊,EOS,比特币现金等,你想显示给用户一组按钮,它们分别代表不同的币与不同的数量,APP_BUTTON_GROUP可以帮你做到这一点.payLinkEOS := “https://mixin.one/pay?recipient=" + msg.UserId + “&asset=” + “6cfe566e-4aad-470b-8c9a-2fd35b49c68d” + “&amount=” + “0.1” + “&trace=” + messenger.UuidNewV4().String() + “&memo=“payLinkBTC := “https://mixin.one/pay?recipient=" + msg.UserId + “&asset=” + “c6d0c728-2624-429b-8e0d-d9d19b6592fa” + “&amount=” + “0.001” + “&trace=” + messenger.UuidNewV4().String() + “&memo=“log.Println(payLinkBTC)BtnEOS := messenger.Button{Label: “Pay EOS 0.1”, Color: “#0080FF”, Action: payLinkEOS}BtnBTC := messenger.Button{Label: “Pay BTC 0.001”, Color: “#00FF80”, Action: payLinkBTC}if err := l.SendAppButtons(ctx, msg.ConversationId, msg.UserId, BtnEOS, BtnBTC); err != nil { return err}这里演示给用户BTC与EOS两种,你还可以增加更多的按钮.APP_CARD如果你觉得一组按钮太单调了,可以试一下APP_CARD,它提供一个图标的链接card := messenger.AppCard{Title: “CNB”, Description: “Chui Niu Bi”, Action: “http://www.google.cn”, IconUrl: “https://images.mixin.one/0sQY63dDMkWTURkJVjowWY6Le4ICjAFuu3ANVyZA4uI3UdkbuOT5fjJUT82ArNYmZvVcxDXyNjxoOv0TAYbQTNKS=s128"}if err := l.SendAppCard(ctx, msg.ConversationId, msg.UserId, card); err != nil { return err}Full source code ...

March 4, 2019 · 3 min · jiezi

Ethereum地址是如何生成的

来自简书btc address: 1FmWXNJT3jVKaHBQs2gAs6PLGVWx1zPPHfeth address: 0xd91c747b4a76B8013Aa336Cbc52FD95a7a9BD3D9以太坊生成地址的方式跟比特币比较类似,也是 私钥 -> 公钥 -> 地址,以太坊只是在公钥 -> 地址做了简化。以太坊使用Secp256k1椭圆曲线得到私钥、公钥,比特币使用的也是相同的椭圆曲线算法。得到公钥后,对公钥做Keccak-256哈希运算,然后取最后的40位16进制字符,得到的就是以太坊地址。生成以太坊地址跟比特币地址都是不需要连接网络的python code 生成以太坊地址python首先安装类库pip install ecdsapip install pysha3import binasciiimport sha3from ecdsa import SigningKey, SECP256k1priv = SigningKey.generate(curve=SECP256k1) #生成私钥pub = priv.get_verifying_key() #生成公钥keccak = sha3.keccak_256()keccak.update( pub.to_string()) #keccak_256哈希运算address = “0x” + keccak.hexdigest()[24:]priv_key = binascii.hexlify( priv.to_string())pub_key = binascii.hexlify( pub.to_string())print(“Private key: " + priv_key.decode() )print(“Public key: " + pub_key.decode() )print(“Address: " + address)# Address: 0xd38d3c226d0a86ce9932608edac39163fcbc550e来个骚操作,用同一份私钥来管理比特币与以太坊既然以太坊使用Secp256k1椭圆曲线得到私钥、公钥,比特币使用的也是相同的椭圆曲线算法。那我们就用 Bitcoin地址是如何生成的得到的公钥04d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f691757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d,生成一个以太坊地址。这个公钥是通过openSSL得到的未压缩公钥,以太坊不需要使用这种类型的公钥,只要把首位的04去掉即可。import sha3import binascii_openssl_pub_key= “04d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f691757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d”_pub_key = _openssl_pub_key[2:]_pub_hex = binascii.unhexlify(_pub_key)keccak = sha3.keccak_256()keccak.update(_pub_hex)address = “0x” + keccak.hexdigest()[24:]print address #0x9156a7cdab767ffe161ed21a0cb0b688b545b01f这说明啥?我用完全相同的私钥,分别生成了比特币地址与以太坊地址,这两个完全不一样的地址用的是同一个私钥。以太坊地址 0x9156a7cdab767ffe161ed21a0cb0b688b545b01f与比特币地址 14xfJr1DArtYR156XBs28FoYk6sQqirT2s的私钥竟然是相同的。这给资产管理带来了很大方便,但如果一份私钥泄露了,2份资产都有可能被盗。 管理一时爽,泄露全都火葬场。参考:http://blog.luoyuanhang.com/2…https://www.jianshu.com/p/efc...https://www.bilibili.com/vide...https://zhuanlan.zhihu.com/p/...https://www.myetherwallet.com/ ...

March 1, 2019 · 1 min · jiezi

Python 比特币教程之三: 创建比特币钱包,读余额,极速免费转账,标准转账

我们已经创建过一个回复消息的机器人和一个能自动支付比特币的机器人.通过本教程的学习,你可以学到如下内容如何创建一个比特币钱包.如何读取比特币钱包的余额.如何实现免手续费支付比特币并1秒到账如何将Mixin Network的比特币提现到你的冷钱包或第三方交易所.通过Mixin Network Python SDK创建一个比特币钱包前期准备:你要有一个Mixin Network账户。如果没有账户,一行代码就能创建一个 userInfo = mixinApiBotInstance.createUser(session_key.decode(),“Tom Bot”)上面的语句会在本地创建一个RSA密钥对,然后调用Mixin Network来创建帐号,最后输出帐号信息.//Create User api include all account informationuserInfo.get(“data”).get(“pin_token”),userInfo.get(“data”).get(“session_id”),userInfo.get(“data”).get(“user_id”),帐号创建成功后结果如下:{‘data’: {’type’: ‘user’, ‘user_id’: ‘2f25b669-15e7-392c-a1d5-fe7ba43bdf37’,‘identity_number’: ‘0’, ‘full_name’: ‘Tom Bot’, ‘avatar_url’: ‘’,‘relationship’: ‘’, ‘mute_until’: ‘0001-01-01T00:00:00Z’,‘created_at’: ‘2019-02-22T06:23:41.754573722Z’, ‘is_verified’: False,‘session_id’: ‘284c7b39-3284-4cf6-9354-87df30ec7d57’, ‘phone’: ‘’,‘pin_token’: ‘g4upUgBXa8ATk7yxL6B94HgI4GV4sG4t8Wyn6uTu2Q2scH11UMQ5bYDb6Md+3LRQqRjEdRFcLlHijXGBihRweTaKTZjHQqolWbZcffesVIias6WppV/QMu4TzXCuKa5xpj3uhjL+yPyfWTLGUaVJTJN9n7PQmHSIUBXrovbfodk=’,‘invitation_code’: ‘’, ‘code_id’: ‘’, ‘code_url’: ‘’, ‘has_pin’: False,‘receive_message_source’: ‘EVERYBODY’, ‘accept_conversation_source’: ‘EVERYBODY’}}现在你需要小心保管好你的帐号信息,在读取该账户的比特币资产余额或者进行其他操作时,将需要用到这些信息.给新建的帐号创建一个比特币钱包新账号并不默认内置比特币钱包, 现在读一下比特币余额就可以创建一个比特币钱包。def readAssetAddress(asset_id,isBTC = True): with open(’new_users.csv’, newline=’’) as csvfile: reader = csv.reader(csvfile) for row in reader: pin = row.pop() userid = row.pop() session_id = row.pop() pin_token = row.pop() private_key = row.pop() mixinApiNewUserInstance = generateMixinAPI(private_key, pin_token, session_id, userid, pin,"") btcInfo = mixinApiNewUserInstance.getAsset(asset_id) print(btcInfo) if isBTC: print(“Account %s 's Bitcoin wallet address is %s " %(userid,btcInfo.get(“data”).get(“public_key”))) else: print(“Account %s 's EOS account name is %s, wallet address is %s " %(userid, btcInfo.get(“data”).get(“account_name”), btcInfo.get(“data”).get(“account_tag”)))创建的帐号的比特币资产详细信息如下,其中public key就是比特币的存币地址:{‘data’: {’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’: ‘12sJHR7HJPMt33KwSHyxQvYqGGUEbVGREf’,‘account_name’: ‘’, ‘account_tag’: ‘’, ‘price_btc’: ‘1’,‘price_usd’: ‘3879.88117389’, ‘change_btc’: ‘0’,‘change_usd’: ‘0.017333475714793264’,‘asset_key’: ‘c6d0c728-2624-429b-8e0d-d9d19b6592fa’,‘confirmations’: 12, ‘capitalization’: 0}}Account a8cefb2e-cb93-338f-aba7-32a3a635ad02 ’s Bitcoin wallet address is 12sJHR7HJPMt33KwSHyxQvYqGGUEbVGREf这个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 代币.创建其它的币的钱包与创建比特币钱包过程一样,读对应的资产余额就可以.Mixin Network 当前支持的加密货币 (2019-02-19)cryptouuid in Mixin NetworkEOS6cfe566e-4aad-470b-8c9a-2fd35b49c68dCNB965e5c6e-434c-3fa9-b780-c50f43cd955cBTCc6d0c728-2624-429b-8e0d-d9d19b6592faETC2204c1ee-0ea2-4add-bb9a-b3719cfff93aXRP23dfb5a5-5d7b-48b6-905f-3970e3176e27XEM27921032-f73e-434e-955f-43d55672ee31ETH43d61dcd-e413-450d-80b8-101d5e903357DASH6472e7e3-75fd-48b6-b1dc-28d294ee1476DOGE6770a1e5-6086-44d5-b60f-545f9d9e8ffdLTC76c802a2-7c88-447f-a93e-c29c9e5dd9c8SC990c4c29-57e9-48f6-9819-7d986ea44985ZENa2c5d22b-62a2-4c13-b3f0-013290dbac60ZECc996abc9-d94e-4494-b1cf-2a3fd3ac5714BCHfd11b6e3-0b87-41f1-a41f-f0e9b49e5bf0EOS的存币地址与其它的币有些不同,它由两部分组成: account_name and account tag, 如果你向Mixin Network存入EOS,你需要填两项数据: account name 是eoswithmixin,备注里输入你的account_tag,比如0aa2b00fad2c69059ca1b50de2b45569.EOS的资产余额返回结果如下:{‘data’: {’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’: ‘70dae97b661ca9f80cb0e6549feeba6c’,‘price_btc’: ‘0.00092392’, ‘price_usd’: ‘3.58276497’,‘change_btc’: ‘-0.019294922814297986’, ‘change_usd’: ‘-0.0033825963089133683’,‘asset_key’: ’eosio.token:EOS’, ‘confirmations’: 64, ‘capitalization’: 0}}Account a8cefb2e-cb93-338f-aba7-32a3a635ad02 ’s EOS account name is eoswithmixin, wallet address is 70dae97b661ca9f80cb0e6549feeba6c存入比特币与读取比特币余额现在,你可以向比特币的钱包存币了。当然,在比特币网络里转币,手续费是相当贵的,费用的中位数在0.001BTC,按当前4000美元的价格,在4美元左右,有一个方便的办法,如果你有Mixin Messenger帐号,里面并且有比特币的话,可以直接提现比特币到新创建的帐号的比特币充值地址,它们在同一个Mixin Network网络内,手续费为0,而且1秒到账。下面的代码,可以读取比特币钱包余额.btcInfo = mixinApiNewUserInstance.getAsset(asset_id)print(“Account %s 's balance is %s " %(userid,btcInfo.get(“data”).get(“balance”)))Mixin Network网内免手续费的,并且即时确认任何币在Mixin Network内部的交易,都是无手续费的,并且立刻到账。前期准备: 账户设置了PIN对于新创建的帐号,我们通过updatePin来设置新PIN码, 代码如下:pinInfo = mixinApiNewUserInstance.updatePin(PIN,”")print(pinInfo)Mixin Network帐号之间的比特币支付通过Mixin Messenger,我们可以先转比特币给机器人,然后让机器人转币给新用户。mixinApiNewUserInstance = generateMixinAPI(private_key, pin_token, session_id, userid, pin,”")btcInfo = mixinApiBotInstance.transferTo(MASTER_UUID, BTC_ASSET_ID, AMOUNT, “")print(btcInfo)读取Bitcoin的余额,来确认比特币是不是转成功了! 注意$mixinSdkNew是新用户的。btcInfo = mixinApiNewUserInstance.getAsset(asset_id)print(“Account %s 's balance is %s " %(userid,btcInfo.get(“data”).get(“balance”)))如何将比特币存入你的冷钱包或者第三方交易所如果你希望将币存入你的冷钱包或者第三方交易所, 先要得到冷钱包或者你在第三方交易所的钱包地址,然后将钱包地址提交到Mixin Network.要点提示: 提现是需要支付收续费的,准备好比特币包地址!增加目的钱包地址到Mixin Network调用createAddress API, 将会返回一个address_id,下一步的提现操作会用到这个id。BTC_ASSET_ID = “c6d0c728-2624-429b-8e0d-d9d19b6592fa”;EOS_ASSET_ID = “6cfe566e-4aad-470b-8c9a-2fd35b49c68d”;BTC_WALLET_ADDR = “14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C”;btcInfo = mixinApiBotInstance.createAddress(BTC_ASSET_ID, BTC_WALLET_ADDR,“BTC”,””,”")print(btcInfo)这里的 14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C 就是一个比特币钱包地址, 如下所示,提现费用是0.0034802 BTC, address_id 是"345855b5-56a5-4f3b-ba9e-d99601ef86c1".{‘data’: {’type’: ‘address’,‘address_id’: ‘47998e2f-2761-45ce-9a6c-6f167b20c78b’,‘asset_id’: ‘c6d0c728-2624-429b-8e0d-d9d19b6592fa’,‘public_key’: ‘14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C’, ’label’: ‘BTC’,‘account_name’: ‘’, ‘account_tag’: ‘’,‘fee’: ‘0.0034802’, ‘reserve’: ‘0’, ‘dust’: ‘0.0001’,‘updated_at’: ‘2019-02-26T00:03:05.028140704Z’}}如果你操作的是EOS, 示例代码如下:EOS_ASSET_ID = “6cfe566e-4aad-470b-8c9a-2fd35b49c68d”;EOS_WALLET_ADDR = “3e2f70914c8e8abbf60040207c8aae62”;EOS_ACCOUNT_NAME = “eoswithmixin”;eosInfo = mixinApiBotInstance.createAddress(EOS_ASSET_ID, “”,"",EOS_ACCOUNT_NAME,EOS_WALLET_ADDR)print(eosInfo)创建提现地址成功后,你可以用readAddress读取最新的提现费。addr_id = btcInfo.get(“data”).get(“address_id”)addrInfo = mixinApiBotInstance.getAddress(addr_id)print(addrInfo)提交提现请求,Mixin Network会即时处理提现请求.提交提现请求到Mixin Network, $btcInfo[“address_id”]就是createAddress创建的。 mixinApiBotInstance.withdrawals(btcInfo.get(“data”).get(“address_id”),AMOUNT,"")可以通过blockchain explore来查看进度.完整的代码在这儿 ...

February 26, 2019 · 2 min · jiezi

bitcoin: 何为燃烧地址

来自简书btc address: 1FmWXNJT3jVKaHBQs2gAs6PLGVWx1zPPHf如果你观察过很多的btc地址, 隐隐会发现有些规律:长度很多是34位,好多是1 3 开头的, 字母排列杂乱无章.如下都是合法的btc 地址, 这些地址都有币的,而且数量都不少, 就已当前的(2018/08/21)btc价格计算, 绝对是富得流油了.3MWqbpfzxgojEAah6PMZoZPdUPUTuyTpan1EdBvVAVP98zUsz2n8Pereop29y9fUFk2i3Cbq7aT1tY8kMxWLbitaG7yT6bPbKChq643Nxwenay9Z8Lc9JBiywExpnEFiLp6Afp8v18tTLso5jaa4XqyTQzo9S6mqhfCsgcufdh1FeexV6bAHb8ybZjqQMjJrcCrHGW9sb6uF1HQ3Go3ggs8pFnXuHVHRytPCq5fGG8Hbhx1PnMfRF2enSZnR6JSexxBHuQnxG8Vo5FVK3Kzh9qAqVWQhEsfQz7zEQL1EuSx5tyNLNS1EBHA1ckUWzNKN7BMfDwGTx6GKEbADUozX1LdRcdxfbSnmCYYNdeYpUnztiYzVfBEQeC…34位的长度是绝对的么,有特例么?还真找到一个地址 1111111111111111111114oLvT2,长度只有27位, 而且这么多的111…, 感觉很优美. 一般btc 地址的长度是34位, 也有33位, 最短的应该是26位.燃烧地址1111111111111111111114oLvT2 还有特殊的地方.如果看ta的交易, 只有输入, 没有输出,什么意思呢?只有别人给ta发币, ta一分钱没花,只进不出,咋这抠门呢, 这是个貔貅啊.我们看看ta的第一笔交易id2c637592a4b4a95cf4b19260730c66de540d7d3b14d8d352de591c5ee6eac0fc, 交易时间是 2010年8月10号, 输出脚本是OP_DUP OP_HASH160 0000000000000000000000000000000000000000 OP_EQUALVERIFY OP_CHECKSIG![输出脚本](https://user-gold-cdn.xitu.io…输出脚本是个啥呢?我们经常说, 谁有btc地址的私钥谁就能花费这些币,私钥相当于钥匙, 输出脚本相当于锁, 你把私钥放入输出脚本中,组成一个完整的脚本, 执行这个完整的脚本, 如果最后输出的是 True, 那么恭喜你, 你可以花费这些币. 我们把0000000000000000000000000000000000000000 叫做hash160, 1111111111111111111114oLvT2就是addr, hash160可以转换为addr.你可以认为: addr就是hash160的简化, addr是对人更友好的一种表现方式, 就像语法糖一样.执行输出脚本, 是私钥转化为Hash160的过程.你提供的私钥转化成Hash160_me, 如果与脚本里提前写好的Hash160一致, 你就可以动用这个地址的币了.btc地址的正常推导过程是: 私钥 ==>公钥 ==> Hash160 <==> 地址.Hash160就是没有规则的字符串,我们可以随便提供个Hash160值, 从半截腰上推导地址: Hash160 <==> 地址.1111111111111111111114oLvT2很明显就是这种情况, 从半截腰上推导出来的地址, ta的hash160是 000…000, 都是0,这是特意拼凑的,既然是从半截腰推导出来的,自然没人知道私钥.由于hash运算的不可逆性, 此刻还无法推算出这个地址的私钥,既然不知道私钥,就无法动用币,只能进不能出,成了一个"废地址",这样的地址叫燃烧地址, 即 burn address, 像燃料一样烧没了, 非常形象.为什么还要往这种地址发送交易呢1 减少币的流通量2 土豪的心思不要猜我们生成个 burn address设定 hash160 = 1111111111111111111111111111111111111111, 最终得到地址12ZEw5Hcv1hTb6YUQJ69y1V7uhcoDz92PH.这个地址好没个性啊,但是也有人打过币了, https://btc.com/12ZEw5Hcv1hTb…有没有可能找到私钥存在这种可能, 不过需要巨大的算力来完成这个工作,这个可能太微小了. 如果有人找到了私钥, 燃烧地址就变成普通地址了.如何手动生成btc地址请看 https://www.jianshu.com/p/954… step3是得到hash160_val, 如果你想通过 hash160_val 得到地址, 从step4开始计算就可以.安全提示虽然这些步骤经过了验证并没有发现问题, 但也仅供参考.强烈建议不要自己生成btc addres强烈建议不要自己生成btc addres强烈建议不要自己生成btc addres请用信赖的工具来干这事如果地址计算错误, 这个私钥并不能解开你的地址, 相当于你的btc丢了.mastering bitcoin已经给了我们教训. 同理ethereum 也有burn address哦. ...

February 22, 2019 · 1 min · jiezi

Python 比特币教程之二: 机器人收发比特币

在上一篇教程Python 比特币 教程 之一:创建机器人中, 我们创建了自动回复消息的机器人,当用户发送消息"Hello,World!“时,机器人会自动回复同一条消息。第二课: 机器人接受比特币并立即退还用户按本篇教程后学习后完成后,你的机器人将会接受用户发送过来的加密货币,然后立即转回用户。完整代码如下:app.pyfrom mixin_ws_api import MIXIN_WS_APIfrom mixin_api import MIXIN_APIimport mixin_configimport jsonimport timefrom io import BytesIOimport base64import gziptry: import threadexcept ImportError: import _thread as threaddef on_message(ws, message): inbuffer = BytesIO(message) f = gzip.GzipFile(mode=“rb”, fileobj=inbuffer) rdata_injson = f.read() rdata_obj = json.loads(rdata_injson) print(”——-json object begin———") print(rdata_obj) print("——-json object end———") action = rdata_obj[“action”] if rdata_obj[“data”] is not None: print(“data in message:",rdata_obj[“data”]) if rdata_obj[“data”] is not None and rdata_obj[“data”][“category”] is not None: print(rdata_obj[“data”][“category”]) if action == “CREATE_MESSAGE”: data = rdata_obj[“data”] msgid = data[“message_id”] typeindata = data[“type”] categoryindata = data[“category”] userId = data[“user_id”] conversationId = data[“conversation_id”] dataindata = data[“data”] created_at = data[“created_at”] updated_at = data[“updated_at”] realData = base64.b64decode(dataindata) MIXIN_WS_API.replayMessage(ws, msgid) print(‘userId’, userId) print(“created_at”,created_at) if categoryindata == “PLAIN_TEXT”: realData = realData.decode(‘utf-8’) print(“dataindata”,realData) MIXIN_WS_API.sendUserText(ws, conversationId, userId, realData) elif categoryindata == “SYSTEM_ACCOUNT_SNAPSHOT”: rdJs = json.loads(realData) if ( float(rdJs[“amount”]) > 0 ): mixin_api.transferTo(userId, rdJs[“asset_id”], rdJs[“amount”], “")if name == “main”: mixin_api = MIXIN_API(mixin_config) mixin_ws = MIXIN_WS_API(on_message=on_message) mixin_ws.run()Hello Bitcoin!在项目目录下,执行 python app.pycd mixin_labs-python-botsource ./bin/activate(mixin_labs-python-bot) wenewzha:mixin_labs-python-bot wenewzhang$ python app.pyws open——-json object begin———{‘id’: ‘fd6ce766-331a-11e9-92a9-20c9d08850cd’, ‘action’: ‘LIST_PENDING_MESSAGES’}——-json object end———开发者可以通过消息面板,给机器人转比特币,当机器人收到比特币后,马上返还给用户!事实上,用户可以发送任意的币种给机器人,它都能马上返还!源代码解释elif categoryindata == “SYSTEM_ACCOUNT_SNAPSHOT”: rdJs = json.loads(realData) if ( float(rdJs[“amount”]) > 0 ): mixin_api.transferTo(userId, rdJs[“asset_id”], rdJs[“amount”], “")如果机器人收到币,rdJs[“amount”] 大于零;如果机器人支付币给用户,接收到的消息是一样的,唯一不同的是,rdJs[“amount”]是一个负数.最后一步,调用SDK的 mixin_api.transferTo 将币返还用户!高级用法coming soon!Mixin Network的开发资源汇编 ...

February 22, 2019 · 1 min · jiezi

Python 比特币 教程 之一:创建机器人

Mixin Network 是一个免费极速的点对点加密数字货币交易系统.在本章中,你可以按教程在Mixin Messenger中创建一个bot来接收用户消息, 学到如何给机器人转比特币 或者 让机器人给你转比特币.Mixin Network的开发资源汇编课程简介创建一个接受消息的机器人机器人接受比特币并立即退还用户创建一个接受消息的机器人通过本教程,你将学会如何用Python创建一个机器人APP,让它能接受消息.Python 3 安装:本教程基于Python 3.7.2, 所以你需要安装Python 3.7.2 或 以上的版本.on macOSbrew upgradebrew install python@3on Ubuntu, 从第三方的APT源中安装.sudo apt updatesudo apt install software-properties-commonsudo add-apt-repository ppa:deadsnakes/ppa当出现下面的提示时,按"回车"继续.Press [ENTER] to continue or Ctrl-c to cancel adding it.重新更新一次apt源, 再安装python3.7, python3.7-venvsudo apt updatesudo apt install python3.7 python3.7-venvsudo ln -s /usr/bin/python3.7 /usr/bin/python3检查安装是否成功了,需要检查python3与python3-venv, 正确的提示如下:$ python3 -VPython 3.7.2root@n2:~ python3 -m venv -husage: venv [-h] [–system-site-packages] [–symlinks | –copies] [–clear] [–upgrade] [–without-pip] [–prompt PROMPT] ENV_DIR [ENV_DIR …]Creates virtual Python environments in one or more target directories.positional arguments: ENV_DIR A directory to create the environment in.optional arguments: -h, –help show this help message and exit –system-site-packages Give the virtual environment access to the system site-packages dir. –symlinks Try to use symlinks rather than copies, when symlinks are not the default for the platform. –copies Try to use copies rather than symlinks, even when symlinks are the default for the platform. –clear Delete the contents of the environment directory if it already exists, before environment creation. –upgrade Upgrade the environment directory to use this version of Python, assuming Python has been upgraded in-place. –without-pip Skips installing or upgrading pip in the virtual environment (pip is bootstrapped by default) –prompt PROMPT Provides an alternative prompt prefix for this environment.Once an environment has been created, you may wish to activate it, e.g. bysourcing an activate script in its bin directory创建 mixin_labs-python-bot 项目你首先需要创建项目目录,初始化"虚拟环境",然后安装需要的软件包.mkdir mixin_labs-python-botcd mixin_labs-python-botpython3 -m venv ./在 python3 -m venv 指令完成之后, 项目目录如下:wenewzha:mixin_labs-python-bot wenewzhang$ lsbin include lib pyvenv.cfg当"虚拟环境"创建成功后,需要激活它, 通过执行bin目录下相应的activate文件完成.wenewzha:mixin_labs-python-bot wenewzhang$ source ./bin/activate(mixin_labs-python-bot) wenewzha:mixin_labs-python-bot wenewzhang$成功激活后,可以直接执行python或pip了,这时,不再需要输入他们的完整路径了.在"虚拟环境"里安装必需的包创建一个必需包的listrequirements.txtcryptography==2.4.2pycparser==2.19pycryptodome==3.7.2PyJWT==1.7.1python-dateutil==2.7.5PyYAML==3.13requests==2.21.0websocket-client==0.54.0通过pip升级pip包本身, 并安装必需包.pip install –upgrade pippip install -r requirements.txt下载 Mixin Network的python 3的APIwget https://github.com/includeleec/mixin-python3-sdk/raw/master/mixin_ws_api.pywget https://github.com/includeleec/mixin-python3-sdk/raw/master/mixin_api.pywget https://github.com/includeleec/mixin-python3-sdk/raw/master/mixin_config.py你好,世界!创建第一个机器人APP按教程,到mixin.one创建一个APP[tutorial].生成相应的参数生成必要的参数并且记下来它们将用于mixin_config.py中.在项目目录下,创建mixin_config.py,将生成的参数,替换成你的!mixin_config.pyclient_id= ’ed882a39-0b0c-4413-bbd9-221cdeee56bf’client_secret = ‘8d7ec7b9c8261b6c7bd6309210496ca4b72bce9efc7e49be14a428ce49ff7202’pay_pin = ‘599509’pay_session_id = ‘bd53b6a4-e79a-49e5-ad04-36da518354f6’pin_token = “nVREh0/Ys9vzNFCQT2+PKcDN2OYAUSH8CidwHqDQLOCvokE7o6wtvLypjW9iks/RsnBM6N4SPF/P3bBW254YHGuDZXhitDEWOGkXs7v8BxMQxf+9454qTkMSpR9xbjAzgMXnSyHrNVoBtsc/Y+NvemB3VxPfsCOFHasiMqAa5DU=“private_key = “””—–BEGIN RSA PRIVATE KEY—–MIICXQIBAAKBgQCnaoO1SdPxggEpAIUdM/8Ll4FOqlXK7vwURHr4FFi6hnQ1I79gpZSlJdzjr24WcIuNi6kVdXVIpyzZJGXS2I72dpGs5h1jKxL8AWIUVL2axZXqTJNic4wj6GJ4gDRP2U9I9gae+S/frM6KP8TioV0OcbmrlfrwI0OElLH3363y1wIDAQABAoGAduaGLi4F8cMkMculvqzcGY57jrQZBGyg6YANWb2Rmr+9LrR5yhkvLe9rJuXEKPm7k0a6SnxGVNguWPWpv4qAVVGAJ0eb8ETXTRO20HlKmcbxfFdDtHBDV3QufNa1h3mNEsqWDNCDdAm7p/EZwfG2F9+nmeXLfip7R1I72qbK0wkCQQDiJR6NEGVwbj8HK8kRpzY1D9lPqp1ZMrma5AFYGZIb5voTxLjRpYdxQJHi7CCdE1zgqJOXvA3jj/iof7bMIJY7AkEAvYSSC5H+fUKAjyjeCTGJBBKoPDsq+aALAYLWf77sGXE9BBmhhY0liwmbj8X6/qZtQ0yEzdT/OSdiYL86CcrgFQJBALz/sMzMSzrvqJVhrqWmTdOC72d5fA+0KRKeQ9FRbZ8MJyymWKA96zhncoVoOsmMCS9pNBC4BhONm4+XTTrEcUkCQQCoDWB8Bg/G/yuExtZtDJHVHL41+rmW9UYNJvoR+TjfLrzOX/QMuyapbfGVwhdZrDaDUN0KsG9JPRVNeQR8HnwpAkACrr9cNp1H1bytHG9a6L+5cVHkRhqqEYWVO41MhgZF5bIKx5OXCJB2VwY7fjFet2KxTHGfEZt/khjFNZzVX7lN—–END RSA PRIVATE KEY—–“““需要替换的参数包括: client_id, client_secret, pay_pin, pin_token, pay_session_id, private key.创建 app-mini.py 文件, 内容如下:app-mini.pyfrom mixin_ws_api import MIXIN_WS_APIfrom mixin_api import MIXIN_APIimport mixin_configimport jsonimport timefrom io import BytesIOimport base64import gziptry: import threadexcept ImportError: import _thread as threaddef on_message(ws, message): inbuffer = BytesIO(message) f = gzip.GzipFile(mode=“rb”, fileobj=inbuffer) rdata_injson = f.read() rdata_obj = json.loads(rdata_injson) print(”——-json object begin———”) print(rdata_obj) print(”——-json object end———”) action = rdata_obj[“action”] if rdata_obj[“data”] is not None: print(“data in message:",rdata_obj[“data”]) if rdata_obj[“data”] is not None and rdata_obj[“data”][“category”] is not None: print(rdata_obj[“data”][“category”]) if action == “CREATE_MESSAGE”: data = rdata_obj[“data”] msgid = data[“message_id”] typeindata = data[“type”] categoryindata = data[“category”] userId = data[“user_id”] conversationId = data[“conversation_id”] dataindata = data[“data”] realData = base64.b64decode(dataindata) MIXIN_WS_API.replayMessage(ws, msgid) if ’error’ in rdata_obj: return if categoryindata == “PLAIN_TEXT”: realData = realData.decode(‘utf-8’) print(“dataindata”,realData) MIXIN_WS_API.sendUserText(ws, conversationId, userId, realData)if name == “main”: mixin_api = MIXIN_API(mixin_config) mixin_ws = MIXIN_WS_API(on_message=on_message) mixin_ws.run()运行 app-mini.py, 记得要先激活“虚拟环境”哦!(mixin_labs-python-bot) wenewzha:mixin_labs-python-bot wenewzhang$ python app-mini.py…如果一切正常,将会有如下提示:(mixin_labs-python-bot) wenewzha:mixin_labs-python-bot wenewzhang$ python app-mini.pyws open——-json object begin———{‘id’: ‘1c798948-30eb-11e9-a20e-20c9d08850cd’, ‘action’: ‘LIST_PENDING_MESSAGES’}——-json object end———在手机安装 Mixin Messenger,增加机器人为好友,(比如这个机器人是7000101639) 然后发送消息给它,效果如下!源代码解释WebSocket是建立在TCP基础之上的全双工通讯方式,我们需要建立一个loop循环来维持通迅。if name == “main”: mixin_api = MIXIN_API(mixin_config) mixin_ws = MIXIN_WS_API(on_message=on_message) mixin_ws.run()每接收到一个消息,需要按消息编号(message_id)给服务器回复一个"已读"的消息,避免服务器在机器人重新登入后,再次发送处理过的消息! MIXIN_WS_API.replayMessage(ws, msgid)机器人程序完整回复用户的信息if categoryindata == “PLAIN_TEXT”: realData = realData.decode(‘utf-8’) print(“dataindata”,realData) MIXIN_WS_API.sendUserText(ws, conversationId, userId, realData) Mixin Messenger支持的消息类型很多,具体可到下面链接查看: WebSocket消息类型.完成现在你的机器人APP运行起来了,开始玩吧。完整的代码在这儿 ...

February 21, 2019 · 3 min · jiezi

第12期 DApp 榜单 : “吸睛”+“吸金”的小游戏

作者:DD君欢迎添加作者微信 btcbtc555 与他进行交流!未经授权禁止转载!截止到今天为止,以太坊上DApp数量合计为1,336,EOS上DApp数量合计为349,波场上DApp数量合计为173,三大公链中竞猜类DAPP均居龙头位置。目前宏观经济形势不稳定已成为绝大多数人的共识,春节期间年年爆火的返乡置业潮相较于往年都有所降温,DApp在节期间的表现不尽人意也可以理解。一方面来自用户群体注意力的转移,另一方面则是由于用户现金流的缺失。整个虚拟货币市场是个联动的生态系统,春节期间一直处在盘整阶段的各个主流币种,今天以太坊率先领跑,比特币柚子等也有小幅上涨,不知道此波行情能否也为DAPP带来一些关注度。以下进入今天的榜单。ETH榜单相较于EOS在春节期间的用户数流失,ETH的交易人数却有所增加。但我们发现1812个以太坊DApps中只有180个与ERC-20交易相关联,通过简单的算数得知,这大约相当于10%,大量的以太DAPP已经处于死亡状态。加拿大加密货币研究者和行业评论员Kevin Rooke的言论也巩固了以太坊应用程序缺乏活动的事实。这样来看春节期间以太坊交易人数的激增,可能又是某些项目方自导自演的戏码。EOS榜单可以注意到EOS榜单在春节期间有很大的波动变化,除了雷打不动的PRA CandyBox、EOS Knights依旧霸榜之外,其余名次皆有较大变化,且竞猜类DAPP占据主要名额。游戏BIG.GAME早在去年九月份就已经推出,表现一直不温不火,但近日的用户数增长堪称飞速。相较而言每日成交量的增速远远低于用户数,我们有理由怀疑该团队通过刷用户量的方式提升自己的Dapp排名,以获得更高的曝光度。TRON榜单本周波场前三名依旧为节前前三,而后半部分的变动较大。波场的DApp的爆发时间远晚于EOS,从去年12月份才进入爆发期,1月步入红利期,目前每天仍有新的波场DAPP推出。由于波场主要用户都集中在海外,所以整个春节期间,其交易量并没有太大的下滑幅度。观点分析春节假期明显可以感觉到Dapp圈内迅速冷却,不知道的人还以为是Dapp要凉了。原因篇首已提,此处便不再赘述,目前三大公链的数据已经基本回暖。缺乏新用户入场是目前所有DAPP遭遇的普遍难题。我们DAPPDiscover团队已经不止一次提到过,只有出现一些新的好玩的游戏,才有吸引新用户的可能性。春节期间一款名为Celex的五子棋游戏就引起了我们团队的关注,大家可以感受一下游戏界面。界面简洁,使用流畅,没有繁杂的注册钱包步骤,是DD君体验该游戏的直观感受。也许有读者疑问:“这个游戏这么常见,有必要放在单独拎出来讲吗?”有!!!原因有两点:其一,从游戏层面上,该五子棋属于小游戏,能有效吸引更多的用户群体。我们可以对比微信的小游戏“跳一跳”。2017年12月28日下午,微信小游戏“跳一跳”正式上线,一经推出,微信指数几乎直线上升超过2亿,2018年春节期间同时在线人数最高2800万/小时。抛开微信的熟人生态和满足用户相互攀比分数高低的原因外,小游戏耗时少难度低,用户的碎片化时间可以得到更有效占用,从而能获得更多的用户群体。其二,结合DAPP的通性,包括上面我们提到的Celex,本质依旧是“游戏即挖矿”。以该游戏为例,这款游戏主要通过与人实时PK五子棋来确定输赢,筹码就是GT(该游戏代币)。该游戏还含有邀请好友奖励等等,由于该游戏还处于测试阶段,后续有可能会上线更多的玩法,但本质估计仍差不多。小游戏带来更多用户,区块链又给该小游戏赋予了金融属性,“吸睛”+“吸金”,你不心动吗?你有哪些感兴趣的DApp?欢迎留言回复下一次讨论的,也许就是它。

February 19, 2019 · 1 min · jiezi

DAppDiscover | 盘点2018年度十大DAPP

作者:DD君欢迎添加作者微信 btcbtc555 与他进行交流!未经授权禁止转载!2018年可以说是DApp爆发的元年,这一年出现了好几款现象级DApp。有曾经让以太坊严重拥堵的CryptoKitties(加密猫),有史上最大的资金盘游戏Fomo 3D,还有区块链房地产EOS Pixel Master(像素大师)——一个像素最高价达到了4483.87EOS(折合人民币17万多)!当然,除了资金盘游戏之外,也出现了像EOS Knights、加密英雄这样,制作精良、质量上成、高可玩性的区块链游戏。DAppDiscover团队从2000多个DApp中筛选出了2018年度十大DApp,综合考虑了它们的影响力、可玩性和游戏设计三个方面,一起来看一看吧!10. 波场虾农影响力:3.5分可玩性:3.5分游戏设计:3.0分平台 :TRON发布时间 :2018-12-14网址:https://tronshrimp.farm/波场虾农属于养殖类游戏。逻辑就是买蛋,孵蛋,生蛋,卖蛋。“蛋"可以无限孵化,但相应价格会越来越低。这是波场第一款爆款游戏,上线后一举创下波场 DAPP 日活记录,达到 3 万 DAU。但此款游戏严重抄袭游戏以太虾农,二者连UI都相差无几。9.PoWH 3D影响力:3.5分可玩性:3.5分游戏设计:3.5分平台 :ETH发布时间 :2018-02-26网址 :https://powh.io/PoWH 3D同样属于资金盘类游戏。玩这个游戏须先购买虚拟代币,购买代币需要交10%手续费。持有虚拟代币后,会收到分红,这个分红比例则根据游戏每日产生的收益,按照你持有代币的量分配。该游戏利用新玩家的钱来向老玩家支付利息和短期回报,以制造赚钱的假象,进而骗取更多的玩家入场,属于典型的庞氏骗局游戏。8. CryptoCountries影响力:3.5分可玩性:4.5分游戏设计:3.5分平台 :ETH发布时间 :2018-02-01网址 :https://cryptocountries.io/《CryptoCountries》是一款基于以太坊的卡牌类游戏。游戏主要玩法就是将每个国家在区块链上做成类似虚拟代币一样的token,玩家通过购买这些token来“征服”这个国家。“征服”后,你的名字将写在国家的token上。这款游戏的本质就是击鼓传花。该游戏中玩家拥有一个国家的所有权后,如若其他玩家要想获得,需支付更高的价格。由于宣传噱头到位,2018年春节前后的一周时间里,它创造了4.5万ETH的交易流水。7. BetDice影响力:4.0分可玩性:4.5分游戏设计:3.5分平台 :EOS发布时间 :2018-09-21网址:https://betdice.one/BetDice是一款掷骰子游戏,玩法简单,只要玩家投出小于其设定的数字就获胜。前期的代币空投活动,以及后续的抽奖活动,使BetDice吸引了大量的用户,上线三周后累积成交量就超过3400万EOS。6. 以太水浒影响力:4.0分可玩性:4.5分游戏设计:4.0分平台 :ETH发布时间 :2018-02-17网址 :http://cryptohero.pro/《以太水浒》也是一款由区链块技术打造的水浒题材的策略卡牌类手机游戏,游戏中,每张卡牌都代表一位英雄,玩家可以进行自由的买卖,获得以太币的奖励。《以太水浒》是中国第一个国产DApp。该款游戏发行时刚好卡在击鼓传花类游戏高峰期,外加上打着中国第一旗号,它着实火了一把。尽管现在看这款游戏的方方面面做的都很差,但火爆时卡牌人物宋江曾被炒到50ETH+。5. EOS Pixel Master影响力:4.0分可玩性:4.5分游戏设计:4.5分平台 :EOS发布时间 :2018-09-23网址:https://pixelmaster.io/EOS Pixel Master是EOS ASIA制作的一款EOS链上画板。主要就是在一块1000x1000像素的画布上作画,再使用 EOS 去购买相应位置上的像素。此款游戏同属于现象级DApp,上线9天之内吸金80万美元,并获BM点赞。4. 加密英雄影响力:4.5分可玩性:4.5分游戏设计:4.5分平台 :ETH发布时间 :2018-09-21网址 :https://www.mycryptoheroes.ne…加密英雄是由日本游戏公司double jump制作的,它是一款RPG游戏。此游戏使用了历史或者传说中的英雄人物作为原型。该游戏正式推出后,几天内就冲入ETH游戏榜单的第一名。游戏整体呈像素风格,UI设计和用户体验都还可以,在游戏DAPPs中的表现也可圈可点。3.CryptoKitties影响力:5分可玩性:4.5分游戏设计:4.5分平台 : ETH发布时间 :2017-11-23网址 :https://www.cryptokitties.co/《CryptoKitties》是一款由Axiom Zen开发的区块链宠物养成游戏。在游戏中,玩家使用以太币进行电子猫的购买、喂食、照料与交配等,但其最为核心是玩法是将以太坊区块链中的电子猫进行出售。该款游戏是以太坊上第一个现象级的区块链游戏,也是至今为止生命周期最长的游戏类DApp,创造了单日14000+日活跃地址记录(2017年12月09日),一度造成以太坊交易堵塞。2.Fomo 3D影响力:5分可玩性:4.5分游戏设计:5分平台 :ETH发布时间 :2018-07-05网址 :https://exitscam.meFomo 3D是一款典型的资金盘游戏。游戏玩法简单:只要你是最后一个出价的人,并且这个价格维持 24 小时,那么奖池里的所有以太坊都给你。它包括了:闪拍系统、分红系统、战队系统、排行榜系统和邀请系统,加强了游戏的可玩性。此游戏由于有最终Key购买者独占奖池的诱惑,玩家会主动向奖池持续注入ETH。第一轮游戏结束时,奖池金额高达10469.66ETH,轰动整个DApp圈。同时也是由于此款游戏的成功,后续引出了近百个仿品。1.EOS Knight影响力:5分可玩性:5分游戏设计:5分平台 :EOS发布时间 :2018-07-08网址 :http://eosknights.io/EOS Knights是一款由韩国BADA工作室开发的RPG游戏。玩家首先需要用EOS在游戏中购买英雄,然后通过打怪让英雄升级。玩家在打怪的过程中,获得系统奖励的宝物。玩家可以通过出售宝物,赚取EOS。该游戏从去年7月份上线到现在,日活交易量等都保持良性发展态势,是EOS游戏中的一股清流。小结复盘2018,我们不难发现去年火爆的DApp基本都属于博彩类,从狂热到崩塌,“戏里戏外"间人性的贪婪演绎的淋漓尽致。但狂热过后,伴随着的确是理性的回归。目前已有越来越多的正规游戏厂商开始关注DApp,准备着手进军这一领域。DappDiscover团队也由衷希望2019DApp领域呈现新气象。所有的游戏种类,该佩奇的都“佩奇”,而非仅仅是菠菜类的天下。你有哪些感兴趣的DApp?欢迎留言回复下一次讨论的,也许就是它。

February 12, 2019 · 1 min · jiezi

第11期 DApp 榜单:这是一篇让DD君重伤住院的内容

作者:DD君欢迎添加作者微信 btcbtc555 与他进行交流!未经授权禁止转载!上周我们DAppDiscover创始人,在被采访时再一次提到了游戏DApp的引导性价值。旁听全过程的DD君心里就在纳闷,既然这么重要,为什么当下的DApp做的还这么差,3W疑惑渐涌心头。历尽千辛万苦后,终于DD君找到原因了,详情请看下文观点分析部分。以下先进入,我们的本周榜单。ETH榜单游戏1 ETH 在本周已经彻底出榜了。这类游戏,来的快去的快的铁律又一次被验证。其实ETH上开发一个DApp的成本仅是开发合约的费用,而DApp运行的成本全部由用户自己承担。但即便如此,也挡不住越来越多的以太开发人员“下乡”到EOS和TRON上。流量既是王道,DAU即是风向标。排名第一IDEX日活才600多,以太还有什么希望呢?EOS榜单本周EOS榜单前五相较于上周没一丝起伏变化,EOS的头部DApp已基本固定。昨晚 20:23~21:07 之间,PeckShield 监测到黑客又向 EOS 竞猜类游戏 EOSlots 发起连续攻击。目前游戏已经暂停运营。树大招风这句话,没毛病。TRON榜单人类的本质就是一台复读机。榜单第10名,是不是超级眼熟,前不久好像也有一款火到不行的游戏叫什么3D来着。还记得高中语文老师有一次戏说“天下文章一大抄,看你会抄不会抄”,宇晨哥绝对是其中好手。如果只看DAU给三大公链排行,TRON系DApp可占据半数以上。与此同时,在全球市值流通榜单上,TRON也稳占前10位置。QQ当初也是模仿ICQ,但由于对中国互联网用户理解更深,照样击败ICQ,成为中国即时通讯和社交领域之王。波场真有可能在未来搅了个天翻地覆。观点分析对,没错,DApp游戏的关卡设计师,别到处瞅了,接下来怼的就是你。在目前的大环境下,大部分玩家已经达成这样的一个共识——游戏DApp可能成为未来率先爆发领域。但当下的任何一个游戏DApp的体验,不是一个“差”字就可以形容的。游戏DApp本质上,还是游戏。DD君仔细研究了一下传统互联网游戏领域,终于找到问题出在哪里了——关卡设计师尸位素餐。“关卡设计师是游戏环境、关卡和任务的设计者”-维基百科一款游戏,不管是对关卡流程和游戏玩法思考新的游戏创意,还是游戏画面效果,抑或是游戏中AI,都离不开关卡设计师的存在。游戏关卡设计师对以下五个维度的负责:1.逻辑流畅游戏应该具备最基本的逻辑客观性,一切关卡设计都要符合游戏世界的背景设定或者游戏世界的客观规律。2.难度合理游戏的难度设定有两种方法:一种是线性设计,也就是将难度在游戏过程中逐渐提高。比如,在动作游戏里把跨越的障碍增加宽度或者是高度,或者是用其他难度较大的物件替代难度较小的物件。一种是非线性设计,就是直接设置游戏的不同难度水平,在游戏开始之初让玩家自己进行选择,通常分为Easy、 Normal、Hard、Very Hard等。过高的难度设定会让玩家丧失信心,过低的难度设定又会导致玩家感到乏味。关卡设计师需把握二者关系,设计出达到微妙程度的平衡。3.趣味性趣味性并非三言两语可以解释清楚,不同的人对趣味的定义也不尽相同。关卡设计师没办法满足每一个人对趣味的要求,但设计关卡时向玩家提供适当的游戏奖励,却可以提高每个人已有感知的增加。例如,在一个难度较大的关卡通过后,适当地对玩家给予补偿或奖励,或者在通过难度较高的关卡后会出现一段低难度的流程。再例如在游戏设置大量的收集类道具,通过收集给予额外的游戏奖励。4.耐玩性一款游戏是否有价值,有一个很简单的衡量标准——玩家愿意在该款游戏上耗费的时间。如果一个花费大量时间设计的游戏关卡,但玩家在短时间通关后就丢置一边,这样的游戏无疑是失败的。增加游戏关卡的耐玩性通常有以下几种方法:①设计大量的分支流程。让玩家在主流程的体验过程中不断体验到分支流程,这样大大增加了游戏持续的时间。②设置隐藏要素。在游戏关卡中设计大量的隐藏道具、任务等,让玩家花大量时间来探索和完成。5.视觉效果游戏关卡还要设计得合理、简洁和有序,不能看起来混乱。以上五点,有哪一款DApp游戏成功布局了全部???一款游戏你可以设置宏大的世界观,仙侠神魔,星际宇宙等等,仅凭君愿。但我们还应记得“贪吃蛇”“俄罗斯方块”等小游戏至今屹立不倒。再让你重温“超级玛丽”,你可能会不屑一顾,但逃不掉的“真香定律”,很快就会啪啪啪打你脸。好的游戏都离不开优秀的关卡设计师,没有他们无异于空中楼阁。DApp项目方的关卡设计师们,看看我们这些小菜鸡渴望的眼神,听听我们内心无声的呼唤,努力啊!DApp项目方笑了:“我们一般Ctrl+C,Ctrl +V,quan完钱,好回家过年。真是感谢DD君科普,我们也是第一次听说这个职位”DD君:“你们…我…”后续报道:由于DD君情绪起伏过大,心血管破裂,吐血三升,目前正在抢救中。

January 29, 2019 · 1 min · jiezi

对话 | DAppDiscover创始人:对用户而言,DApp体验比排名更重要

2018年年末,DApp被推到了聚光灯下,资本又一次在这里汇聚。今天我们Boon区块链社区有幸采访了DAppDiscover创始人Johnny,与其共同探讨了目前关于DApp的一些焦点问题。以下为采访详情:“ 用户体验比排名更重要小九:DApp在今年下半年可谓是相当火爆,目前每天都有新的DApp产生,您是从什么时候开始接触到DApp?做DAppDiscover的初衷是什么呢?Johnny:其实我个人很早就进了币圈了,94过后,随着国家政策的收紧,币价遭遇断崖式下跌,我就开始思考,区块链真正的应用在哪里。17年年底,加密猫大火,一度造成以太坊网络交易拥堵,从那个时候起,我就开始关注DApp的发展。目前来讲,DApp的数据监测网站比较多,国外有radar,国内也有review等。但是这些网站关注的重点都是链上的数据,对于普通用户不是太友好。就拿我自己而言,我在选择一款DApp游戏的时候,首先考虑的不是它的排名,而是它的体验和可玩性,数据对于我而言没什么太大的意义。与此同时,我还渴望与和我玩同一个DApp的人一起沟通交流,渴望获得更多有价值的资讯,但是这些网站却都不能满足我的这种需求。所以我决定自己做一个网站,DAppDiscover就由此萌发了。“ 掌握自己的数据小九:大家都知道DApp其实就是去中心化的App,单就普通用户而言,目前的App其实已经可以满足其的日常工作生活所需,那为什么还需要DApp,换句话说,DApp是否就是一个伪命题?Johnny:去中心化和中心化的概念,离用户确实挺远的。因为我们一直处在中心化的而世界里面。今天我们不讨论这种形而上的概念,我想谈一谈具体的东西,比如用户数据。DApp与App的区别,本质上是用户是否能独立掌握数据的区别。如今,数据是重要的生产资料已经逐渐成为共识。用户是数据的生产者,但在传统互联网的分配机制上,用户却不能掌控自己的数据,也不能享有数据产生的价值,更有着数据被任意窃用,篡改的可能性。作为一个新生事物,DApp目前确实没有办法替代App,但随着数据化时代的推进,DApp的优越性将越发凸显。在掌握自己数据的同时,获取到相应的价值,同时能兼顾享受目前App所提供的所有功能,这是未来所有用户的需求。“ 能抓到老鼠的就是好猫小九:目前的DApp上种类少,并且吸引用户的大多博彩类DApp,像TRON干脆被称为“博彩链”,对于这种现状,您是怎样看待的?Johnny:大家其实都明白“黄赌毒”永远都是最吸引人的地方。我们就拿互联网来说,互联网早期就是一个泥潭中野蛮生长的过程,抄袭、盗版、流氓软件、涉黄、涉赌、等等层出不穷。但也就是这些“不入大雅之堂”的东西,催生了互联网快速的更新换代。举个例子,你在浏览某些网站的时候,画面清晰后,你肯定还会希望加载速度快。那这就要求后面的技术人员,不断的对系统升级。从宏观角度来看,长此以往,肯定是整个互联网行业的快速发展。现在的DApp也是,我们不能仅仅因为“博彩”二字,就将这类DApp定义为不好的。但如果它能通过这种途径,不断刺激背后的逐利者,让他们愿意花更多的人力物力财力去研究如何提升自身性能来满足这些用户需求,在某种层面上看,这不是一件坏事。“ 游戏不好玩怎么可能吸引用户小九:游戏永远是我们最感兴趣的话题之一,现在DApp面临的一个共同的问题就是用户太少,您认为目前DApp游戏是否能拯救当下这一颓势?Johnny:现在还不行。我们为什么去玩游戏,其实就是为了好玩。每天都会出现大量的手机游戏、PC游戏,只有非常少数需要用到最新的硬件和技术,绝大多数用几年前的电脑照样可以玩。必要的趣味性,以及有趣的故事情节,才能够吸引足够的玩家,而非单单依托于性能。目前的DApp 游戏都过于简单化,也基本没有太吸引人的地方。目前的DApp游戏还不足以吸引更多的用户进入这一领域。“ 但最先爆发的肯定还是游戏领域小九:作为DApp领域的资深人士,在您看来,2019年DApp可能最先会在哪个领域爆发?Johnny:虽然说现在的DApp游戏还处于初始阶段,但如果说爆发的话,还是游戏领域,原因有几点。首先,游戏用户群体整体偏年轻化,这类群体的接受程度和学习能力相对较强。DApp本身就是一个有门槛的领域,显然,将游戏用户从传统App争取到DApp上来,相对来说,是成本最低的一件事。第二,传统领域,玩家在玩游戏过程中只拥有游戏的使用权而没有所有权。游戏厂商任意增发道具,或者是更改某些设置,玩家只能被动接受,这其实已经引发了大批量玩家的不满,而DApp游戏却不会有这样的问题。第三,通证经济和资产代币化同时增加游戏的经济属性和激励机制,这可以让玩家像拥有现实世界中的实体物品一样,拥有游戏中的虚拟资产。这种方式可以改变开发商与玩家之间的协作关系,使玩家相对于传统的互联网领域拥有了更多的话语权。我已经注意到很多老牌的游戏厂商已近开始慢慢入场,包括网易还有腾讯,他们也已经在做了一些区块链游戏的尝试。如果后续真的有一个杀手级别的DApp出现,那绝对是游戏领域。

January 28, 2019 · 1 min · jiezi

错过了比特币挖矿,DApp 挖矿能赚回来吗?

作者:DD君欢迎添加作者微信 btcbtc555 与他进行交流!未经授权禁止转载!人类文明总是不断向前发展的,从飞鸽传书,到电话,再到现在的QQ、微信。当我们站在某个时间节点向后看的时候,会觉得一切新事物的出现都是必然的结果。但,当我们扭过头向前看的时候,才发现,未来是混沌的。区块链的未来就是混沌的,尽管它的出现已经有十年了。区块链进入公众视野是在2017年,那一年,比特币的价格一路飙升,涨到了最高点19,565.5美元。人们对于区块链的疯狂和对新事物的“害怕错过(Fear Of Missing Out)”,助长了2017年区块链资产的巨大泡沫。现如今,泡沫破裂,比特币的价格不足最高点的五分之一,投机者纷纷离场。泡沫让区块链陷入了短期利益的博弈游戏,而泡沫的破裂才能迎来区块链真正的发展。2018年年末,DApp被推到了聚光灯下,很多人认为,他将在2019年引爆希望,迎来下一个牛市,也有人认为,它只不过是另一个充满了羊毛党和矿工的蛮荒之地。不管怎样,随着DApp的火热,DApp挖矿成功吸引了业内的关注。随着ICO模式的破灭,现在很多区块链项目开始转型做DApp,实际上,大部分DApp项目就是换一种方式割韭菜,下面我将用一个模型,教大家学会判断DApp挖矿是否可行。什么是DApp挖矿 ?除了DApp挖矿,可能你还听过手机挖矿、交易挖矿等等,本质上,都是项目社区建设的一种营销方式,和ofo的骑车返现一个道理。在DApp之前,挖矿通常是指BTC/ETH/LTC/BCH等针对公链通过维护主⽹的性能来获取Token奖励的⾏为。⽐如BTC,矿工通过电力和算力不断计算哈希值获得打包区块的权利,把10分钟的所有交易进⾏确认形成区块,获得奖励。但EOS带来的DApp繁荣,重新定义了矿圈生态。DApp矿工:DApp矿⼯是指高频的重复参与游戏而获得少量游戏Token奖励的人群。DApp挖矿:DApp矿工通过脚本高频参与游戏,自动化挖矿。挖矿的风险在于脚本可能本身有风险,以及获得的游戏Token因价格下跌不足以支付挖矿成本(EOS成本投入、CPU租赁成本、平台抽水等)。DApp矿场主:脚本提供者,通过邀请奖励来获取矿工EOS下注额的奖励。矿工奖励:DApp的Token类似于股权,有分红的属性;一方面挖取的Token可以通过去中心化交易所或者场外交易直接卖掉赚取收益,另一方面可以通过质押Token或者持有Token以获取项目方的分红。DApp挖矿真能挣钱吗?DApp挖矿的本质是,追求最大胜率下,最大的挖矿收益,而不是赌博。判断能不能挣钱,其实很简单:只要所获得的游戏Token价值大于挖矿成本,就能挣钱。注:挖矿成本包括CPU租赁成本、平台抽水成本、亏掉的EOS等。目前大部分项⽬方上线当天就会上线去中心化交易所,由矿工根据交易所的实时价格和挖矿模型决定是否挖矿,如果是盈利的,则会涌入项目方挖矿并进行套利。最简单的挖矿模型如下:盈亏EOS= (挖矿奖励 当前行情 + 邀请奖励)- (1 - 玩家胜率 平台赔率)在该模型中,唯一的变量是当前行情,其余数值项目方会公示。在北京时间12月28⽇16:00,DappDiscover研究院选取了几个比较热门的项目作为样本,并基于目前的行情价格进行量化分析。由表格可知,目前这几个热门的博彩项目均已不适合挖矿,也就是说,现在挖矿是亏本的。项目方一般都会推出一些刺激活动,比如交易排名奖励、抽奖活动等等。新上线的项目,前期为了获取用户量和交易量,挖矿奖励一般会很高。不过,也要注意,是否有挖矿减半机制,当奖励减半的时候,还要再次判断是否值得挖矿。由于庞大矿工群体的需求,除了目前市面上超过10款用于EOS DApp挖矿的脚本外,也有项目方针对矿工群体开发了挖矿机器人。机器人可以依据实时行情判断挖矿是否有收益,如果当前行情挖矿有收益的话,可以根据规则自动挖矿。综上所述,在DApp挖矿模型中,矿工一般需要考察以下五个方面:游戏Token的实时行情;游戏胜率以及平台抽⽔比例;挖矿比例和邀请奖励;是否存在挖矿减半机制;项目方推出的活动挖矿请注意在EOS Dapp这个圈子里,收益和风险是成正比的。目前最大的坑是项目良莠不齐!因为项目方没有那么多,所以有些项目方会模仿BetDice,直接盗版一个就去挖矿。好多用户因为前期错过了BetDice的红利机会,觉得新项目有利可图,就会不顾风险便冲进入挖矿。如果一个项目只说收益而不提风险,就不要进入了,任何项目挖矿都是有风险的。目前Dapp的发展趋势是矿工在变多,玩家在变少,实际上一个项目要想长久发展,必须靠玩家(赌徒)去贡献利润。所以最终还是落到了项目本身,回归商业本质,通过不断迭代和发展,吸引新用户和新的流量。你有哪些感兴趣的DApp?欢迎留言回复下一次讨论的,也许就是它。

January 21, 2019 · 1 min · jiezi

最易懂的闪电网络Lightning Network的简介

区块链很慢,而且昂贵。闪电网络(Lightning Network)就是解决这个问题的。如果我不得不发送给你一些比特币,你会在几个小时内收到它们,而且我也支付了很高的交易费。凭这样的声誉,Blockchains将如何接管世界?任何可以解决区块链不可扩展性的想法都值得关注,特别是时间和精力相关的。闪电网络就是这样一个想法。但在我们理解解决方案之前,我们需要了解问题。为什么区块链很慢?“我是一个缓慢的步行者,但我从不回头。”——亚伯拉罕林肯将区块链视为注册。此寄存器包含多个页面(块),其中每个页面都有多个交易。一旦页面填满了交易,就需要在开始在下一页上记录交易之前将其添加到寄存器中。在页面(块)可以添加到寄存器(链)之前,需要进行一些处理以确保每个人都同意它包含的内容。对于每个块,该过程大约需要10分钟(对于比特币区块链)。想象一下,你发送1BTC给你的朋友乔。交易看起来像这样。除其他事项外,交易包含有关发件人,收件人,金额和交易费用的信息。等一下,交易费?“顾问只拯救足以支付他的费用的客户。”——Arnold H. Glasow是的,需要额外付费。你可以支付费用以激励矿工尽快将你的交易包含在一个区块中。没有定价,完全取决于你愿意支付多少费用以加快流程。费用越高,交易越快。在任何给定时刻,有几个交易可以记录在当前页面上。矿工,即在区块链网络中工作的计算机,必须决定在当前区块中包括哪些可用的交易。为了帮助他们做出决定,他们会查看哪些交易产生的回报最多——这意味着交易费用最高的交易将首先包含在内。如果有足够的交易费用比你的交易费用更高,那么你的交易将不得不排队等候。等待可以持续几分钟到几个小时。有时甚至是几天。你支付的交易费用越多,你的交易处理速度就越快。这就是为什么Blockchains很慢,因此每个人开始使用都很昂贵。理想情况下,Blockchain的采用意味着会发生更多交易,但随着交易数量的增加,网络将变得缓慢,成为采用的障碍。悖论!闪电网络(LN)是解决该问题的潜在解决方案。那么什么是Lightning Network呢?“雷声很好,雷声令人印象深刻;但这是工作的闪电。“——马克吐温LN背后的想法是并非所有交易都需要记录在区块链上。想象一下你和我之间的交易很多次。在这种情况下,我们可以绕过区块链上的交易记录并将其从链中带走。用最简单的术语来说,它是如何工作的——我们将在我们之间打开一种称为支付渠道的东西,并在区块链上记录它的开头。现在,你和我可以通过此付款渠道进行多次交易,并且可以保持开放数小时,数天,数周或数十年。我们再次触摸Blockchain的唯一一次是我们想要关闭频道的时候。然后,我们将写出通过区块链上的渠道发生的交易的最终状态。使用这种支付渠道的概念,我们可以创建一个支付渠道网络,这样很少需要在区块链上进行交易。想象一下,有三个角色 - Xan,Yelena和Zeke。如果Xan和Yelena之间有一个支付渠道,Yelena和Zeke之间有一个支付渠道,那么Xan可以通过Yelena向Zeke汇款。假设Xan想要向Zeke发送2个BTC,Yelena将向Zeke发送2个BTC,并且Xan将向Yelena报销2个BTC。这就是Lightning Network的想法。因为你不会经常触摸区块链,所以交易将以闪电般的速度发生。正如你现在可能已经猜到的那样,所有的魔力都发生在支付渠道中。让我们学习这个魔术。那些支付渠道是什么?“就个人而言,我们是一滴。我们在一起就是一片海洋。“——Ryunosuke Satoro这就像一个保险箱,两个人存入相同数额的钱,每个人都锁定它。这种在公共场所存入等量金钱的行为以“开放交易”的形式记录在区块链上,之后在这两个人之间开放支付渠道。在这样一个盒子里锁钱的想法是没有一个人可以在没有另一个人的情况下把钱花在盒子里。然后,此框中的钱用于彼此之间的交易。想象一下,Xan和Yelena在10个BTC中共用一个共用框。现在,如果Xan想要送2个BTC给Yelena,他会怎么做?要做到这一点,他会将他在公共场所中的两个比特币的所有权转让给Yelena。在转移承诺后,如果盒子被解锁,Xan将能够获得8个BTC,Yelena将能够获得12个BTC。但他们不会打开盒子,因为他们想继续在他们之间进行交易。这就是这种安排的美妙之处。现在,如果第二天,Yelena必须向Xan发送1个BTC,她也会这样做——将其中一个比特币的所有权转让给Xan。在这两笔交易之后,如果开箱,Xan可以申请9个BTC,Yelena可以获得11个BTC。想象一下脱链交易的样子,请考虑以下事项:总而言之,支付渠道只不过是将一些资金汇集在一起,然后以商定的方式转让汇集资金所有权的承诺。如果Xan或Yelena想要关闭频道,他们可以。关闭一个频道只是意味着打开盒子并拿走里面的钱。这个盒子的开口发生在Blockchain上,谁拥有盒子中的多少钱永远记录下来。这就是支付渠道的运作方式。但这甚至没有接近定义他们的真正潜力。当两个或多个支付渠道共同构成一个网络——闪电网络时,它们的真正力量得以释放。知道了,它实际上是如何工作的?“很棒的事情是由一系列小东西组合而成的。”——文森特梵高LN的工作原理是将比特币所有权的价值转移到比特币的所有权承诺。这种转变是巨大的。像往常一样,我们将用一个例子来理解这一点。想象一下,有三个人:Xan,Yelena和Zeke。这样在Xan和Yelena之间就有一个支付渠道,Yelena和Zeke之间还有另一个渠道。请注意,Xan和Zeke之间没有支付渠道。在这种情况下,如果Xan想要将2个BTC转移到Zeke,他可以使用Yelena和Zeke之间的支付渠道来做到这一点。这看起来怎么样?Xan要求Yelena在Yelena-Zeke支付渠道上将2个BTC的承诺转让给Zeke,然后他在Xan-Yelena频道以2个BTC向Yelena报销。通过这种支付渠道网络,可以从区块链中卸载大量的交易,从链条上进行,从而释放链条的带宽。使用支付渠道网络,可能会发生数百万笔交易,而且交易费用也很高。这就是闪电网络。而且,现在你知道如何向你的朋友解释它。或者,如果你感到懒惰,只需将它们发送到这篇文章。分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。汇智网原创翻译,转载请标明出处。这里是原文最简单易懂的介绍闪电网络Lightning Network

January 10, 2019 · 1 min · jiezi

比特币闪电网络(Lightning Network)及其工作原理

当比特币于2008年由Satoshi Nakamoto首次提出时,James A. Donald对该系统的第一次公开评论包含以下内容:“我理解你的提案的方式,似乎没有达到所需的规模”。十年后,可扩展性仍然是比特币以及其他资深加密货币系统的最大问题。可伸缩性到底意味着什么?好吧,在它存在的整个过程中,比特币每秒只能处理大约7笔交易。虽然这在一开始就足够了,但该系统已经拥挤了几年了。因此,交易需要很长时间才能处理,交易费用也是偏高的。如果比特币永远成为现有支付系统的完全替代品,它显然需要能够与它们竞争。截至目前,它还差得很远。要了解情况的严重程度,只需比较比特币每秒7次的小额交易,以及Visa的平均24,000次交易,以及每秒约50,000次交易的峰值容量。多年来,比特币的社区就如何提高比特币的可扩展性提出了各种建议,但尚未达成清晰的总体共识。这就是为什么我们目前有几个类似比特币的网络从原始网络分支出来的原因。然而,目前正在测试的一种提议的解决方案可能能够正常工作。它被称为闪电网络。什么是闪电网络?在历史的某个时刻,发送电报是最快捷,最有效的长途通信方式。为此,你必须前往当地邮局,填写表格并根据其中包含的信件支付费用。然后,该消息将被发送到最近的电报局,以便传送到远端。邮差然后将电报发送到目的地。基本上,有很多人参与发送一条简短的短信,你必须付出相当多的钱。这几乎是比特币网络的当前状态。在这个类比中,闪电网络基本上像如果有一个你想要快速拨号交谈的人:只需要按“1”就可以让你朋友的电话响了。简而言之,比特币闪电网络背后的想法可能听起来像这样:我们真的不需要每一笔交易都记录在区块链上。相反,Lightning Network为比特币的区块链增加了另一层,使用户能够在该额外层上的任何两方之间创建支付渠道。这些渠道可以根据需要存在,并且由于它们是在两个人之间建立的,交易几乎是即时的,费用将极低甚至不存在。它是如何工作的?输入Danny和Jon。他们可能正在一起工作,他们可能是亲戚或一对夫妇,重点是他们需要经常,快速且以最低费用向对方汇款。因此,他们在闪电网络上建立了一个频道。首先,他们需要创建一个多功能钱包,这是一个钱包,他们可以用他们各自的私钥访问。然后,他们都将一定数量的比特币(比如每个3比特币)存入该钱包。从那时起,他们可以在两者之间进行无限制的交易。基本上,这些交易是存储在共享钱包中的资金的重新分配。例如,如果Danny想要向Jon发送1BTC,她将需要将该金额的所有权转让给他。然后,他们两个使用他们的私钥签署更新的资产负债表。 资金的实际分配发生在渠道关闭时。该算法使用最近签署的资产负债表来确定谁获得了什么。如果Danny和Jon决定在一次交易后关闭频道,Danny将获得2BTC,而Jon将获得4BTC。只有在频道关闭后,有关其初始和最终余额的信息才会广播到比特币区块链。因此,Lightning Network的工作方式是它允许用户在主区块链之外进行大量交易,然后将它们记录为单个交易。最令人兴奋的是,一旦该技术被广泛采用,你甚至不一定需要建立专门的渠道来向某个人发送资金。相反,你可以使用与你已连接的人的频道向某人发送付款。系统将自动找到最短路径。这就是闪电网最终可能为比特币购买一杯咖啡的永无止境的辩论提供答案的方法。从它的外观来看,通过Lightning频道闪电网络这样做可能会起作用,因为它几乎只是一次购买,不会产生任何费用。那安全吗?但是,值得注意的是,Lightning Network的概念意味着系统将在区块链之上工作,但实际上并不具备其安全性。因此,它很可能主要用于小微交易。需要去中心化安全性的较大转账很可能仍将在原始层上完成。最后,目前正在测试的Lightning Network的另一个有趣特征是交叉链原子交换,它是不同区块链之间的代币转移。简而言之,它是一种在不使用加密货币交换的情况下将任何给定的加密货币交换到另一种加密货币的方式。最终,这项技术可能会使不安全的集中式加密货币交换以及与交易相关的麻烦都过时。比特币和莱特币测试区块链之间交换代币的第一个测试已经证明是成功的。谁开发了它?Lightning Network最初是由Joseph Poon和Thaddeus Dryja在2015年的白皮书中描述的——当前版本的白皮书可以在这里找到。目前有三个团队共同开展闪电网络的大部分工作:Blockstream,Lightning Labs和ACINQ,以及来自比特币社区其他成员的意见。上面提到的每个初创公司都在使用他们自己的实现,以不同编程语言编写的Lightning网络协议。服务商产品Blockstream适用于C版的LN版本。Lightning Labs正在开发一个用Golang编写的Lightning Network Daemon(lnd)。ACINQ负责Scala实施。此外,目前还有正在开发其他实施方案。完整列表可在此处获得。最后,重要的是要提到最近的测试已经证明三个主要实现是完全可互操作的,这意味着它们可以彼此无缝地协同工作。何时,在哪儿以及为何使用它?加密货币社区似乎热切期待Lightning Network的推出。最初,它是专门为比特币设计的,但该技术目前正在为一系列其他加密货币开发,如Stellar,Litecoin,Zcash,Ether和Ripple。真正的比特币实际上已经被发送并且几乎总是使用Blockstream,Lightning Labs和ACINQ的实现接收,证明所有这三个实现都是可互操作的。此外,已经公布了第一版闪电网络规则概述的规范。这些规范是网络向前迈出的一大步,因为它们可以被应用程序的开发人员使用,也可以在其他编程语言中实现Lightning Network。然而,该网络仍处于起步阶段。到目前为止,还没有软件可以让网络的真实临时用户进行交易。此外,目前的实施仍然是非常错误的时机。Lightning Network开发人员已经敦促用户使用比特币的测试网了解网络,而不是发送任何真钱。开发人员还建议用户保持耐心,因为网络代码非常复杂,需要严格的测试。为了被比特币社区完全采用,Lightning Network需要证明自己是安全和可用的。考虑到这一点以及许多其他因素,专家预测,完全正常工作的闪电网络可能需要几个月到几年的时间。至于使用网络的原因,答案很简单:可扩展性。如果网络实际上将提供比特币主要问题的解决方案,它很可能会被其他加密货币采用。如果发生这种情况,可能会进一步开发交叉链原子交换技术,从而标志着建立真正去中心化的加密货币交换的第一步。Pros优点正如之前提到的,闪电网络只是迈出了第一步。它仍然处于开发阶段,它是否会像开发人员想象的那样实际工作仍有待观察。如果是这样,以下是Lightning Network的一些最重要的优势,你可以从中受益:交易速度。一旦网络上线,就不必等待你尝试进行的每笔交易的多次确认。无论网络有多繁忙,交易几乎都是即时的。如果发生这种情况,加密货币市场将朝着能够与Visa,MasterCard和PayPal等传统支付系统竞争迈出巨大的一步。交易费用。由于交易实际上将在闪电网络频道内和区块链之外进行,因此你只需支付最微小的费用(如果有的话)。这是Lightning Network的主要优势之一,因为这将完全使比特币成为商店,咖啡馆,酒吧等的一种付款方式。可扩展性。据说闪电网能够将比特币和其他加密货币的每秒交易数量达到每秒至少100万笔交易的前所未有的高度。交叉链原子交换。交叉区块链交易的第一次测试奏效了,这一切都非常令人兴奋。只要两个区块链共享相同的加密哈希函数(并且大多数主要区域链共享),用户将能够将钱从一个链转发到另一个链,而不必信任第三方中介,例如交换。该技术具有真正的革命性潜力。安全和匿名。绝大多数加密货币都没有完全匿名。发送仍然可以从一个钱包跟踪到另一个钱包。然而,当谈到闪电网络时,大部分交易都发生在主区块链之外,因此通过Lightning渠道进行的所有微支付几乎都无法追踪。Cons缺点没有全面运作。目前Lightning Network的主要缺点可能还在于它尚未完全投入运营,因此没有办法完全断言它实际上有多好。此外,它的概念在纸面上看起来很棒,但是到目前为止还不可能知道它是否会在实现后看起来很棒。渠道的复杂性。闪电网络被概念化为一种渠道网络,一旦建立,理论上应该允许无缝交易。但是,如果付款必须采取过于错综复杂的路线,则无法确定会发生什么。当然,如果你的交易需要通过几十个中间渠道,费用就会增加。渠道上限。该网络的另一个缺点是,在其当前版本中,通道被限制。也就是说,两个用户在建立频道时存储在钱包中的比特币数量是该频道中的最大资金数量。这种设置创造了一种情况,即某些用户可能需要在主要区块链中选择闪电网络渠道中的流动性和其外部的流动性。这远非理想,特别是那些资源相当有限的人。路由集中。此外,人们一直担心会形成“枢纽”——一种拥有大量资金的节点,大多数交易都将通过这些节点。许多比特币爱好者认为这是网络的进一步集中化。但是,这些中心不太可能能够获得任何重大的交易费用。同样,值得指出的是,目前上面列出的闪电网络的优点和缺点都非常具有推测性。我应该使用闪电网吗?嗯,事实上,如果你不是高级用户,那么你还不能使用Lightning Network。所以,你现在唯一可以做的就是等待,看看闪电网络是否能够实现而非炒作,它是否真正起作用和描述以及它是否安全。请记住,Lightning Network不是唯一的缩放提案,并且它绝不是该竞赛中无可争议的领导者,比特币现金(BCH)是其主要竞争对手。BCH擅长者和闪电支持者之间的辩论很激烈,看不到尽头。可能是其中一个提案出现在最前面,它们可能共存,或者可能存在完全不同的解决方案。闪电网听起来令人兴奋。如果它确实提供,请考虑你实际使用比特币的内容。如果你使用代币作为长期投资而不是其他任何东西,你可能甚至不需要Lightning Network,因为目前委托它处理大额转账似乎并不完全安全。但是,如果你将比特币视为一种替代支付方式,那么闪电网络如果符合预期,对你来说将是至关重要的。即时微支付,匿名性增加,几乎不存在费用——它似乎真正为大多数比特币的问题提供了解决方案。======================================================================分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。汇智网原创翻译,转载请标明出处。这里是原文比特币闪电网络(Lightning Network)及其工作原理

January 7, 2019 · 1 min · jiezi

区块链矿工挖矿交易的七个步骤

你有没有想过区块链的挖掘过程如何进行的,或者你的交易如何得到确认并添加到了区块链?好吧,我也是如此。由于我找不到任何明确的逐步解释这个过程文章,我决定深入研究并自己编写指南。以下是区块链交易如何通过七个步骤从你的钱包处理到区块链中。步骤1用户注销交易从他们的钱包应用程序,尝试从他们发送某个加密币或代币给其他人。步骤2交易由钱包应用程序广播,现在等待矿工在相应的区块链上接收。只要它没有被挖掘,它就会在“未经证实的交易池”中徘徊。此池是网络上等待处理的交易的集合。这些未经证实的交易通常不会收集在一个巨型池中,但更常见的是在小型细分的本地池中。步骤3网络上的矿工(有时称为节点,但不完全相同!)从这些池中选择交易并将其形成“块”。除了一些元数据之外,块基本上是交易的集合(此时,仍然是未经证实的交易)。每个矿工都构建他们自己的区块,但是多个矿工可以选择要包含在他们区块中的相同交易。示例:两名矿工,矿工A和矿工B。矿工A和矿工B都可以决定将交易X包含在他们的区块中。块具有最大数据大小。在比特币区块链中,块的最大大小是最大1MB的数据。但在将交易添加到其块之前,小型企业需要根据区块链历史检查交易是否有资格执行。如果发件人的钱包余额根据现有的区块链历史记录具有足够的资金,则该交易被认为是有效的并且可以添加到该块中。矿工通常会优先考虑设置高交易费的交易,因为这会给他们更高的回报。步骤4通过选择交易并将其添加到其区块,矿工创建一个交易块。要将此交易块添加到区块链(以使所有其他节点和矿工注册交易),该块首先需要签名。此签名是通过解决每个交易块所特有的非常复杂的数学问题来创建的。每个块都有不同的数学问题,这意味着每个矿工都会处理他们构建的块所特有的不同问题,但所有这些问题同样难以解决。为了解决这个数学问题,需要大量的计算能力(因此需要大量的电力)。这是称为挖掘的过程。如果你想了解更多有关其工作原理的信息,请继续阅读下面的内容,否则请跳至第5步。挖掘aka哈希(工作量证明算法)当尝试向区块链添加块时,每个矿工面临的数学问题是找到其块中的数据的哈希输出(也称为签名),其以一定量的连续零开始。这听起来很复杂吧?但实际上并不那么难。让我试着用一个简单的方法向你解释。在我们继续之前,解哈希函数是什么很重要。不用担心,我不会涉及太多的技术细节。哈希函数只是一个很难解决的数学问题,但答案很容易验证。哈希函数接受数字和字母的输入字符串(字面意思是任意字符串的随机字母,数字和/或符号),并将其转换为由随机字母和数字组成的新的32位字符串。这个32位数字符串是哈希输出。如果输入字符串中的任何数字或字母发生更改,则哈希输出也将随机更改。但是,相同的输入字符串将始终提供相同的输出字符串。现在考虑块内的数据作为哈希输入(一串数据)。当对此输入进行哈希处理时,它会提供哈希输出(32位数字符串)。比特币区块链的一个规则是该输出字符串需要以连续数量的零开始,以便有资格作为块签名。这是每个矿工在尝试向区块链添加区块时所寻找的东西;以一定量零开始的输出字符串。但是如果块的数据字符串没有哈希到以零的数量开头的输出字符串中呢?好吧,这就是为什么矿工们反复更改其块内的一部分数据,称为nonce。由于随机数会一直在变化,因此哈希函数的输入数据也会发生变化,从而导致不同的哈希输出。最终,矿工希望找到一个输入字符串(块数据和字符串的字符串),这些字符串哈希为符合条件的输出字符串(以零的数量开头)。下面的例子使用七个零,但这个零的数量实际上取决于区块链的区块难度。如果你还没准备好,请不要点击它。这就是矿工们需要找到符合条件的签名的方式,这也是解决这个数学问题需要如此大的计算能力的原因。猜测这么多不同的nonce需要花费大量的时间和计算能力。如果你顺利完成了很好的工作,现在让我们继续前进到第5步。注意:此过程实际上并未定义为数学问题,而是定义为确定性事项——计算机正在对数字执行预定操作以查看输出是否合乎需要。步骤5矿工首先为其区块找到符合条件的签名(解决方案),将此签名广播给所有其他矿工。步骤6其他矿工现在验证该解决方案是否与发件人块的问题相对应(如果哈希输入实际上导致该签名)。如果有效,其他矿工将确认解决方案并同意该块可以添加到区块链中。这就是“工作量证明”定义的来源。找到解决方案的矿工将其“工作量证明”(又称解决方案)发送给其他矿工,然后他们将验证解决方案是否合法。如果是,那么其他矿工将同意并且就区块链达成“共识”。现在可以将块添加到区块链中,并将其广播到网络上的所有其他节点及其签名。只要块内的交易与该时间点的当前钱包余额(交易历史)正确对应,其他节点将接受该块并将其保存到其交易数据中。步骤7如果大多数矿工达成共识,则块被添加到区块链中。每次在此块的顶部添加另一个块时,它将被视为其下方块的另一个“确认”。例如,如果我的交易包括在块502中,并且区块链是507个区块长,则意味着我的交易有5个确认(507-502)。这也是Etherscan在向你展示交易详情时所指的内容。你的交易确认越多,攻击者就越难以改变它。当新区块被添加到区块链时,所有矿工将不得不在第3步重新开始,形成一个新的交易区块。矿工们不能继续(好吧,他们可以,但这是无关紧要的)采矿也解决了他们正在研究的区块问题,原因有两个。1.它可能包含已被添加到区块链的最后一个块确认的交易,因此其中一些交易现在可能无效,使得整个块无效。2.每个块都需要添加哈希输出添加到区块链的最后一个块到其元数据中。这就是它成为区块链的原因。如果矿工继续挖掘他们已经在处理的块,其他矿工会注意到哈希输出与区块链上最新添加的块的输出不对应,因此将拒绝该块。======================================================================分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。汇智网原创翻译,转载请标明出处。这里是原文区块链矿工如何以七个步骤处理挖掘工作并进行交易

January 4, 2019 · 1 min · jiezi

如何设计一个比特币钱包服务

原文链接 https://github.com/liyue201/b…如何设计一个比特币钱包服务概述总所周知,比特币全节点的实现目前有两个版本,一个是中本聪c++写的原版bitcoin core,一个是go语言写的btcd。这两个版本从功能上并没有多大差异,都实现了比特币协议。从理论上讲,比特币网络中的每个全节点只要遵循相同的比特币协议,至于用什么语言实现,用什么方式存储都是无所谓的。bitcoin core和btcd都没有实现通用的钱包服务,这里说的钱包服务指的是一个可以给钱包app提供所数据的服务,私钥保存在钱包app中,用户交易在钱包app中签名,再将签名数据发给钱包服务,再由钱包服务转发到全节点上链,如图:所幸的是全节点提供了一些JSON RPC接口,通过这些接口可以读取区块数据和发起转账交易。但是能读到的数据还是太原始了,就连获取某个地址的余额都做不到。因为比特币使用的是UTXO账号体系,并没有一个统一的地方存储地址余额,只有UTXO。而UTXO是分散在每个区块中的,要想知道某个地址的UTXO,需要从第一个区块开始遍历。有些人说这样设计可以更好的并发执行,这个鄙人真的不敢苟同。说可以更好的溯源倒是真的,因为每一笔交易都可以追溯到上一笔交易。钱包服务功能好了,废话不多说,我们看一下一个钱包服务应该具备什么样的功能。(1)查询任意一个地址的余额,钱包需要知道自己地址的余额。(2)查询任意一个地址的UTXO,钱包转账时需要UTXO来签名打包。(3)发起转账交易。钱包需要调服务发起转账交易。(4)查询任意一个地址的历史交易记录。(5)查询最新区块高度,钱包转账后通过区块高度来计算交易是否已经确认,比特币是6个区块确认。第(1)(2)点实际上是一个问题,知道UTXO自然就知道余额了。第(3)(4)可以直接调全节点接口。所以钱包服务的难点只剩下(2)(4)这两个功能。钱包服务要做的就是从全节点从第一个区块开始遍历读取所有的交易记录,并推导出每个地址当前区块高度的UTXO,再将这个信息保存到数据库中方便钱包使用。全节点选择bitcoin core 虽然是原版的比特币全节点,但是他只提供了http接口,没有websocket接口,不能实时推送未上链的交易。一个体验好的钱包不仅要获取已经上链的交易记录,也要知道未上链的交易。btcd不仅提供了http接口,还有websocket,所以btcd应该是更好的选择。数据库选型到目前为止(2018-12-26)比特币的交易量是3.6亿,因为一笔交易涉及到多个输入和多个输出地址(如果你研究过区块链浏览器上的数据,会发现一笔交易几千个输入和几千个输出都是很正常的,这样可以省矿工费,可能是交易所转账),解析出来后大约是16.6亿条(这个我自己跑的数据)。若是用传统的关系型数据库肯定扛不住的,所以一般人都会往nosql或者列式数据库方向考虑,比如用mongo或cassandra等。虽然能够解决问题,但是面对这么大的数据,这类型的数据库都需要部署分片集群。对于一个小创业公司来说,如果用户不是很多,从运维成本上来看,是不是都点杀鸡用牛刀大感觉呢。有没有经济实惠的方案?当然有,比如leveldb和rocksdb这类kv嵌入式数据库,只需要单个机器就可以满足要求。在几亿数据量情况下,leveldb在普通硬盘上读写速度可以达到几万每秒,使用ssd硬盘更快,而且内存占用极少。当然使用leveldb或rocksdb,也有其缺点,就是单机数据安全的问题,如果硬盘坏了怎么办。恰好我们这个业务对数据的安全性要求并不高,因为所有数据都是从全节点来的,要是硬盘坏了,大不了重新跑一遍数据。rocksdb是facebook的开源产品,据说是对leveldb做了优化,性能更强。rocksdb是c++写的,而leveldb除了c++版本之外,还有go语言版本,比特币全节点btcd和以太坊全节点geth都是用的go版本的leveldb。最终我选择了leveldb,因为我的服务是用go写的,虽然go也可以通过cgo调用C++,但是代码写起来没有纯go那么舒服。数据结构leveldb是kv数据库,没有表的概念,所以数据结构的设计非常关键。比如地址的历史交易记录,在关系型数据库中可以建一个以地址为索引的历史交易记录表。而kv数据库则没有索引的概念。好在level的key是有序的,可以根据key的顺序读取内容。根据这个特性,我们可以这样设计索引,每个地址的交易是一组key,这组key在数据库的所有key中是紧挨着的。这样只要知道某个地址的第一个索引key就可以按顺序读到这个地址的其他交易。因为一个交易涉及到多个输入地址和输出地址所以需要索引跟数据分开,对于utxo只关联到一个地址,就不需要单独设计索引了,索引跟数据可以放在一起。数据结构设计好了,该怎么存。这个就是序列化的问题了,可以是json,或者go自带的gob,也可以自己写。最后从编码难度,执行效率和压缩率等方面综合考虑采用了protobuf。这是我的proto文件syntax = “proto3”;package models;//key: utxo-{addr}-{Transaction.id}-{Transaction.vout}message Utxo { string txId = 1; uint32 vout = 2; int64 amount = 3; string scriptPubKey = 4;}//context//key: contextmessage Context { int64 blockHeight = 1; // 当前处理的区块高度 string blockHash = 2; // 当前处理的区块hash int32 blockTotalTx = 3; // 当前区块的交易数 int32 BlockProcessedTx = 4; // 当前区块已经处理的交易数 int64 totalTx = 5; // 总共的交易数 int64 totalTxNode = 6; //}message TxInput { string txId = 1; //上一笔交易id uint32 vout = 2; //上一笔交易输出的idx string addr = 3; //通过查询获得 int64 amount = 4; //通过查询获得}message TxOutput { string addr = 1; int64 amount = 2; uint32 vout = 3; string scriptPubKey = 4;}//key: tx-{Transaction.txId}message Transaction { int64 id = 1; //自增di string txId = 2; int64 blockTime = 3; string blockHash = 4; int64 blockHeight = 5; repeated TxInput inputs = 6; repeated TxOutput outputs = 7;}//key: txnode-{addr}-{TxNode.id}message TxNode{ int64 id = 1; //自增di string txId = 2; uint32 type = 3; //1-intput 2-output 3-intput|output}总结这个项目的难点不在编码而是技术选型,当然还有调试。代码写完后经过漫长的同步,大概半个月才同步完成。 只有同步完成才能进行完整的功能测试,若果有数据的bug还得从头开始同步。需要注意的是这里只是设计了已经确认的区块,对于未确认的区块和内存池的交易要单独考虑。 ...

January 2, 2019 · 1 min · jiezi

对比特币底层协议的一些理解

媒体对比特币的关注让我开始了解比特币的真正运作方式,直至流经网络的字节数。普通人使用隐藏真实情况的软件,但我想亲自了解比特币协议。我的目标是直接使用比特币系统:手动创建比特币交易,将其作为十六进制数据提供给系统,并查看它是如何处理的。事实证明这比我预期的要困难得多,但我在这个过程中学到了很多东西,希望你会发现它很有趣。本篇博文首先简要介绍比特币,然后跳转到低级细节:创建比特币地址,进行交易,签署交易,将交易提供给对等网络,并观察结果。比特币的快速概述在深入研究细节之前,我将首先快速概述比特币的工作原理。比特币是一种相对较新的数字货币,可以通过互联网传输。你可以用Coinbase或MtGox等网站上的美元或其他传统资金购买比特币,将比特币发送给其他人,在某些地方用它们买东西,然后将比特币兑换成美元。为了略微简化,比特币由分布式数据库中的条目组成,该数据库跟踪比特币的所有权。与银行不同,比特币与用户或账户无关。相反,比特币由比特币地址拥有,例如1KKKK6N21XKo48zWKuQKXdvSsCf95ibHFa。比特币交易交易是消费比特币的机制。在交易中,某些比特币的所有者将所有权转移到新地址。比特币的一个关键创新是如何通过挖掘在分布式数据库中记录交易。交易被分组为块,大约每10分钟发送一个新的交易块,成为交易日志的一部分,称为区块链,表示交易已经(或多或少)正式进行。比特币挖掘是将交易放入块中的过程,以确保每个人都具有一致的交易日志视图。为了挖掘区块,矿工们必须找到一种极其罕见的解决方案来解决(否则无意义的)加密问题。找到此解决方案会生成一个已开采的块,该块将成为官方区块链的一部分。挖掘也是比特币进入系统的新机制。当块成功挖掘时,块中会生成新的比特币并支付给矿工。这个采矿奖金很大——目前每块25比特币(约19,000美元)。此外,矿工获得与区块中的交易相关的任何费用。因此,采矿与许多试图开采矿块的人竞争非常激烈。采矿的难度和竞争力是比特币安全的关键部分,因为它确保没有人可以用坏块淹没系统。点对点网络没有集中的比特币服务器。相反,比特币在点对点网络上运行。如果你运行比特币客户端,你将成为该网络的一部分。网络上的节点彼此交换其他对等体的交易,块和地址。首次连接到网络时,客户端会从某个随机节点或节点下载区块链。反过来,你的客户端可能会向其他节点提供数据。当你创建比特币交易时,你将其发送给某个对等方,该对等方将其发送给其他对等方,依此类推,直到它到达整个网络。矿工获取你的交易,生成包含你的交易的挖掘区块,并将此挖掘的区块发送给对等方。最终,你的客户端将收到该块,你的客户端将显示该交易已处理完毕。加密比特币使用数字签名来确保只有比特币的所有者可以使用它们。 比特币地址的所有者具有与该地址相关联的私钥。 为了花费比特币,他们用这个私钥签署交易,证明他们是所有者。 (这有点像签署物理检查以使其有效。)公钥与每个比特币地址相关联,任何人都可以使用它来验证数字签名。块和交易由其内容的256位加密哈希标识。 此哈希值用于比特币协议中的多个位置。 此外,查找特殊哈希是挖掘块的难题。深入原始比特币协议本文的其余部分将逐步讨论我如何使用原始比特币协议。首先,我生成了比特币地址和密钥接下来,我做了一笔交易,将少量的比特币转移到这个地址。签署此交易给我带来了很多时间和困难。最后,我将这笔交易送入比特币点对点网络并等待它开采。本文的其余部分将详细介绍这些步骤。事实证明,实际使用比特币协议比我预期的更难。正如你将看到的,该协议有点混乱:它使用大尾数字,小尾数数字,固定长度数字,可变长度数字,自定义编码,DER编码和各种加密算法,看似随意。因此,将数据转换为正确的格式会有很多烦人的操作。直接使用协议的第二个复杂因素是加密,这是非常不可原谅的。如果你得到一个字节错误,则会拒绝该交易,而不知道问题出在何处。我遇到的最后一个困难是签署交易的过程比必要的困难得多,需要纠正很多细节。特别是,签名的交易版本与实际使用的版本非常不同。比特币地址和密钥我的第一步是创建一个比特币地址。通常,你使用比特币客户端软件来创建地址和相关密钥。但是,我写了一些Python代码来创建地址,准确显示幕后发生的事情。比特币使用各种键和地址,因此下图可能有助于解释它们。首先创建一个随机的256位私钥。需要私钥来签署交易,从而转移(支出)比特币。因此,私钥必须保密,否则你的比特币可能被盗。Elliptic Curve DSA算法从私钥生成512位公钥。(椭圆曲线加密将在后面讨论。)此公钥用于验证交易上的签名。不方便的是,比特币协议为公钥添加了前缀04。在签署交易之前不会公开公钥,这与大多数公钥公开的系统不同。下一步是生成与其他人共享的比特币地址。由于512位公钥不方便大,因此使用SHA-256和RIPEMD哈希算法将其分解为160位。然后使用比特币的自定义Base58Check编码以ASCII编码密钥。结果地址,例如1KKKK6N21XKo48zWKuQKXdvSsCf95ibHFa,是人们为了接收比特币而发布的地址。请注意,你无法从该地址确定公钥或私钥。如果你丢失了私钥(例如丢弃了硬盘),你的比特币将永远丢失。最后,电子钱包交换格式密钥(WIF)用于向客户端钱包软件添加私钥。这只是将私钥的Base58Check编码转换为ASCII,这很容易被反转以获得256位私钥。(我很好奇是否有人会使用上面的私钥来窃取我的80美分的比特币,当然有人这样做了。)总而言之,有三种类型的密钥:私钥,公钥和公钥的hash,它们使用Base58Check编码在ASCII外部表示。私钥是重要的密钥,因为它需要访问比特币,而其他密钥可以从中生成。公钥哈希是你看到的比特币地址。我使用以下代码片段生成WIF格式的私钥和地址。私钥只是一个随机的256位数字。ECDSA加密库从私钥生成公钥。比特币地址由SHA-256哈希,RIPEMD-160哈希,然后是带校验和的Base58编码生成。最后,私钥在Base58Check中编码,以生成用于将私钥输入比特币客户端软件的WIF编码。注意:这个Python随机函数不是强加密;如果你真的这样做,请使用更好的功能。def privateKeyToWif(key_hex): return utils.base58CheckEncode(0x80, key_hex.decode(‘hex’)) def privateKeyToPublicKey(s): sk = ecdsa.SigningKey.from_string(s.decode(‘hex’), curve=ecdsa.SECP256k1) vk = sk.verifying_key return (’\04’ + sk.verifying_key.to_string()).encode(‘hex’) def pubKeyToAddr(s): ripemd160 = hashlib.new(‘ripemd160’) ripemd160.update(hashlib.sha256(s.decode(‘hex’)).digest()) return utils.base58CheckEncode(0, ripemd160.digest())def keyToAddr(s): return pubKeyToAddr(privateKeyToPublicKey(s))# Warning: this random function is not cryptographically strong and is just for exampleprivate_key = ‘’.join([’%x’ % random.randrange(16) for x in range(0, 64)])print keyUtils.privateKeyToWif(private_key)print keyUtils.keyToAddr(private_key)在交易中交易是比特币系统的基本操作。你可能希望交易只是将一些比特币从一个地址移动到另一个地址,但它比这更复杂。比特币交易在一个或多个输入和输出之间移动比特币。 每个输入都是提供比特币的交易和地址。每个输出都是接收比特币的地址,以及到达该地址的比特币数量。上图显示了一个示例交易“C”。在此交易中,0.005BTC取自交易A中的地址,而0.003BTC取自交易B中的地址。请注意,箭头是对先前输出的引用,因此向后转到比特币流。)对于输出,0.003BTC指向第一个地址,0.004BTC指向第二个地址。剩余的0.001BTC作为费用给到该区块的矿工。请注意,交易A的其他输出中的0.015 BTC不会用于此交易。使用的每个输入必须完全花在交易中。如果一个地址在一个交易中收到了100个比特币而你只想花1个比特币,那么交易必须花费所有100个。解决方案是使用第二个输出进行更改,这会将99个剩余比特币返回给你。交易还可以包括费用。如果在将输入相加并减去输出后仍有任何比特币剩余,则余额是支付给矿工的费用。该费用并非严格要求,但免费交易对矿工来说不是优先考虑的事项,可能几天不会处理,也可能完全丢弃。交易的典型费用是0.0002比特币(约20美分),因此费用很低但不是微不足道的。手动创建交易对于我的实验,我使用了一个带有一个输入和一个输出的简单交易,如下所示。我开始使用Coinbase的比特币并将0.00101234比特币放入地址1MMMMSUb1piy2ufrSguNUdFmAcvqrQF8M5,这是交易81b4c832…我的目标是创建一个交易,将这些比特币转移到我上面创建的地址,1KKKK6N21XKo48zWKuQKXdvSsCf95ibHFa,减去0.0001比特币的费用。因此,目标地址将接收0.00091234比特币。遵循规范,可以非常容易地组装无符号交易,如下所示。有一个输入,它使用来自交易81b4c832…输出0(第一个输出)81b4c832…请注意,此交易哈希在交易中不方便地反转。输出量为0.00091234比特币(91234为十六进制的0x016462),以小尾数格式存储在值字段中。加密部分———criptSig和scriptPubKey更复杂,稍后将对其进行讨论。这是我用来生成这个无符号交易的代码。这只是将数据打包成二进制的问题。签署交易是困难的部分,你将在下面看到。# Makes a transaction from the inputs# outputs is a list of [redemptionSatoshis, outputScript]def makeRawTransaction(outputTransactionHash, sourceIndex, scriptSig, outputs): def makeOutput(data): redemptionSatoshis, outputScript = data return (struct.pack("<Q", redemptionSatoshis).encode(‘hex’) + ‘%02x’ % len(outputScript.decode(‘hex’)) + outputScript) formattedOutputs = ‘’.join(map(makeOutput, outputs)) return ( “01000000” + # 4 bytes version “01” + # varint for number of inputs outputTransactionHash.decode(‘hex’)[::-1].encode(‘hex’) + # reverse outputTransactionHash struct.pack(’<L’, sourceIndex).encode(‘hex’) + ‘%02x’ % len(scriptSig.decode(‘hex’)) + scriptSig + “ffffffff” + # sequence “%02x” % len(outputs) + # number of outputs formattedOutputs + “00000000” # lockTime )比特币交易如何签署下图给出了如何签署和链接交易的简化视图。考虑中间交易,将比特币从地址B转移到地址C.交易的内容(包括先前交易的哈希)被哈希并用B的私钥签名。此外,B的公钥包含在交易中。通过执行几个步骤,任何人都可以验证交易是否被B授权。首先,B的公钥必须与前一个交易中的B地址相对应,证明公钥是有效的。(如前所述,地址可以很容易地从公钥中导出。)接下来,可以使用交易中B的公钥来验证B的交易签名。这些步骤确保交易有效并由B授权。比特币的一个意外部分是B的公钥在交易中使用之前不会公开。使用这个系统,比特币通过一系列交易从一个地址传递到另一个地址。可以验证链中的每个步骤以确保有效地使用比特币。请注意,交易通常可以有多个输入和输出,因此链分支到树中。比特币脚本语言你可能希望仅通过在交易中包含签名来签署比特币交易,但该过程要复杂得多。事实上,每个交易中都有一个小程序可以执行以确定交易是否有效。该程序是用Script编写的,这是一种基于堆栈的比特币脚本语言。复杂的赎回条件可以用这种语言表达。例如,托管系统可能需要三个特定用户中的两个必须签署交易才能使用它。或者可以设置各种类型的合约。Script语言非常复杂,有大约80种不同的操作码。它包括算术运算,按位运算,字符串运算,条件运算和堆栈操作。该语言还包括必要的加密操作(SHA-256,RIPEMD等)作为基元。为了确保脚本终止,该语言不包含任何循环操作。(因此,它不是Turing-complete。)但实际上,只支持几种类型的交易。为了使比特币交易有效,兑换脚本的两个部分必须成功运行。旧交易中的脚本称为scriptPubKey,新交易中的脚本称为scriptSig。要验证交易,执行scriptSig,然后执行scriptPubKey。如果脚本成功完成,则交易有效并且可以使用比特币。否则,交易无效。关键在于旧交易中的scriptPubKey定义了使用比特币的条件。新交易中的scriptSig必须提供满足条件的数据。在标准交易中,scriptSig将签名(从私钥生成)推送到堆栈,然后是公钥。接下来,执行scriptPubKey(来自源交易)以验证公钥,然后验证签名。如脚本中所述,scriptSig是:PUSHDATAsignature data and SIGHASH_ALLPUSHDATApublic key datascriptPubKey是:OP_DUPOP_HASH160PUSHDATABitcoin address (public key hash)OP_EQUALVERIFYOP_CHECKSIG执行此代码时,PUSHDATA首先将签名推送到堆栈。下一个PUSHDATA将公钥推送到堆栈。接下来,OP_DUP复制堆栈上的公钥。OP_HASH160计算公钥的160位哈希值。PUSHDATA推送所需的比特币地址。然后OP_EQUALVERIFY验证前两个堆栈值是否相等。来自新交易的公钥哈希与旧地址中的地址匹配。这证明公钥是有效的。接下来,OP_CHECKSIG检查交易的签名是否与堆栈上的公钥和签名匹配。这证明签名是有效的。签署交易我发现签署交易是手动使用比特币最困难的部分,其过程非常困难且容易出错。基本思想是使用ECDSA椭圆曲线算法和私钥生成交易的数字签名,但细节很棘手。签名过程已通过19个步骤(更多信息)进行了描述。单击下面的缩略图以获取该过程的详细图表。最大的复杂因素是签名出现在交易中间,这就提出了在签名之前如何签署交易的问题。为避免此问题,在计算签名之前,将scriptPubKey脚本从源交易复制到支出交易(即正在签名的交易)中。然后将签名转换为脚本语言中的代码,创建嵌入在交易中的scriptSig脚本。似乎在签名期间使用先前交易的scriptPubKey是出于历史原因而不是任何逻辑原因。对于具有多个输入的交易,签名甚至更复杂,因为每个输入都需要单独的签名,但我不会详细介绍。绊倒我的一步是哈希类型。在签名之前,交易具有临时附加的哈希类型常量。对于常规交易,这是SIGHASH_ALL(0x00000001)。签名后,此哈希类型将从交易结束时删除并附加到scriptSig。关于比特币协议的另一个令人讨厌的事情是签名和公钥都是512位椭圆曲线值,但它们以完全不同的方式表示:签名用DER编码编码,但公钥表示为普通字节。此外,两个值都有一个额外的字节,但位置不一致:签名后放置SIGHASH_ALL,类型04放在公钥之前。由于ECDSA算法使用随机数,因此调试签名变得更加困难。因此,每次计算时签名都不同,因此无法与已知良好的签名进行比较。更新(2014年2月):每次签名更改的一个重要副作用是,如果重新签名交易,交易的哈希值将会更改。这称为交易可维护性。还有一些方法可以让第三方以微不足道的方式修改交易,从而改变哈希,而不是交易的意义。尽管多年来人们已经知道,但是可塑性最近在MtGox(新闻稿)中引起了很大的问题(2014年2月)。由于这些复杂情况,我花了很长时间才能使签名工作。但最终,我从签名代码中获得了所有错误,并成功签署了一项交易。这是我使用的代码片段。def makeSignedTransaction(privateKey, outputTransactionHash, sourceIndex, scriptPubKey, outputs): myTxn_forSig = (makeRawTransaction(outputTransactionHash, sourceIndex, scriptPubKey, outputs) + “01000000”) # hash code s256 = hashlib.sha256(hashlib.sha256(myTxn_forSig.decode(‘hex’)).digest()).digest() sk = ecdsa.SigningKey.from_string(privateKey.decode(‘hex’), curve=ecdsa.SECP256k1) sig = sk.sign_digest(s256, sigencode=ecdsa.util.sigencode_der) + ‘\01’ # 01 is hashtype pubKey = keyUtils.privateKeyToPublicKey(privateKey) scriptSig = utils.varstr(sig).encode(‘hex’) + utils.varstr(pubKey.decode(‘hex’)).encode(‘hex’) signed_txn = makeRawTransaction(outputTransactionHash, sourceIndex, scriptSig, outputs) verifyTxnSignature(signed_txn) return signed_txn最终的scriptSig包含签名以及源地址的公钥(1MMMMSUb1piy2ufrSguNUdFmAcvqrQF8M5)。这证明我可以使用这些比特币,使交易有效。最终的scriptPubKey包含必须成功使用比特币的脚本。请注意,在使用比特币时,此脚本将在以后的某个任意时间执行。它包含以十六进制表示的目标地址(1KKKK6N21XKo48zWKuQKXdvSsCf95ibHFa),而不是Base58Check。结果是只有该地址的私钥的所有者可以使用比特币,因此该地址实际上是所有者。最后的交易一旦完成所有必要的方法,就可以组装最终的交易。privateKey = keyUtils.wifToPrivateKey(“5HusYj2b2x4nroApgfvaSfKYZhRbKFH41bVyPooymbC6KfgSXdD”) #1MMMMsigned_txn = txnUtils.makeSignedTransaction(privateKey, “81b4c832d70cb56ff957589752eb4125a4cab78a25a8fc52d6a09e5bd4404d48”, # output (prev) transaction hash 0, # sourceIndex keyUtils.addrHashToScriptPubKey(“1MMMMSUb1piy2ufrSguNUdFmAcvqrQF8M5”), [[91234, #satoshis keyUtils.addrHashToScriptPubKey(“1KKKK6N21XKo48zWKuQKXdvSsCf95ibHFa”)]] ) txnUtils.verifyTxnSignature(signed_txn)print ‘SIGNED TXN’, signed_txn最终交易如下所示。这将上面的scriptSig和scriptPubKey与前面描述的unsigned交易相结合。切线:理解椭圆曲线比特币使用椭圆曲线作为签名算法的一部分。在解决费马最后定理的背景下,我之前听说过椭圆曲线,所以我很好奇它们是什么。椭圆曲线的数学很有意思,所以我会绕道而行,快速概述一下。名称椭圆曲线令人困惑:椭圆曲线不是椭圆形,看起来不像椭圆,它们与椭圆几乎没有关系。椭圆曲线是满足相当简单的方程y^2=x^3+ax+b的曲线。比特币使用称为secp256k1的特定椭圆曲线,其简单方程为y^2=x^3+7。椭圆曲线的一个重要特性是你可以使用一个简单的规则在曲线上定义点的添加:如果你在曲线中绘制一条直线并且它击中三个点A,B和C,则添加由A+定义B+C=0。由于椭圆曲线的特殊性质,以这种方式定义的加法“正常”起作用并形成一个组。如果定义了加法,则可以定义整数乘法:例如4A=A+A+A+A。使椭圆曲线在加密方面有用的原因是它可以快速进行整数乘法,但除法基本上需要强力。例如,你可以非常快速地计算诸如12345678A=Q的乘积(通过计算2的幂),但是如果你只知道A和Q求解nA=Q很难。在椭圆曲线加密中,密码12345678将是私钥,曲线上的点Q将是公钥。在密码学中,坐标不是在曲线上使用实值点,而是以模数为模的整数。椭圆曲线的一个令人惊讶的特性是,无论使用实数还是模运算,数学运算都非常相似。因此,比特币的椭圆曲线看起来不像上面的图片,而是一个随机的256位点混乱(想象一个大的灰色方块点)。椭圆曲线数字签名算法(ECDSA)采用消息哈希,然后使用消息,私钥和随机数进行一些简单的椭圆曲线算法,以在曲线上生成给出签名的新点。拥有公钥,消息和签名的任何人都可以执行一些简单的椭圆曲线算法来验证签名是否有效。因此,只有具有私钥的人才能签署消息,但是具有公钥的任何人都可以验证该消息。有关椭圆曲线的更多信息,请参阅参考文献。将我的交易发送到p2p网络留下椭圆曲线,此时我创建了一个交易并签名。下一步是将其发送到点对点网络,在那里它将被矿工接收并合并到一个块中。如何找到同行使用p2p网络的第一步是找到一个对等体。每当有人运行客户端时,对等体列表每隔几秒就会更改一次。一旦节点连接到对等节点,它们就会在发现新对等体时通过交换addr消息来共享新对等体。因此,新同伴迅速通过该系统传播。然而,关于如何找到第一个同伴,有一个鸡与蛋的问题。比特币客户通过几种方法解决了这个问题。几个可靠的对等体在DNS中以bitseed.xf2.org的名称注册。通过执行nslookup,客户端获取这些对等端的IP地址,并希望其中一个可以工作。如果这不起作用,则将对等体的种子列表硬编码到客户端中。当普通用户启动和停止比特币客户端时,同行进入和离开网络,因此客户端有大量的营业额。我使用的客户现在不太可能正常运营,所以如果你想做实验,你需要找到新的同行。 你可能需要尝试一堆才能找到有效的方法。和同龄人交谈一旦我获得了工作对等体的地址,下一步就是将我的交易发送到对等网络。使用点对点协议非常简单。我在端口8333上打开了与任意对等方的TCP连接,开始发送消息,并依次接收消息。 比特币点对点协议非常宽容;即使我完全搞砸了请求,同行也会保持沟通。重要提示:正如一些人所指出的,如果你想进行实验,你应该使用比特币测试网,这可以让你试验“虚假”的比特币,因为如果你搞砸了真正的网络,很容易丢失你的宝贵的比特币。(例如,如果你忘记了交易中的更改地址,那么多余的比特币将作为费用交给矿工。)但我想我会使用真正的比特币网络并冒险使用价值1.00美元的比特币。该协议由大约24种不同的消息类型组成。每条消息都是一个相当简单的二进制blob,包含一个ASCII命令名和一个适合该命令的二进制有效负载。该协议在比特币维基上有详细记录 。连接到对等方的第一步是通过交换版本消息来建立连接。首先,我发送一个版本消息,其中包含我的协议版本号,地址和其他一些内容。对等体发回其版本消息。在此之后,节点应该用verack消息确认版本消息。(正如我所提到的,该协议是宽容的 - 即使我跳过了那个行列,一切正常。)生成版本消息并不是完全无关紧要的,因为它有一堆字段,但它可以用几行Python创建。下面的makeMessage根据幻数,命令名和有效负载构建一个任意的对等消息。getVersionMessage通过将各个字段打包在一起来为版本消息创建有效负载。magic = 0xd9b4bef9def makeMessage(magic, command, payload): checksum = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[0:4] return struct.pack(‘L12sL4s’, magic, command, len(payload), checksum) + payloaddef getVersionMsg(): version = 60002 services = 1 timestamp = int(time.time()) addr_me = utils.netaddr(socket.inet_aton(“127.0.0.1”), 8333) addr_you = utils.netaddr(socket.inet_aton(“127.0.0.1”), 8333) nonce = random.getrandbits(64) sub_version_num = utils.varstr(’’) start_height = 0 payload = struct.pack(’<LQQ26s26sQsL’, version, services, timestamp, addr_me, addr_you, nonce, sub_version_num, start_height) return makeMessage(magic, ‘version’, payload)发送交易:tx我使用下面的精简Python脚本将交易发送到对等网络。该脚本发送版本消息,接收(并忽略)对等方的版本和维拉消息,然后将该交易作为tx消息发送。十六进制字符串是我之前创建的交易。def getTxMsg(payload): return makeMessage(magic, ’tx’, payload)sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.connect((“97.88.151.164”, 8333))sock.send(msgUtils.getVersionMsg())sock.recv(1000) # receive versionsock.recv(1000) # receive veracksock.send(msgUtils.getTxMsg(“0100000001484d40d45b9ea0d652fca8258ab7caa42541eb52975857f96fb50cd732c8b481000000008a47304402202cb265bf10707bf49346c3515dd3d16fc454618c58ec0a0ff448a676c54ff71302206c6624d762a1fcef4618284ead8f08678ac05b13c84235f1654e6ad168233e8201410414e301b2328f17442c0b8310d787bf3d8a404cfbd0704f135b6ad4b2d3ee751310f981926e53a6e8c39bd7d3fefd576c543cce493cbac06388f2651d1aacbfcdffffffff0162640100000000001976a914c8e90996c7c6080ee06284600c684ed904d14c5c88ac00000000”.decode(‘hex’)))以下屏幕截图显示了如何在Wireshark网络分析程序中发送我的交易。我编写了Python脚本来处理比特币网络流量,但为了简单起见,我将在这里使用Wireshark。“tx”消息类型在ASCII转储中可见,在我的交易开始的下一行(01 00 …)后面。为了监视我的交易的进度,我有一个套接字打开给另一个随机对等体。发送我的交易五秒后,另一个对等体发送了一条tx消息,其中包含我刚刚发送的交易的哈希值。因此,我的交易只需几秒钟即可在对等网络或至少部分网络中传递。胜利:我的交易被开采了在将我的交易发送到对等网络后,我需要等待它才能获得胜利。十分钟后,我的脚本收到一条带有新块的inv消息(参见下面的Wireshark描述)。检查此块显示它包含我的交易,证明我的交易有效。我还可以通过查看我的比特币钱包和在线查询来验证此交易是否成功。因此,经过大量的努力,我成功地手动创建了一个交易并让它被系统接受。(不用说,我的前几次交易尝试都没有成功,我的错误交易消失在网络中,永远不会被再次看到。)我的交易是由大型GHash.IO矿池开采的,块为#279068,哈希为0000000000000001a27b1d6eb8c405410398ece796e742da3b3e35363c2219ee。(哈希在上面的inv消息中反转:ee19…)请注意,哈希以大量零开始——在quintillion值中找到这样的字面意思是使挖掘变得如此困难的原因。这个特殊的块包含462个交易,其中我的交易只有一个。为了开采这个区块,矿工们获得了25比特币的奖励,总费用为0.104比特币,分别约为19,000美元和80美元。我支付了0.0001比特币的费用,约占我交易的8美分或10%。挖掘过程非常有趣,但我将把它留给以后的文章。结论使用原始的比特币协议比我预期的要困难,但我一路上学到了很多关于比特币的知识,我希望你也做到了。我的代码纯粹是为了演示——如果你真的想通过Python使用比特币,请使用真正的库而不是我的代码。======================================================================分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。汇智网原创翻译,转载请标明出处。这里是原文如何使用原始比特币协议 ...

January 2, 2019 · 2 min · jiezi

年终盘点:区块链2018五大趋势

2018年注定是不平凡的一年。这一年,许多名人离开了我们。他们中有当代最伟大的物理学家——史蒂芬霍金、有央视名嘴——李咏、有武侠小说巨匠——金庸先生,还有离“诺贝尔奖”最近的美国华裔物理学家——张首晟教授。这一年,也是区块链跌宕起伏的一年。整个行业经历了狂热的高潮,也经历了低谷的寒冬,最终回归到理性。回顾这一年,ETM君认为,2018年区块链有这样几个值得关注的趋势:监管:有了“尺子”为打压各种炒币行为,遏制非法集资,监管层的制度高压层层叠加,为预防行业风险作出了努力,也为行业发展提供了一把尺子。5月28日,在中国科学院第十九次院士大会中国工程院第十四次院士大会上,习近平总书记指出:“以人工智能、量子信息、移动通信、物联网、区块链为代表的新一代信息技术加速突破应用……世界正在进入以信息产业为主导的经济发展时期。”这是“区块链”第一次出现在国家最高领导人的讲话中,肯定了区块链技术是新一代信息技术的发展方向,是科技强国战略的重要组成。为促进技术良性发展,加强行业规范,8月24日,银保监会、中央网信办、公安部、人民银行、市场监管总局联合发布关于防范以“虚拟货币”“区块链”名义进行非法集资的风险提示。区块链监管力度极大加强,各种炒币行为、非法集资行为受到了打击与遏制。同时,这把监管的“尺子”也延伸到了区块链自媒体。8月21日晚间,包括“火币资讯”、“币世界快讯”、“深链财经”等在内的多家区块链自媒体公众号被封。此后,多家曾“参会频率”名列前茅的区块链自媒体销声匿迹。币圈:迎来了“退群潮”春节期间,区块链3点钟无眠微信群让区块链这个风口为世人瞩目,与此相伴,各种乱相纷纷登场:项目方圈钱跑路的新闻不断,“山寨币”、“空气币”割韭菜的玩法大行其道,维权事件层出不穷,“圈内明星”的撕逼事件持续升级……加之监管缩紧,曾经踩着过山车越过最高点狂欢的币圈,终于快速滑落,步入寒冬。短短一年,以比特币、以太坊为代表的虚拟货币市值大面积缩水,比特币从2万美元的高位一路下跌,近日更是跌破4000美元,新上交易所项目破发率达98.8%。各交易所转向低调,却仍不断陷黑幕丑闻。资本市场迎来真真假假的退群潮、不少曾经的带头大哥以“删微博”、高调退圈等方式宣布与币圈决裂,比惨一时成为时髦。挖矿行业陷入困境,“矿机按斤甩卖”上热搜,全球最大矿机公司比特大陆从一代霸主进入风雨飘摇中,裁员比例或达50% 。从Fcoin的“交易即挖矿”到ETM的“双挖”机制,各种新的挖矿模式进入探索期。随着STO与科创板的推出,更有乐观者高呼瑞雪兆丰年。政策:积极打造“区块链之城”在币圈看跌的2018,区块链技术仍被看好。近期,国家层面针对区块链的利好政策频出,有分析认为区块链已经进入黄金发展期。雄安最早呈现出打造区块链之城的雄心。从建设之初开始,区块链就融入了雄安这座城的基因。千年秀林工程、城市截洪渠工程、黄河污水库治理工程等都采用了基于区块链技术的项目集成管理平台,与工程相关的千家企业全部上链。2月,区块链租房应用平台在雄安上线,成为国内首例把区块链技术运用到租房领域的应用。10月8日,海南省工信厅正式授牌海南生态软件园设立“海南自贸区(港)区块链试验区”,是目前首个国内正式授牌的区块链“试验区”。 除此之外,上海,杭州,深圳,贵阳,青岛、重庆、成都,乃至北京,也都纷纷加入了“区块链之城”的争夺,试图将其作为城市的经济增长点与展示形象的名片。链圈:与诺奖圈更“亲密”5月,2011年诺贝尔经济奖得主、美国经济学家托马斯·萨金特(THOMAS J. SARGENT ),1979年诺贝尔物理学奖得主谢尔登·格拉肖(Sheldon Lee Glashaw)教授加入以学者为主体构成的区块链项目En-Tan-Mo,En-Tan-Mo因此成为最早拥有两位诺贝尔奖参与的重量级区块链项目。随后,8月,2016年诺贝尔奖得主、哈佛大学教授奥利弗•哈特(Oliver Hart)加入区块链经济学、治理与设计公司Prysm Group;9月,两名诺贝尔经济学奖得主——埃里克·s·马斯金(Eric S. Maskin)和克里斯托弗·皮萨里迪斯爵士(Sir Christopher Pissarides)成为Cryptic Labs的经济顾问委员会顾问。10月,2012年诺贝尔经济学奖得主阿尔文•罗斯(Alvin Roth)加入Covee Network。诺贝尔奖得主们纷纷加入区块链初创公司,使2018成为当之无愧的区块链技术与诺奖圈结合元年。应用:不断涌现“区块链+”从未有哪项试验性的技术能像区块链一样,在面世之初就获得这般疯狂的资金追捧和广泛关注。区块链的美好特性,让人们对它的应用可能充满了幻想。可当我们回头审视这承载着所有美好幻想的区块链技术时,会发现,人类需要的是一艘能承载全部价值梦想的巨舰,而我们眼前的却还只是一叶扁舟。值得欣慰的是,2018年,区块链的场景应用终于进入落地阶段。经过这一年时间的沉淀,区块链的场景应用,尤其是在金融领域的应用遍地开花。这些应用主要包括供应链金融、票据、保险、跨境支付等。如中国工商银行接连公布三项区块链专利,从不同角度切入了区块链+银行业解决方案的探索。在打假领域,诞生了众多服务于食品、药品、奢侈品、化妆品、版权出版和IP衍生品等领域的溯源链。区块链+医疗、区块链+娱乐、区块链+旅游……等“区块链+”探索不断涌现。阿里、腾讯、百度、京东等巨头纷纷在区块链布局,昭示出区块链应用的更多落地可能。回首2018,关于区块链,我们有了更多理性。我们不再疯狂追逐比特币涨到10万美元的暴富,而是更多地关注区块链的技术发展与应用落地。我们在谈论区块链是“制造信任的机器”时,开始意识到“人性”的不可控。我们开始重新审视区块链“去中心化”的科技理性与社会理性的冲突,更多代之以“弱中心化”。虽然我们还没有见到这艘能承载全部价值梦想的巨舰,但人类的坚持和探索不会终结。脚踏实地,砥砺前行。步履不停,初心不变。纵有风雪,定有晴天。

December 26, 2018 · 1 min · jiezi

Node.js和NoSQL开发比特币加密货币应用程序(上)

我一直在跟踪比特币之类的加密货币相关主题有几个月了,我对所发生的一切都非常着迷。作为一名Web应用程序开发人员,我一直特别感兴趣的一个主题是加密货币交易以及如何制作它们。从前端看,这些应用程序似乎是用于管理帐户,将比特币转换为美元等法定货币以及将比特币转账给其他人的工具,但它们能做更多吗?我们将看一些Node.js和NoSQL数据库Couchbase的例子,它们涵盖了以加密货币交易为模型的主题。免责声明:我不是加密货币专家,也没有参与金融服务或交易所的任何开发。我是这个主题的狂热爱好者,从本文中获得的任何内容都应该经过适当的测试和使用,风险自负。the take-Away你将从这篇特定文章中获得那些内容,将无法获得那些内容呢?让我们从你不会从本文中得到的东西开始:我们不会配置任何银行或信用卡服务来交易美元等法定货币。我们不会将任何已签名的交易广播到比特币网络,最终确定转账。也就是说,以下是你可以期待在本文中学习的一些内容:我们将创建一个分层确定性(HD,hierarchical deterministic)钱包,它可以为给定的种子生成无限量的密钥,每个密钥代表一个用户钱包。我们将根据主种子创建每个包含钱包的用户帐户。我们将创建代表交易所存款,取款和资金转账的交易,而不实际使用法定货币。我们将从比特币网络中查找余额。我们将创建在比特币网络上广播的签名交易。我们将在本文中看到许多可以更好地完成的事情。如果你发现了可以改进的内容,请务必在评论中分享。就像我说的那样,我不是这个主题的专家,只是一个粉丝。项目要求为了成功完成这个项目,必须满足一些要求:你必须安装并配置Node.js 6+。你必须安装Couchbase 5.1+并配置Bucket和RBAC配置文件。重点是我将不会介绍如何启动和运行Couchbase。这不是一个困难的过程,但是你需要一个Bucket设置一个应用程序帐户和一个用N1QL查询索引。创建具有依赖关系的Node.js应用程序在开始添加任何逻辑之前,我们将创建一个新的Node.js应用程序并下载依赖项。在计算机上的某个位置创建项目目录,并从该目录中的CLI执行以下命令:npm init -ynpm install couchbase –savenpm install express –savenpm install body-parser –savenpm install joi –savenpm install request request-promise –savenpm install uuid –savenpm install bitcore-lib –savenpm install bitcore-mnemonic –save我知道我可以在一行中完成所有的依赖安装,但我想让它们清楚地阅读。那么我们在上面的命令中做了什么?首先,我们通过创建package.json文件来初始化一个新的Node.js项目。然后我们下载我们的依赖项并通过–save标志将它们添加到package.json文件中。对于此示例,我们将使用Express Framework。express,body-parser和joi包都与接受和验证请求数据相关。因为我们将与公共比特币节点进行通信,所以我们将使用request和request-promise包。非常受欢迎的bitcore-lib软件包将允许我们创建钱包并签署交易,而bitcore-mnemonic软件包将允许我们生成可用于我们的HD钱包密钥的种子。最后,couchbase和uuid将用于处理我们的数据库。现在我们可能想要更好地构建我们的项目。在项目目录中添加以下目录和文件(如果它们尚不存在):package.jsonconfig.jsonapp.jsroutes account.js transaction.js utility.jsclasses helper.js我们所有的API端点都将分为几类,并放在每个适当的路由文件中。我们不必这样做,但为了使我们的项目更干净一点。我们去删除大量的比特币和数据库逻辑,我们将把所有非数据验证的内容添加到我们的classes/helper.js文件中。config.json文件将包含我们所有的数据库信息以及我们的助记符种子。在一个现实的场景中,这个文件应该被视为黄金般重要,并获得尽可能多的保护。app.js文件将具有我们所有的配置和引导逻辑,用于连接我们的路由,连接到数据库等。为方便起见,我们将为项目添加一个依赖项并进行设置:npm install nodemon –save-devnodemon包将允许我们每次更改文件时热重新加载项目。这不是一个必须的要求,但可以为我们节省一些时间。打开package.json文件并添加以下脚本以实现它:…“scripts”: { “test”: “echo "Error: no test specified" && exit 1”, “start”: “./node_modules/nodemon/bin/nodemon.js app.js”},…我们可以在此时开始我们的应用程序的开发过程。开发数据库和比特币逻辑在开发我们的应用程序时,在我们开始担心API端点之前,我们想要创建我们的数据库和比特币相关的逻辑。我们将把时间花在项目的classes/helper.js文件中。打开它并包含以下内容:const Couchbase = require(“couchbase”);const Request = require(“request-promise”);const UUID = require(“uuid”);const Bitcore = require(“bitcore-lib”);class Helper { constructor(host, bucket, username, password, seed) { this.cluster = new Couchbase.Cluster(“couchbase://” + host); this.cluster.authenticate(username, password); this.bucket = this.cluster.openBucket(bucket); this.master = seed; } createKeyPair(account) { } getWalletBalance(addresses) { } getAddressBalance(address) { } getAddressUtxo(address) { } insert(data, id = UUID.v4()) { } createAccount(data) { } addAddress(account) { } getAccountBalance(account) { } getMasterAddresses() { } getMasterKeyPairs() { } getMasterAddressWithMinimum(addresses, amount) { } getMasterChangeAddress() { } getAddresses(account) { } getPrivateKeyFromAddress(account, address) { } createTransactionFromAccount(account, source, destination, amount) { } createTransactionFromMaster(account, destination, amount) { }}module.exports = Helper;我们将把这个类作为我们应用程序的singleton来发送。在constructor方法中,我们建立与数据库集群的连接,打开Bucket并进行身份验证。打开的Bucket将在整个helper类中使用。让我们在完成数据库逻辑之前跳出比特币逻辑。如果你不熟悉HD钱包,它们本质上是一个由单个种子衍生而来的钱包。使用种子,你可以得到children,那些children可以再有children,等等。createKeyPair(account) { var account = this.master.deriveChild(account); var key = account.deriveChild(Math.random() * 10000 + 1); return { “secret”: key.privateKey.toWIF().toString(), “address”: key.privateKey.toAddress().toString() }}createKeyPair函数中的master变量表示顶级种子密钥。每个用户帐户都是该密钥的直接子项,因此我们根据account值派生子项。account值是人员编号,创建的每个帐户都将获得增量编号。但是,我们不会生成帐户密钥并将其称为一天。相反,每个帐户密钥将有10,000个可能的私钥和公钥,以防他们不想多次使用同一个密钥。一旦我们随机生成了一个密钥,我们就会返回它。同样,我们有一个getMasterChangeAddress函数,如下所示:getMasterChangeAddress() { var account = this.master.deriveChild(0); var key = account.deriveChild(Math.random() * 10 + 1); return { “secret”: key.privateKey.toWIF().toString(), “address”: key.privateKey.toAddress().toString() }}当我们开始创建帐户时,它们将从一开始,为交易或Web应用程序留下零,或者你想要调用它。我们还为此帐户分配了10个可能的地址。这些地址将做两件事。第一个是他们将比特币发送到其他账户,第二个是他们将收到剩余款项,也就是所谓的变更。请记住,在比特币交易中,必须花费所有未花费的交易输出(UTXO),即使它小于期望的金额。这意味着所需的金额将被发送到目的地,剩余部分将被发送回这10个地址中的一个。还有其他方法或更好的方法吗?当然,但这个将适用于这个例子。为了获得我们使用或使用HD种子生成的任何地址的余额,我们可以使用公共比特币资源管理器:getAddressBalance(address) { return Request(“https://insight.bitpay.com/api/addr/" + address);}上面的函数将采用一个地址并以十进制格式和satoshis获得余额。展望未来,satoshi价值是我们唯一的相关价值。如果我们有给定帐户的X个地址,我们可以使用如下函数获得总余额:getWalletBalance(addresses) { var promises = []; for(var i = 0; i < addresses.length; i++) { promises.push(Request(“https://insight.bitpay.com/api/addr/" + addresses[i])); } return Promise.all(promises).then(result => { var balance = result.reduce((a, b) => a + JSON.parse(b).balanceSat, 0); return new Promise((resolve, reject) => { resolve({ “balance”: balance }); }); });}在上面的getWalletBalance函数中,我们正在为每个地址发出请求,当它们全部完成时,我们可以添加余额并返回它们。能够传输加密货币需要的不仅仅是地址余额。相反,我们需要知道给定地址的未花费的交易输出(UTXO)。这可以使用BitPay中的相同API找到:getAddressUtxo(address) { return Request(“https://insight.bitpay.com/api/addr/" + address + “/utxo”).then(utxo => { return new Promise((resolve, reject) => { if(JSON.parse(utxo).length == 0) { reject({ “message”: “There are no unspent transactions available.” }); } resolve(JSON.parse(utxo)); }); });}如果没有未使用的交易输出,则意味着我们无法传输任何内容,而是应该抛出错误。足够的发送代表的是一个不同的意思。例如,我们可以这样做:getMasterAddressWithMinimum(addresses, amount) { var promises = []; for(var i = 0; i < addresses.length; i++) { promises.push(Request(“https://insight.bitpay.com/api/addr/" + addresses[i])); } return Promise.all(promises).then(result => { for(var i = 0; i < result.length; i++) { if(result[i].balanceSat >= amount) { return resolve({ “address”: result[i].addrStr }); } } reject({ “message”: “Not enough funds in exchange” }); });}在上面的函数中,我们将获取一个地址列表并检查哪个地址的数量大于我们提供的阈值。如果他们都没有足够的余额,我们应该发送这个消息。最终的实用程序相关功能,我们已经看到了一些:getMasterKeyPairs() { var keypairs = []; var key; var account = this.master.deriveChild(0); for(var i = 1; i <= 10; i++) { key = account.deriveChild(i); keypairs.push({ “secret”: key.privateKey.toWIF().toString(), “address”: key.privateKey.toAddress().toString() }); } return keypairs;}上面的函数将为我们提供所有主密钥,这对于签名和检查值非常有用。重申一下,我使用有限值来生成多少个键。你可能会也可能不想这样做,这取决于你。现在让我们深入研究一些用于存储应用程序数据的NoSQL逻辑。截至目前,我们的数据库中没有数据。第一个逻辑步骤可能是创建一些数据。虽然独立并不是特别困难,但我们可以创建这样的函数:insert(data, id = UUID.v4()) { return new Promise((resolve, reject) => { this.bucket.insert(id, data, (error, result) => { if(error) { reject({ “code”: error.code, “message”: error.message }); } data.id = id; resolve(data); }); });}基本上,我们接受一个对象和一个id用作文档密钥。如果未提供文档密钥,我们将自动生成它。完成所有操作后,我们将返回创建的内容,包括响应中的id。所以我们假设我们要创建一个用户帐户。我们可以做到以下几点:createAccount(data) { return new Promise((resolve, reject) => { this.bucket.counter(“accounts::total”, 1, { “initial”: 1 }, (error, result) => { if(error) { reject({ “code”: error.code, “message”: error.message }); } data.account = result.value; this.insert(data).then(result => { resolve(result); }, error => { reject(error); }); }); });}请记住,帐户由此示例的自动递增数值驱动。我们可以使用Couchbase中的counter创建递增值。如果计数器不存在,我们将其初始化为1并在每次下一次调用时递增。请记住,0是为应用程序密钥保留的。在我们得到计数器值之后,我们将它添加到传递的对象并调用我们的insert函数,在这种情况下为我们生成一个唯一的id。我们还没有看到它,因为我们没有任何端点,但我们假设在创建帐户时,它没有地址信息,只有帐户标识符。我们可能想为用户添加地址:addAddress(account) { return new Promise((resolve, reject) => { this.bucket.get(account, (error, result) => { if(error) { reject({ “code”: error.code, “message”: error.message }); } var keypair = this.createKeyPair(result.value.account); this.bucket.mutateIn(account).arrayAppend(“addresses”, keypair, true).execute((error, result) => { if(error) { reject({ “code”: error.code, “message”: error.message }); } resolve({ “address”: keypair.address }); }); }); });}添加地址时,我们首先按文档ID获取用户。检索文档后,我们获取数字帐户值并创建10,000个选项的新密钥对。使用子文档操作,我们可以将密钥对添加到用户文档,而无需下载文档或对其进行操作。关于我们刚刚做了什么非常严肃的事情。我将未加密的私钥和公共地址存储在用户文档中。这对生产来说是一个很大的禁忌。还记得你读过的所有关于人们钥匙被盗的地方的故事吗?实际上,我们希望在插入数据之前加密数据。我们可以通过使用Node.js加密库来实现,或者如果我们使用Couchbase Server 5.5,Couchbase的Node.js SDK会提供加密。我们不会在这里探讨它。好的,我们现在已经在数据库中获得了帐户数据和地址。让我们查询该数据:getAddresses(account) { var statement, params; if(account) { statement = “SELECT VALUE addresses.address FROM " + this.bucket._name + " AS account USE KEYS $id UNNEST account.addresses as addresses”; params = { “id”: account }; } else { statement = “SELECT VALUE addresses.address FROM " + this.bucket._name + " AS account UNNEST account.addresses as addresses WHERE account.type = ‘account’”; } var query = Couchbase.N1qlQuery.fromString(statement); return new Promise((resolve, reject) => { this.bucket.query(query, params, (error, result) => { if(error) { reject({ “code”: error.code, “message”: error.message }); } resolve(result); }); });}上面的getAddresses函数可以做两件事之一。如果提供了帐户,我们将使用N1QL查询来获取该特定帐户的所有地址。如果未提供帐户,我们将获取数据库中每个帐户的所有地址。在这两种情况下,我们只获取公共地址,没有任何敏感信息。使用参数化的N1QL查询,我们可以将数据库结果返回给客户端。我们的查询中需要注意的事项。我们将地址存储在用户文档中的数组中。使用UNNEST运算符,我们可以展平这些地址并使响应更具吸引力。现在假设我们有一个地址,我们想获得相应的私钥。 我们可能会做以下事情:getPrivateKeyFromAddress(account, address) { var statement = “SELECT VALUE keypairs.secret FROM " + this.bucket._name + " AS account USE KEYS $account UNNEST account.addresses AS keypairs WHERE keypairs.address = $address”; var query = Couchbase.N1qlQuery.fromString(statement); return new Promise((resolve, reject) => { this.bucket.query(query, { “account”: account, “address”: address }, (error, result) => { if(error) { reject({ “code”: error.code, “message”: error.message }); } resolve({ “secret”: result[0] }); }); });}给定一个特定的帐户,我们创建一个类似于我们之前看到的查询。这次,在我们UNNEST,我们执行WHERE条件,仅为匹配地址提供结果。如果我们想要我们可以做一个数组操作。使用Couchbase和N1QL,有很多方法可以解决问题。======================================================================分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。汇智网原创翻译,转载请标明出处。这里是原文Node.js和NoSQL开发比特币加密货币应用程序 ...

December 24, 2018 · 3 min · jiezi

Node.js和NoSQL开发比特币加密货币应用程序(下)

在使用Node.js和NoSQL开发比特币加密货币应用程序(上)中,我们创建了HD钱包,它可以为给定的种子生成无限量的密钥,每个密钥代表一个用户钱包。我们将根据主种子创建每个包含钱包的用户帐户。下面我们接着来看如何进行交易、查询余额等重要功能如何实现。我们要在这里改变一下。到目前为止,我们已经在NoSQL数据库中完成了面向帐户的操作。另一个重要方面是交易。例如,也许用户X为BTC存入一些美元货币,而用户Y进行提款。我们需要存储和查询该交易信息。API端点函数将保存交易数据,但我们仍然可以查询它。getAccountBalance(account) { var statement = “SELECT SUM(tx.satoshis) AS balance FROM " + this.bucket._name + " AS tx WHERE tx.type = ’transaction’ AND tx.account = $account”; var query = Couchbase.N1qlQuery.fromString(statement); return new Promise((resolve, reject) => { this.bucket.query(query, { “account”: account }, (error, result) => { if(error) { reject({ “code”: error.code, “message”: error.message }); } resolve({ “balance”: result[0].balance }); }); });}给定一个帐户,我们希望获得特定用户的帐户余额。等一下,让我们退后一步,因为我们不是已经创建了一些帐户余额功能吗?从技术上讲,我们做了,但这些功能用于检查钱包余额,而不是帐户余额。这是我的一些经验变成灰色区域的地方。每次发送比特币时,都会收取费用,有时费用相当昂贵。当你存款时,将钱转入你的钱包并不符合成本效益,因为这将收取矿工费。然后你将被收取撤回甚至转账的费用。那时你已经失去了大部分的比特币。相反,我认为交易所有一个类似于证券交易所货币市场账户的持有账户。你的帐户中应该有资金的记录,但从技术上讲,它不在钱包中。如果你想要转账,则需要从应用程序地址而不是你的用户地址进行转账。当你退出时,它只是被减去。再说一次,我不知道这是否真的如何运作,但这就是我为了避免各处收费而采取的方式。回到我们的getAccountBalance函数。我们正在处理每笔交易的总和。存款具有正值,而转账和取款具有负值。将这些信息汇总在一起可以为你提供准确的数字,不包括你的钱包余额。稍后我们将获得一个钱包余额帐户。鉴于我们对帐户余额知之甚少,我们可以尝试从钱包中创建一个交易:createTransactionFromAccount(account, source, destination, amount) { return new Promise((resolve, reject) => { this.getAddressBalance(source).then(sourceAddress => { if(sourceAddress.balanceSat < amount) { return reject({ “message”: “Not enough funds in account.” }); } this.getPrivateKeyFromAddress(account, source).then(keypair => { this.getAddressUtxo(source).then(utxo => { var transaction = new Bitcore.Transaction(); for(var i = 0; i < utxo.length; i++) { transaction.from(utxo[i]); } transaction.to(destination, amount); this.addAddress(account).then(change => { transaction.change(change.address); transaction.sign(keypair.secret); resolve(transaction); }, error => reject(error)); }, error => reject(error)); }, error => reject(error)); }, error => reject(error)); });}如果提供了源地址,目的地地址和金额,我们可以创建并签署一个交易,以便稍后在比特币网络上广播。首先,我们得到有问题的源地址的余额。我们需要确保它有足够的UTXO来满足发送量预期。请注意,在此示例中,我们正在执行单个地址交易。如果你想变得复杂,可以在单个交易中从多个地址发送。我们不会在这里这样做。如果我们的单个地址有足够的资金,我们会获得它的私钥和UTXO数据。使用UTXO数据,我们可以创建比特币交易,应用目的地地址和更改地址,然后使用我们的私钥对交易进行签名。可以广播响应。同样地,假设我们想从我们的持有账户转账比特币:createTransactionFromMaster(account, destination, amount) { return new Promise((resolve, reject) => { this.getAccountBalance(account).then(accountBalance => { if(accountBalance.balance < amount) { reject({ “message”: “Not enough funds in account.” }); } var mKeyPairs = this.getMasterKeyPairs(); var masterAddresses = mKeyPairs.map(a => a.address); this.getMasterAddressWithMinimum(masterAddresses, amount).then(funds => { this.getAddressUtxo(funds.address).then(utxo => { var transaction = new Bitcore.Transaction(); for(var i = 0; i < utxo.length; i++) { transaction.from(utxo[i]); } transaction.to(destination, amount); var change = helper.getMasterChangeAddress(); transaction.change(change.address); for(var j = 0; j < mKeyPairs.length; j ++) { if(mKeyPairs[j].address == funds.address) { transaction.sign(mKeyPairs[j].secret); } } var tx = { account: account, satoshis: (amount * -1), timestamp: (new Date()).getTime(), status: “transfer”, type: “transaction” }; this.insert(tx).then(result => { resolve(transaction); }, error => reject(error)); }, error => reject(error)); }, error => reject(error)); }, error => reject(error)); });}我们假设我们的交换地址装满了疯狂的比特币以满足需求。第一步是确保我们的持有账户中有资金。我们可以执行总结每个交易的查询以获得有效数字。如果我们有足够的,我们可以获得所有10个主密钥对和地址。我们需要检查哪个地址有足够的资金发送。请记住,这里的单一地址交易可能会有更多。如果地址有足够的资金,我们会获得UTXO数据并开始进行交易。这次代替我们的钱包作为源地址,我们使用交换的钱包。在我们获得签名交易之后,我们想在数据库中创建一个交易来减去我们正在传输的值。在我们进入API端点之前,我想重新尝试一些事情:我假设热门的交易所有一个持有账户,以避免对钱包地址征收费用。我们在此示例中使用单地址交易,而不是聚合我们拥有的内容。我应该是在加密帐户文档中的关键数据。我没有广播任何交易,只创建它们。现在让我们关注我们的API端点,这是一个简单的部分。使用Express Framework设计RESTful API端点请记住,正如我们在开始时配置的那样,我们的端点将分为三个文件,这些文件充当分组。我们将从最小和最简单的端点组开始,这些端点比其他任何端点都更实用。打开项目的routes/utility.js文件并包含以下内容:const Bitcore = require(“bitcore-lib”);const Mnemonic = require(“bitcore-mnemonic”);module.exports = (app) => { app.get("/mnemonic", (request, response) => { response.send({ “mnemonic”: (new Mnemonic(Mnemonic.Words.ENGLISH)).toString() }); }); app.get("/balance/value", (request, response) => { Request(“https://api.coinmarketcap.com/v1/ticker/bitcoin/").then(market => { response.send({ “value”: “$” + (JSON.parse(market)[0].price_usd * request.query.balance).toFixed(2) }); }, error => { response.status(500).send(error); }); });}这里我们有两个端点,一个用于生成助记符种子,另一个用于获取比特币余额的法定值。这两者都不是真正必要的,但是在第一次启动时,生成种子值以便稍后保存在我们的配置文件中可能会很好。现在打开项目的routes/account.js文件,以便我们处理帐户信息:const Request = require(“request-promise”);const Joi = require(“joi”);const helper = require(”../app").helper;module.exports = (app) => { app.post("/account", (request, response) => { }); app.put("/account/address/:id", (request, response) => { }); app.get("/account/addresses/:id", (request, response) => { }); app.get("/addresses", (request, response) => { }); app.get("/account/balance/:id", (request, response) => { }); app.get("/address/balance/:id", (request, response) => { });}请注意,我们正在从尚未启动的app.js文件中提取helper程序类。现在就跟它一起使用它以后会有意义,虽然它没什么特别的。在创建帐户时,我们有以下内容:app.post("/account", (request, response) => { var model = Joi.object().keys({ firstname: Joi.string().required(), lastname: Joi.string().required(), type: Joi.string().forbidden().default(“account”) }); Joi.validate(request.body, model, { stripUnknown: true }, (error, value) => { if(error) { return response.status(500).send(error); } helper.createAccount(value).then(result => { response.send(value); }, error => { response.status(500).send(error); }); });});使用Joi我们可以验证请求正文并在错误时抛出错误。假设请求正文是正确的,我们可以调用createAccount函数在数据库中保存一个新帐户。创建帐户后,我们可以添加一些地址:app.put("/account/address/:id", (request, response) => { helper.addAddress(request.params.id).then(result => { response.send(result); }, error => { return response.status(500).send(error); });});使用发送的帐户ID,我们可以调用我们的addAddress函数来对我们的文档使用子文档操作。还不错吧?要获取特定帐户的所有地址,我们可能会有以下内容:app.get("/account/addresses/:id", (request, response) => { helper.getAddresses(request.params.id).then(result => { response.send(result); }, error => { response.status(500).send(error); });});或者,如果我们不提供id,我们可以使用以下端点函数从所有帐户获取所有地址:app.get("/addresses", (request, response) => { helper.getAddresses().then(result => { response.send(result); }, error => { response.status(500).send(error); });});现在可能是最棘手的端点功能。假设我们希望获得帐户余额,其中包括持有帐户以及每个钱包地址。我们可以做到以下几点:app.get("/account/balance/:id", (request, response) => { helper.getAddresses(request.params.id).then(addresses => helper.getWalletBalance(addresses)).then(balance => { helper.getAccountBalance(request.params.id).then(result => { response.send({ “balance”: balance.balance + result.balance }); }, error => { response.status(500).send({ “code”: error.code, “message”: error.message }); }); }, error => { response.status(500).send({ “code”: error.code, “message”: error.message }); });});以上将调用我们的两个函数来获得余额,并将结果加在一起以获得一个巨大的余额。帐户端点不是特别有趣。创建交易更令人兴奋。打开项目的routes/transaction.js文件并包含以下内容:const Request = require(“request-promise”);const Joi = require(“joi”);const Bitcore = require(“bitcore-lib”);const helper = require("../app").helper;module.exports = (app) => { app.post("/withdraw", (request, response) => { }); app.post("/deposit", (request, response) => { }); app.post("/transfer", (request, response) => { });}我们有三种不同类型的交易。我们可以为比特币存入法定货币,为法定货币提取比特币,并将比特币转账到新的钱包地址。我们来看看存款端点:app.post("/deposit", (request, response) => { var model = Joi.object().keys({ usd: Joi.number().required(), id: Joi.string().required() }); Joi.validate(request.body, model, { stripUnknown: true }, (error, value) => { if(error) { return response.status(500).send(error); } Request(“https://api.coinmarketcap.com/v1/ticker/bitcoin/").then(market => { var btc = value.usd / JSON.parse(market)[0].price_usd; var transaction = { account: value.id, usd: value.usd, satoshis: Bitcore.Unit.fromBTC(btc).toSatoshis(), timestamp: (new Date()).getTime(), status: “deposit”, type: “transaction” }; helper.insert(transaction).then(result => { response.send(result); }, error => { response.status(500).send(error); }); }, error => { response.status(500).send(error); }); });});在我们验证输入后,我们使用CoinMarketCap检查美元比特币的当前值。使用响应中的数据,我们可以根据存入的美元金额计算出应该获得多少比特币。创建数据库交易后,我们可以保存它,因为它是一个正数,它将在查询时返回正余额。现在让我们说我们想从比特币中提取资金:app.post("/withdraw”, (request, response) => { var model = Joi.object().keys({ satoshis: Joi.number().required(), id: Joi.string().required() }); Joi.validate(request.body, model, { stripUnknown: true }, (error, value) => { if(error) { return response.status(500).send(error); } helper.getAccountBalance(value.id).then(result => { if(result.balance == null || (result.balance - value.satoshis) < 0) { return response.status(500).send({ “message”: “There are not " + value.satoshis + " satoshis available for withdrawal” }); } Request(“https://api.coinmarketcap.com/v1/ticker/bitcoin/").then(market => { var usd = (Bitcore.Unit.fromSatoshis(value.satoshis).toBTC() * JSON.parse(market)[0].price_usd).toFixed(2); var transaction = { account: value.id, satoshis: (value.satoshis * -1), usd: parseFloat(usd), timestamp: (new Date()).getTime(), status: “withdrawal”, type: “transaction” }; helper.insert(transaction).then(result => { response.send(result); }, error => { response.status(500).send(error); }); }, error => { response.status(500).send(error); }); }, error => { return response.status(500).send(error); }); });});类似的事件正在这里发生。在验证请求主体后,我们获得帐户余额并确保我们提取的金额小于或等于我们的余额。如果是,我们可以根据CoinMarketCap的当前价格进行另一次交易。我们将使用负值创建一个交易并将其保存到数据库中。在这两种情况下,我们都依赖于CoinMarketCap,它在过去一直存在负面争议。你可能希望为交易选择不同的资源。最后,我们有转账:app.post("/transfer”, (request, response) => { var model = Joi.object().keys({ amount: Joi.number().required(), sourceaddress: Joi.string().optional(), destinationaddress: Joi.string().required(), id: Joi.string().required() }); Joi.validate(request.body, model, { stripUnknown: true }, (error, value) => { if(error) { return response.status(500).send(error); } if(value.sourceaddress) { helper.createTransactionFromAccount(value.id, value.sourceaddress, value.destinationaddress, value.amount).then(result => { response.send(result); }, error => { response.status(500).send(error); }); } else { helper.createTransactionFromMaster(value.id, value.destinationaddress, value.amount).then(result => { response.send(result); }, error => { response.status(500).send(error); }); } });});如果请求包含源地址,我们将从我们自己的钱包转账,否则我们将从交换管理的钱包转账。所有这些都基于我们之前创建的功能。通过端点,我们可以专注于引导我们的应用程序并得出结论。引导Express Framework应用程序现在我们有两个文件保持不受示例的影响。我们还没有添加配置或驱动逻辑来引导我们的端点。打开项目的config.json文件,并包含以下内容:{ “mnemonic”: “manage inspire agent october potato thought hospital trim shoulder round tired kangaroo”, “host”: “localhost”, “bucket”: “bitbase”, “username”: “bitbase”, “password”: “123456”}记住这个文件非常敏感。考虑将其锁定或甚至使用不同的方法。如果种子被暴露,则可以毫不费力地获得所有用户帐户和交换帐户的每个私钥。现在打开项目的app.js文件并包含以下内容:const Express = require(“express”);const BodyParser = require(“body-parser”);const Bitcore = require(“bitcore-lib”);const Mnemonic = require(“bitcore-mnemonic”);const Config = require("./config");const Helper = require("./classes/helper");var app = Express();app.use(BodyParser.json());app.use(BodyParser.urlencoded({ extended: true }));var mnemonic = new Mnemonic(Config.mnemonic);var master = new Bitcore.HDPrivateKey(mnemonic.toHDPrivateKey());module.exports.helper = new Helper(Config.host, Config.bucket, Config.username, Config.password, master);require("./routes/account.js")(app);require("./routes/transaction.js")(app);require("./routes/utility.js")(app);var server = app.listen(3000, () => { console.log(“Listening at :” + server.address().port + “…”);});我们正在做的是初始化Express,加载配置信息以及链接我们的路由。module.exports.helper变量是我们的单例,将在每个其他JavaScript文件中使用。结论你刚刚了解了如何使用Node.js和Couchbase作为NoSQL数据库来构建自己的加密货币交易。我们涵盖了很多,从生成HD钱包到创建具有复杂数据库逻辑的端点。我不能强调这一点。我是加密货币爱好者,在金融领域没有真正的经验。我分享的东西应该有效,但可以做得更好。不要忘记加密密钥并确保种子安全。测试你的工作,知道自己正在做什么。如果你想下载此项目,请在GitHub上查看。如果你想分享关于该主题的见解,经验等,请在评论中分享。社区可以努力创造伟大的东西!如果你是Golang的粉丝,我在之前的教程中创建了一个类似的项目。======================================================================分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。汇智网原创翻译,转载请标明出处。这里是原文使用Node.js和NoSQL开发比特币加密货币应用程序 ...

December 24, 2018 · 4 min · jiezi

区块链2018年度盘点

加密数字货币价格巅峰,区块链成二线企业股价春药2018 年 1 月 8 日,是区块链行业的高光时刻,整个加密数字货币市值 8139 亿美元,人民币近 6 万亿元。在 10 天之前,12 月 18 日,比特币作为知名度最高的数字币,到达其诞生以来的最高点,各交易所均价逼近 2 万美元。看着比特币的涨势图,距离看好者所说的 10 万美元似乎触手可及,比特币成为区块链和一夜暴富的代名词。各大媒体渠道上,炒币一夜暴富的故事比比皆是,区块链概念被扭曲着想走向普罗大众。1 月 5 日,中概股一家名不见经传的公司中网载线暴涨近 700%,甩开猎豹移动、迅雷、聚美优品等大涨的中概股。直接原因是,当日,中网载线刚刚宣布与井通网络科技有限公司合作开展区块链产业。区块链概念的春药作用在新年前两天就有所应验,人人网宣布涉足区块链、发行虚拟货币 RR Coin,股价暴涨近 80%。区块链数字货币在股票市场是真的还是比较有前景的,在金融领域有比较深的影响。疯狂 ICO 非法融资倒逼监管出手据 ICOdata 统计,2017 年 12 月和 2018 年 1 月,ICO 项目融资总额分别为 16.62 亿美元和 15.22 亿美元,2 个月 ICO 总计融资近 32 亿美元。相比较之下,2004 年创办的搜狗市值也才近 25 亿美元。ICO 泡沫的疯狂程度由此可窥。从 2017 年年末到达的 ICO 高潮在 1 月仍在继续,各个社群中活跃的糖果散发者和代投是火热的拉新者,每个人都在用 Telegram。3 个月前的 ICO 94 禁令早已被财富故事冲击得荡然无存,OTC 场外交易平台中,银行卡、支付宝、微信等最便捷的支付方式,成为新韭菜进入和币圈扩张得最大便利条件。1 月 19 日,监管终于出手,央行结算司下发《关于开展为非法虚拟货币交易提供支付服务自查整改工作的通知》特急文件,要求严禁各支付机构为虚拟货币交易提供服务。虚拟货币交易的入场通道将被勒令关闭,随即,支付宝限制交易收款方,银行开始排查交易账号提示风险。对于非法融资假冒的投资方式大家要提高自己的谨慎啊,投资者一方面要提高辨别能力,多对企业的投资资质揭秘“3点钟无眠区块链群”,曾7天发红包过百万6月3日开始,一个「3点钟&XMX全球社群联盟」的概念横空出世,并声称「21天内拉满2100个社群,105万人的规模。」首日由99个大V带头,在12小时内完成建立99个500人的群。游戏领域营销出生的玉红,对于这种「社群新玩法」,可谓是驾轻就熟。众多大佬当天就纷纷宣布加入这场「伟大的实验」,更有大佬在自己朋友圈公开评价:「不得不佩服玉红的传销能力。」虽然三点钟区块链的营销模式很棒,拉了很多人,但是之后的价格暴跌,使投资者血本无归,也同样受到了相应的嘲讽。同时响马叔评价说,三点钟的XMAX代码就是改的面目全非的EOS代码,也是一场收割韭菜的狂野游戏。BEC被黑一夜归零,美图出局4月22日下午13时左右,才发行两个月左右的BEC美蜜合约出现重大漏洞,黑客通过合约的批量转账方法无限生成代币,天量BEC从两个地址转出,引发抛售潮。当日,BEC的价值几乎归零。3日后,美图发声明宣布终止与BEC美链合作,同时美图重申没有、也不会发行任何数字货币。虽然BEC被盗事件以代币归零告终,但智能合约漏洞导致的安全问题却刚刚开始。黑客们好像从BEC被盗事件中看到了赚钱的契机,都开始盯上了ERC20代币的智能合约,意图通过发祥漏洞大赚一笔。同时,区块链安全公司也开始崭露头角。随着一系列以太坊漏洞被安全公司曝出,以太坊的安全受到前所未有的质疑。数字货币依然有漏洞,对于安全方面应该加强重视。同时,区块链安全公司也开始崭露头角。随着一系列以太坊漏洞被安全公司曝出,以太坊的安全受到前所未有的质疑。交易所模式创新,韭菜项目方双收割3 月初,让整个币圈沸腾的是火币 HADAX 投票上币。交易所上币新模式,号称为打破交易所的天价上币费机制,让上币权回到用户手中。实际上是打着自主上币的幌子,最终演变成项目方刷钱上币,谁出得多,谁上交易所。类比股市,A 股上市费用 3800 万人民币,港股上市费用 3000 万港币,火币上币费用 8000 个 ETH(按照均价 6000 元计算,上币总价 4800 万元),加密数字货币的新模式直白又露骨:谁钱多谁上市。交易所的企图远不止此,投票上币的通用币种是火币的平台币 HT,项目方上币的过程不断为 HT 提高流动量,拉高价格。这一模式被业内诟病圈钱太过露骨,火币紧急调整上币规则,但从后来的上币结果来看,并没有改变什么。所以区块链规则和制度要更加完善,现有的漏洞会让投机取巧者获得不正当的利益,后期应当健全完善这些系统,形成一个良性的环境半中心化的 EOS 生态起步EOS 生态中,BM 跑路和社区建设产生的化学反应,使得 EOS 起步和创始人 BM(真名 Dan Larimer)离职的消息相互交织着,也相互成就着。这也不难理解,时至今日,EOS 上 DAPP 数十个,社区仍有人每天按时发问:「BM 跑路了吗?」3 月 4 日晚间「海外币圈」自媒体发布《EOS 被曝项目创世大神即将离职,项目开发将如何进行?》,放任该消息发酵一晚,次日早间,BM 在 Telegram 群内否认离开一说。和 BM 跑路一样备受关注的是 EOS 超级节点投票。赢得主节点将获得 EOS 每年增发 5% 收益中的大部分,每年每个节点大约能得到 238 万个 EOS,按照当时价格(EOS/RMB ¥44.2),一个节点每年可以分到 1 亿元的奖励。这吸引庄家级玩家入场竞选。通过公开兜售未来奖励,EOS 成为年度盛会,知名度骤然提高,为之后成为今年最具影响力的公链埋下伏笔。这种半中心化的模式提高了eos的运作效率,比之前的模式有很高的提高,是一种创新。币安交易所遭到攻击,黑客攻击模式改变3 月 7 日晚,币安交易所遭到黑客攻击。与以往简单粗暴的盗币不同,此次攻击,黑客进行了大量的缜密计划,潜伏许久才开始行动,最终以拉高非主流代币价格,提前做空单成功获利。在这个过程中,黑客大量抛售代币,导致绝大部分币种开始下跌,市场中不明真相的散户也开始恐慌性抛售。同时,操纵账号在 1 小时内用 1 万个比特币拉高代币 VIA 价格。在大家以为黑客要把自己手中持有的 VIA 高价卖出,换成 BTC 提现到安全的账号离场时,黑客蓦然退场。交易所还是需要提高自己额安全意识,对于漏洞进行相应的检查,以保护大家的利益FOMO 3D赌博游戏兴起首先,跟大家介绍一下这款游戏是这么玩的,网上已经有很多分析文章了,在这里,我们挑重点的说。 在这款游戏的官网(http://exitscam.me/)上,玩家可以花ETH买入一个或者多个key(钥匙)。越早买key,花的钱越少。目前(截止7月22日10:30)花0.00529188ETH可以买到一把key,而就在7月20日的15点,每1个key的价格还只有0.00124 ETH,不到两天的时间里翻了3倍多,目前仍在不断上涨中。 目前玩家已经在这款游戏里累计投入了82222.075ETH,相当于3747多万美元,奖金池里有20158.44ETH,相当于约934.8万美元 。然而关于这个游戏有一个漏洞被响马大叔提前预料到,Fomo3D被黑客黑了价值几千万的 eth,江湖传言是响马黑了奖金DAPP 开始起步,精良游戏吸引众多玩家熊市出现的第一个月,币圈开始有所转机。2017 年 cryptokitties 加密猫的爆火之后,DAPP 的发展似乎陷入沉寂。此时,投机行为暂时销声匿迹,暗自发力的 DAPP 开始显露实力。以游戏为 DAPP 主场地,制作精良的游戏吸引了更多玩家。EtherGoo 是其中一款。半挂机式的 SLG 策略游戏,和国内曾经流行的三国策略网页游戏有点相似,EtherGoo 将游戏中产生的氪金消费滚入奖池中重新分配给玩家们,受到玩家欢迎,每天流水达 100 万元。且游戏所有交互在以太坊主链运行,避免官方作弊行为。而后,制作较为精良的 Etheremon 也得到更多活跃人数,这款怪兽对战题材游戏「Etheremon」相比其他作品,制作精美了许多,基本已经具备了一款完整网页游戏的雏形。dapp的发展是很有前景的,同时也吸引了广大的开发者,大家也可以多多关注我们的dapp大赛EOS 超级节点选举为 EOS 区块链网络上的 21 个节点(以及 100 个备用节点)正常运行而举办的超级节点选举,成为行业盛会。持有 EOS Token 的用户,根据票数选定相关节点担任超级节点和备用节点。此前的预热中,多个竞选节点,接近 60 个来自中国。EOS 创始人 BM 因为第三代区块链技术成为币圈大佬,如今每天交易额接近 100 亿元,体现着业内对节点选举的热情。EOS 被看作是下一个比特币,但节点选举中,有资金背景的大佬公开拉票演说,甚至贿选,节点被财团把控成为一时难以解决的问题,社区走向也变得迷茫。并且,在过度的渲染中,主网上线被忽略。此前 5 月底,主网启动团队达成共识:只承认一条名为 EOS 的主网,社区同庆。而几天后的 EOS 主网正式上线,却无人问津。过度消费品牌已使得投资者对其失去信心。回过头看,EOS超级节点竞选可算得上一场极其成功的营销计划,通过这场竞选,EOS不仅赚足了眼球,还建立的广大的社区,吸引了一大批开发者,为其后期线上Dapp的发展奠定了坚实的基础。FCoin提出了“交易即挖矿”概念2018年6月,加密货币交易所FCoin提出了“交易即挖矿”概念,并在短时间内日交易量攀升至全球第一,引爆了交易所之间的大战。于是问题来了,“交易即挖矿”究竟是什么,为什么会产生如此大的影响力。“交易即挖矿”实际上就是一种基于平台币的个人交易手续费返还机制,严格的说在FCoin成立之前就已经有类似的玩法,比如Bibox此前就有拿出一定比例手续费收入返还给平台币持有者的机制。FCoin的“交易即挖矿”则进行了重新包装,仿照比特币挖矿的分配规则,拿出51%比例的平台币FT作为挖矿奖池,通过“挖矿(在FCoin上交易)”逐渐解锁FT,一旦51%的FT全部回馈完成,“挖矿”即自动终止。FCoin的横空出世,就如同向韭菜发射了一片二向箔,点燃了熊市的激情。同时返还手续费这一操作,吸引了很多用户,同时推动了交易所交易,是一个很好的模式。李笑来录音门李笑来在录音中主要表达了“自己投资赚钱的理念”以及“如何在链圈赚钱的方法”等概念,而其一句“傻逼们的共识也是共识”燃爆币圈,成为舆论斥责其“割韭菜吃相难看”的焦点。币圈大佬李笑来录音泄露,跌落神坛的同时,这段录音透露的币圈割韭菜内幕让人惊心。在各路文章传播的同时,李笑来泄漏的录音中一些有趣且重要的细节却被忽略。大家对于这件事情大概有这样几个解释:第一个,Ripple 和 NEO,软银和复星没看懂,投完却暴涨;李笑来操盘的Candy.ONE的合作项目 COCOS 被爆联合硬币资本收割韭菜。关于录音里的秘诀:只会投资的区块链基金没有未来,李笑来会为项目方提供除资金之外的资源;表面的和平是赚钱的必要条件,李笑来心里认为币安是傻逼,但还是找币安接盘支点的融资。每个币圈大佬都有别人无法撼动的核心能力,比如 Link VC 创始人林嘉鹏和 OKEx 的田颖关系非同一般。李笑来这么一说伤了广大投资者的心区块链信息技术媒体封杀8 月掀起的区块链信息利箭行动,自媒体被大量封号,腾讯、百度、微博等 社交信息平台联手,全网封杀「All In」「一夜暴富」的故事。更关键的是,国家互金举报平台将代币发行融资纳入举报范围,币圈部分媒体为低底线付出代价,区块链媒体也由此嗅到危险的味道。舆论唱衰时,真正的业内人开始思考区块链到底能干什么,空头模型的效果怎样等关系行业发展的问题。区块链目前的较广为人知的应用体现在三方面:第一,比特币,没能成为货币而变成名义上的电子黄金。第二,Token(通证),一种代表资本市场的运作方式的权益。第三,一种虚拟资产,以加密猫为代表的不可交换 (non-fungible) 资产。泡沫已经破裂,区块链的项目已经趋于理性化的过程当中,我们应该专注于区块链的落地应用,大家多多关注fibos比特币大跌上热搜的社会影响9 月,比特币价格开启震荡模式,至中旬已有三轮明显的震荡。第一次,比特币价格在 2 小时内暴跌 5.4%,此波下跌并未像往常一样短时间恢复,至次日早晨,比特币在一小时内暴跌 7.1% 后进入横盘状态。隔日,再次在凌晨出现短时下跌 3.1% 的情况。作为加密数字货币的主心骨,短时间内的多次下跌使得投资者和从业者的信心受挫,同时巨额资金的流入和流出也加剧持有者的恐慌。甚至,# 比特币暴跌 # 的话题又一次成为社会热门话题,登陆微博热门话题。在众多评论中,普通群众透露出的关键词为「骗局」、「传销」、「传销」,相关利益者则更关心显卡、矿机,记忆背后是否存在操纵价格的问题。不同角度的评论中,透露出加密数字货币货币两级市场认知,其背后,是现行市场的不成熟。广大投资者也要理性,比特币大跌也是一种金融现象,大家也要关注价值投资,理性对待USDT 崩溃与稳定币项目出现10 月 15 日,最早出现的稳定币 USDT 突然暴跌 8%。在此前多次加密数字货币的大幅涨跌中,USDT 死守「稳定」特性,成为币币交易的中介币。此次下跌使得稳定币的二级市场信誉受到打击,托管 USDT(Tether)现金的银行 Noble Bank 半月前被曝面临运营危机,频临倒闭。Bitfinex 被用户质疑失去偿付能力,「现金提取出现问题,用户的数字资产被挪用」等消息不胫而走,引发用户信任危机。此次暴跌正逢稳定币概念流行。9 月初美国先后批准交易所 Gemini 和区块链创业公司 Paxos 发行 GUSD 和 PAX 稳定币,之其他交易所相继入局。与美元、英镑等货币挂钩的稳定币成为一时追捧的对象。稳定币项目大量出现,会是18年底到明年的一个新的热门模式,同时我们的稳定币 FOD 也将上线,希望大家多多关注BTC分叉币BCH再次分叉分叉原因:扩容&内讧 曾经,澳本聪和吴忌寒共同为BCH的诞生立下了汗马功劳。 然而,不到一年,双方共识破裂。其分歧主要围绕在:是否需要继续扩容,是回归比特币路线还是顺应加密市场的发展,当然更重要的还有背后的矿池利益纠纷,通过硬分叉,BCH的运营方将由双方的矿工和算力决定。 双方各自有理,至今僵持不下。 分叉影响几何? 如今,在比特币这个庞大的生态体系里,矿工、交易所、应用程序、用户、投资者早已成为环环相扣、无法分割的一部分。任何一个环节出问题,都将影响到整个生态体系的稳定。 所以,尽管每一次分叉是不同势力之间的博弈,但更多的是对资金和技术的消耗。 当年BTC分叉前后造成的最直接影响就是价格的波动。 据华尔街见闻行情显示,从2017年7月15日到2017年8月15日期间,BTC的价格从1914美元上升到4387美元,涨幅高达129%; 而由BTC分叉出来的BCH,自分叉日开始,价格则连连败退,到8月中旬,价格从1213美元的高点下落至298美元,跌幅高达75%以上。BCH分叉导致价格下跌,合作者应尽量维护好共识,寻求一个更好的解决办法国内外数字货币认知趋势11 月初,央行研究院发布研究报告,近 2 万字的论文围绕着「区块链能做什么、不能做什么」展开。作者从经济学角度研究区块链的功能,从想对宏观的层面对 Token 范式、区块链共识与信任、智能合约、应用方向、治理问题、安全性等热点话题进行分析。央行研究院对区块链应用场景的研究仿佛给市场打了一剂强心剂,但与此同时,国内外对区块链市场的特定信息传播打击力度也在加大。11 月中旬,国内封号潮再次来临,BABI 财经、核财经无法打开,吴解区块链甚至被二度封号。国外 Apple 下架 iTunes 商店的加密数字货币新闻栏目,Twitter 、Medium 的知名分析师被封号。熊市给了市场净化的空隙,拉盘喊单变得越来越不被市场认可,或许回归加密数字货币认知普及,是最保险的求生办法。市场也应该对数字货币加强市场普及以及认知规范,数字货币还是很有前景的文末附上官方地址~~~https://fibos.io/FIBOS 是一个创造和发展区块链应用生态的平台,让你轻松创建属于自己的价值网络,帮助开发者和创业者一步进入区块链世界。https://dev.fo/JavaScript 开发 + BANCOR 协议智能通证 + 开发者服务,FIBOS 平台实现了快速开发、快速部署和稳定且流动的通证体系,帮助开发者一步进入区块链时代。搜索关注公众号「FIBOS社区」,第一时间获取技术干货! ...

December 21, 2018 · 2 min · jiezi

制定通用的标准:评估 PoW 共识协议的安全性

Nervos 研究员张韧博士在 Master Workshop 中发表了题为「Lay Down the Common Metrics:Evaluating Proof-of-Work Consensus Protocols’Security」的主题演讲,该主题演讲本身是关于多个共识协议。基于可行性的考虑,张韧博士选取了 6 个共识协议在此做讲解。以下为我们整理的演讲文字稿,供大家参考学习,可观看演讲视频。在 Nakamoto 共识协议(Nakamoto Consensus 图片中简称 NC)中,为解决分叉问题,矿工们被要求在可能的情况下选择最长的链;在没有最长链时,矿工选择第一个接收到的区块加入到主链中。在发放奖励方面,主链区块会获得全部奖励,而孤块什么也得不到。这样是否足够安全?Nakamoto 共识的原始分析倾向于认为区块链本身具备完美的链质量,即低于全网 50% 算力的攻击者是无法修改区块链的。然而实际上攻击者完全可以有非常高的成功率去修改区块链。有三种攻击方式会修改区块链:自私挖矿(Selfish Mining)、双花(Double Spending)和审查攻击(Censorship Attack)。其中,自私挖矿的攻击者可以获得与其算力不成正比的、不公平的区块奖励。他们可以将挖矿算力集中起来去获得更高的相对区块奖励,从而破坏区块链的去中心化特性;在双花攻击中,攻击者可以逆转已确认的交易,将自己利益最大化;审查攻击情况下,攻击者阻止交易被确认,造成诚实矿工的经济损失。三种攻击 Three Attacks自私挖矿红色方块表示块被传播到网络的时间,然后橙色圆圈表示攻击者的区块,三角形表示被诚实矿工挖出的区块。攻击者很幸运地找到了第一个区块,但没有将其发布到网络上,而是选择了扣留这个区块。当诚实矿工找到一个块时,攻击者会在这时候抢在诚实矿工之前广播之前扣留的区块,则之后所有的矿工都将在攻击者的区块而不是诚实矿工的区块上挖矿。如果攻击者足够幸运,能够连续找到多个区块,那么攻击者就可以毫无风险地孤立一个诚实区块。在这种情况下,攻击者的的链变得更长,并且全网的算力会到它的链上挖矿。通过这种方式,攻击者成功地增加了在整体区块奖励中获得的相对比例。双花攻击双花攻击与自私挖矿攻击非常相似,是通过秘密挖矿来获得额外奖励。如比特币中,按照惯例有 6 个区块确认交易后基本是完全确认了。如果攻击者秘密地扣留了 6 个区块,并一次性将它们广播到网络中,他就能够在收到商品或者服务之后逆转这个交易。审查攻击审查攻击试图孤立所有不符合审查要求的块,即我要广播我要审查的这些交易,如果你不听从我的命令,我会尽力孤立你的块。两种解决方法下面我们来说说解决 Nakamoto 共识安全问题的两种方法。第一大类我们称之为「更佳链质量」协议。如图所示这一大类中有很多协议,这些协议声称它们可以提高链的质量。这次我将重点介绍「最小哈希平局打破协议(Smallest hash tie-breaking protocol ,简称 SHTB)」 和 「不可预测的确定性平局打破协议(Unpredictable deterministic tie-breaking,简称 UDTB)」。第二大类称为「抗攻击」(Attack-resistant protocols)协议。这些协议声称,他们可以在链的质量并不完美的情况下抵御攻击,因此他们不需要提高链的质量。抗攻击协议的三种类型第一种是「全部奖励」(Reward-all)协议。这类协议给大多数最近做了工作量证明的以奖励, 符合要求的块无论如何都会获得奖励,如此攻击者无法进行自私挖矿攻击来迫使诚实矿工的奖励无效,从而攻击者没有动机进行自私挖矿攻击。 第二个被称为「惩罚」(Punishment)协议。这些协议将没收那些可疑的区块的奖励。惩罚规则希望通过损失厌恶, 让所有人不得不遵守协议。 第三个被称为「幸运奖励」(Reward-lucky)协议。这些协议根据区块内容对某些幸运区块进行奖励,希望这些幸运区块作为稳定网络的「锚点」。 接下来让我们更深入地了解这些协议。 首先我们分析 「更佳链质量」这一类协议,首先是「最小哈希平局打破协议」。在这个协议中,每当有平局时,协议都要求所有矿工选择哈希最小的块,不管它首先接收的是谁。 第二个称为「不可预测的确定性平局打破协议」。该协议规定,每当有平局时,每个人都使用不可预知的确定性伪随机函数来计算所有参与竞争链的顺序,而不管首先接收哪一个块。不可预测的确定性协议背后的原理是,由于攻击者无法预测他是否会以超过 50% 的几率赢得整块竞争,进行自私挖矿攻击是不明智的(因此不会选择这么做)。对于抗攻击协议,我会从每种技术方法中选择一种协议来分析。对于「全部奖励」协议我们来分析水果链。在水果链中,对两种不同的产品使用了相同的挖矿程序。如果一个候选区块的哈希值最前面的 k bits 小于某个阈值,那么就判断它是一个块;如果某个候选区块的哈希值最后的 k bits 小于某个阈值,那么就判断它是水果。因此,当你运行哈希算法时,你可能会得到一个区块,也可能是得到一个水果。该协议和 Nakamoto 共识一样,遵循最长链原则,并且根据最先收到的区块打破平局。对于所有抵抗攻击协议,我们使用 Nakamoto 共识作为其分叉解决的规则。因此,当我们分析他们的攻击抗性时,他们被置于同一规则下。水果是嵌入在区块中的。你可以把水果想象成 Nakamoto 共识中的交易,这个交易只是被嵌入到了水果中。每个水果都有一个指针块,这是一个最近的块,水果矿工不会被孤立 。图中香蕉块的指针就是这样一个案例,如果指针块在主链中,则水果是有效的。如果指针块是孤块,就像图上的番茄一样,那么这个水果不再是有效的水果。还有一个额外的规则,即水果出块的间隔需要小于预定义的超时阈值。间隔定义为主区块和指针区块之间的区块高度差。比如,香蕉的间隔就是 2,这是因为主区块比指针区块晚 2 个区块。因此有效水果获得全额奖励,而区块则没有获得任何奖励。对于惩罚协议,我们选择 DECOR 协议修改版本作为案例来讲解。在我们的修改版本中,我们将其称为「奖励分配」(Reward-Splitting ,简称 RS)协议,顾名思义,奖励在所有相同高度的竞争区块之间平分。这个协议允许一个区块引用之前的孤块为叔块,如果其间隔是低于超时阈值的,那么这个叔块就是有效的(也会获得一定的奖励)。这是在奖励分配协议中间隔的定义和水果链类似。不同在于,在此协议中,间隔被定义为主区块和叔块的高度差,而不是主区块和指针区块的高度差。所以我们不考虑区块的亲缘关系,只考虑该区块本身的高度。每个区块奖励在相同高度的竞争区块和叔块之间平均分配。例如,在这个图中,区块 B 和区块 C 分别得到了一半的区块奖励,区块 A 和区块 D 则获得全部的区块奖励。最后一个是子链。子链也是采用相同的挖矿程序,但是是两种不同的产品。子链中的出块规则和比特币相同,如果候选区块的哈希低于某个特定阈值,那判断这个块有效。如果候选区块的哈希值大于块阈值但小于另一个阈值,我们将其视为弱块(Weak Block)。弱块也计入链长度,也执行交易确认的功能。但是,弱块不会收到任何块奖励。只有区块能获得块奖励。衡量协议安全性的共同指标我非常激动,因为下面我们要一起设定一些衡量协议安全性的共同指标。你声称这是最安全的协议,你要向我证明它,就需要从这几个指标的维度来衡量你的协议有多安全。在这个研究中共有四个指标,我们来分析一下。第一个指标我们称之为链质量(Chain Quality),是指主链上诚实矿工的区块的最小百分比。在这个例子中,链质量是六分之三,因为主链中有六个区块,其中三个来自诚实矿工。第二个称之为激励相容度(Incentive Compatibility),用来衡量对自私挖矿攻击的抗性,被定义为诚实矿工区块奖励的最小百分比。在这种情况下,由于六个主链区块中有三个区块来自于诚实矿工,因此激励相容度是 50%。在 Nakamoto 共识中,这两个指标(指链质量和激励相容度)是相等的。但是,对于其他协议,这两个指标并不相同。链质量只是用来评估拜占庭敌手(也就是作恶节点),但激励相容度则把奖励也考虑在内。第三个指标是另一个攻击抗性的指标,称为「作恶收益」(Subversion Gain),衡量抗双花攻击的性能。它被定义为「平均每个出块间隔能够获得的区块奖励加上双花奖励的最大值」。在这种情况下,假设每隔 10 分钟能找到一个块,如果总共有 8 个块,那么总共需要 80 分钟(其中攻击者有 3 个块)。在这个例子里,平均每 10 分钟,攻击者获得 3/8 个区块奖励。双花奖励为 0,因为双花奖励需要连续孤立六个块。因为在抗双花攻击中没有完整的百分比奖励,因此指标设定为「平均每个出块间隔获得区块奖励的最大值」。在这张图上,没有双花攻击奖励,因为你需要连续出孤立至少 6 个区块才能获得双花奖励。最后一个指标称为「审查敏感性」(Censorship Susceptibility),即因为拒绝审查者的要求,导致诚实矿工的奖励损失的最大百分比。因为如果我拒绝审查请求,攻击者将开始孤立我的区块。此指标用来衡量我的区块可以被孤立的百分比。在这个案例中,有 5 个诚实的块,其中 2 个是孤块,所以审查敏感性是 2/5。评估结果现在我们来看看评估结果。在这次分享中我分析了 5 个协议,我们来看看第一个指标链质量。我们先定义一个变量 ,它是在平局情况下,在攻击者的链上挖矿的诚实矿工算力占所有诚实矿工算力的百分比。如果 等于零,那么所有诚实矿工的算力都会用在挖诚实矿工的链上,没有诚实矿工的算力在攻击者的链上挖矿。如果 等于1,则所有诚实矿工的算力将在攻击者链上挖矿,并且没有人会在诚实矿工的链上挖矿。这是是用来评估 Nakamoto 共识的通用参数。这里有五个情况,分别是在 = 0,0.5,1 情况下的 Nakamoto 共识、最小哈希平局打破协议(SHTB)和 不可预测的确定性平局打破协议(UDTB) ,哪一个是链质量最佳的?在这五个协议中,最小哈希平局打破协议(SHTB) 和 不可预测的确定性平局打破协议(UDTB) 仅关注如何打破平局。所以你并不能比 = 0 的平局的情况下的 Nakamoto 共识做的更好。因为当 = 0 的时候,所有的挖矿算力将会在诚实的链上。并且你不能比 = 1 的情况下的 Nakamoto 共识更差了,攻击者在这种情况下可以赢得所有的平局。所以在剩下的三个协议里(SHTB、UDTB、 = 0.5 的 Nakamoto 协议)哪一个是表现最差的?其实是最小哈希平局打破协议。那么对于剩下两个协议(UDTB、 = 0.5 的 Nakamoto 协议)哪一个更好呢?我来揭开这个答案。 = 0.5 的 Nakamoto 共识是更好的。为什么?举例来说,在不可预测的确定性平局打破协议(UDTB)中,当一个攻击者找到了一个区块,但是此时诚实的矿工打包了这个区块并且先于攻击者将它广播了出去,那么有可能这个攻击者会计算伪随机函数并意识到如果他发布了他的区块,是没有人会继续在他的区块之上挖矿的,因为他在出块竞争的平局中失败了。那么这个攻击者能够做什么?在 Nakamoto 共识中,攻击者注定会失败,因为最先收到的区块打破平局的规则,如果你不尽快把区块发布出去,没有人会在你的区块上面挖矿。但是在 UDTB 中则不同,即使下一个区块都被挖出来了,攻击者还是能够在这个区块之上继续挖矿,只要攻击者能够赢得下一个出块权,那么成功之后这个攻击者就能够在诚实矿工的区块之后同时发布两个区块。如果这个伪随机函数表明攻击者赢得了出块竞赛,攻击者就能拿到出块奖励。因为 UDTB 允许一个称为“后发制人“的特殊攻击行为,因此 UDTB 的安全性会比 = 0.5 的 Nakamoto 共识更差。那为什么最小哈希平局打破协议安全性那么差?因为当攻击者找到一个区块并且这个哈希值的确非常小的时候,攻击者会有大约 99% 的可能性,不论其他人的哈希是多少,他都能够赢得这个出块权。不论我先广播哪一个区块,我都能准确的预测出我能够赢得这个平局的可能性。这就允许攻击者在他足够幸运的时候能够发动扣块攻击。当诚实的矿工找到下一个区块的时候,因为攻击者区块的哈希是足够小的,他有很高的可能性能够赢得出块权,因此他能够发布区块并且获得这个出块权。下一次当攻击者没有这么幸运的时候,他拿到的区块的哈希相对来说比较大,攻击者能够发布这个区块并直接获得奖励。更佳链质量协议的一般性结论下面是我们研究更佳链质量协议的一些一般性结论。当攻击者所占算力 > 1/4 时,没有一个协议能够达到一个理想的区块链的质量。只要攻击者的算力超过了全网算力的 1/4,它的收益就能够比它按照算力份额计算的正常收益更高。只要攻击者的算力超过了全网算力的 1/4 ,它的收益就能够比它按照算力份额计算的正常收益更高。 对于任何一个 的值,在 = 0 的情况下,没有一个协议在安全性上表现比 Nakamoto 共识更好。可能对于某一特定情况,某个协议在安全性上会比 Nakamoto 共识更好,但是在整体上 Nakamoto 共识在安全性上是最好的。这是为什么?因为协议并不能区分诚实的区块和攻击者的区块。为什么协议不能区分这些区块?这是因为信息的不对称。攻击者是基于所有可得信息来行动的,也就是说他知道他发布了多少个区块,有多少个扣留的区块,我什么时候发布这些区块等等,攻击者是都知道的。然而诚实的矿工仅基于有限的公开信息来行动。这又是为什么?这是因为 PoW 的安全假设较弱。他们试图异步操作,规定所有的矿工只对非常有限的公开信息采取行动/进行操作。那么现在我们来针对 Nakamoto 共识、水果链、奖励分配(Reward-Splitting,RS)协议、和子链来分析一下他们攻击抗性,首先是激励相容性。 其中奖励分配协议(执行)表现最好,因为惩罚总是激励正确行为的最有效方式。子链表现最差。水果链表现有时比 Nakamoto 共识好,有时更糟。子链允许攻击者使用无价值的弱区块来使诚实的区块失效。如果所有东西都是有价值的,那么攻击者扣留区块则是有风险的。但是弱区块本身毫无价值,攻击者可以扣留这个弱区块,而不会有失去区块奖励的风险。既然无风险,那么为什么不尝试更大胆的扣留区块的行为?更多的弱区块,协议行为越糟糕。所以更多的弱区块实际上使事情变得更糟。最好的情况就是不去使用弱区块。当水果链的超时值小的时候,它的表现比 Nakamoto 共识差。攻击者可以使用无用的区块使他的水果失效。这也有类似的问题出现,因为区块在水果链中没有任何奖励,所以攻击者没有发布区块的动机,因为扣留区块也并无风险,结果是攻击者可以尝试更大胆的扣留区块行为。结果是攻击者可以尝试更大胆的持有行为。如果有更多的水果,那么情况会稍微好一点。有一个著名的 Newton-Pepys 问题,它是说一个概率问题,即A. 6 个正常的骰子独立投掷,至少出现 1 个 6B. 12 个正常的骰子独立投掷,至少出现 2 个 6如果你掷 6 次骰子,得到 1 个 6 的概率比你掷 12 次骰子得到 2 个 6 的概率要大。在水果链中有四种挖矿产品:诚实水果,诚实区块,攻击水果,攻击区块。我们可以将「攻击者比诚实矿工拥有 1 个超时区块」——即攻击者可以成功地孤立一些水果——看作是一个条件事件。此事件完全独立于水果生成(fruit generation),因为它仅考虑区块。我们可以把它作为 Newton-Pepy’s 问题中的条件去看待——因为它是独立的,所以我们可以直接把它扔掉。但当条件满足时,如果水果较少,则“攻击者有更多水果”的概率非常低。更多的水果意味着更多的攻击者水果。因为攻击者是少数派,如果水果的总数更多,这意味着攻击者的水果的总占比会比实际上多一些。这里用赌博来做类比更好理解,因为我们有更多的水果,这意味着当攻击者有更多的水果, 那么他就会更少参与赌博。 人们更愿意在没有什么可失去的情况下赌博, 但如果有更多的资本可能会失去, 他就不想赌, 这意味着更多的水果稍微有助于提高激励相容性。接下来在攻击抵抗性中我们分析攻击「作恶收益」,这个指标是越小越好的,如图所示,奖励分配协议优于 Nakamoto 共识,优于水果链,优于子链。我们分析了另一个有趣的衡量方法,称为「作恶赏金」。我们定义其为最低双花奖励,来研究激励偏差。(也就是说,在双花攻击的奖励大于作恶赏金时,攻击者才有动力作恶)。( 图中右下角的表格,分别是 Nakamoto 共识和奖励分配协议在区块确认数 3 或 6 , (攻击者算力占比在 0.1 ~ 0.4 的情况下,计算出来的作恶赏金)。通过计算各个协议的「作恶赏金」可以发现,基本上可以零成本破坏水果链和子链,甚至可以尝试无奖励双花,因为毫无风险。我们可以看到,随着交易确认次数的增加,对于一个弱攻击者,作恶赏金的增长几乎呈指数增长。这意味着更多的交易确认确实有助于抵抗双花,但是对于强攻击者来说效果就不那么明显了。对于抗审查能力, 我们计算所有的数字和排名如下:对于小 ,也就是攻击者算力占比较低的情况下, 水果链是最好的, 然后是 Nakamoto 共识, 再然后是奖励分配协议和子链。 对于大 ,也就是攻击者算力占比较高的情况下,奖励分配协议变成了最好的, 然后是水果链, Nakamoto 共识, 和子链。 显而易见的是,对于水果链来说, 如果你想使其他块无效, 要比其他协议要困难得多, 因为它们是在多个条件下获得奖励, 即使你是孤块也是如此。 为什么当 足够大的时候, 也就是攻击者算力占比较高的时候,奖励分配协议会比水果链更好呢?因为在水果链上, 间隔被定义为主区块和指针块之间的区块高度差。而在奖励分配协议中, 间隔被定义为主区块和区块本身之间的区块高度差。 因此在水果链中,若攻击者在长期的出块竞争中都获胜了,那么诚实的水果的奖励都会被拿走因为他们的指针块都被孤立了。也就是说如果你把他们的指针都孤立了,那么对他们来说就玩完了。然而在奖励分发协议中,最后的几个诚实的区块还是能够获得一些奖励。如果想要让诚实矿工失去所有奖励,将他们的指针孤立是不够的,你需要将大量连续的区块孤立起来才行。(这给攻击者增加了阻碍)。这些图片能够说明这些问题。在水果链中,如果你孤立了指针,那么你能够安心地获得所有的奖励。然而在奖励分配协议中,即使你在出块竞争中长期孤立了这些区块,但是这些区块还是会指向回主链。因为关键关系并没有考虑进去,这个区块仍会分走攻击者一半的出块奖励,这让它更能抵抗审查攻击。(因为就算被审查,诚实矿工还是能获得一部分奖励。)抵抗攻击协议的通用结论下面谈一下研究中对于抵抗攻击协议的一些通用结论。合理的设置更长的区块确认时间和更大的带宽会增加安全性。有一个两难困境,我们称为“奖励坏人,惩罚好人”的机制。这对于大家来有点颠覆对协议奖励的认知。因为在这里即使你分叉你仍然能够获得出块奖励,你分叉是没有风险的。所以这反而激励了攻击者去分叉和发动双花攻击。在惩罚性协议中,因为审查攻击者不在乎他们自己的出块奖励,你的惩罚规则反而给攻击者另一个工具,来让诚实的矿工放弃出块奖励。而对于幸运奖励协议,如果你不打破信息不对称,那么幸运并不意味着好。有时候幸运的块反而是坏的块,让事情变得更糟。结论就是,想要解决所有的攻击,我们需要在底层规则中超越奖励。(奖励规则并不能很好解决攻击的问题)具体怎么做?我提出一些想法和大家讨论一下。我们不应该设计一个太复杂、太难分析的协议。我们需要设计一个设计者能够分析的协议。简单就是好的,复杂是安全的敌人。仅针对单一攻击策略的安全性分析是很危险的。对于很多协议来说,它们的设计者经过模拟说他们的协议能够抵抗某种特定的攻击方式,但是这样的协议却启发了攻击者去研究其他的攻击策略。仅针对单一攻击动机的安全性分析也是很危险的。攻击者可能会着眼于短期利益,长期利益或者损害其他矿工的利益。为了抵抗某一种攻击,你就可能启发了攻击者基于另一个目标发动另一种形式的攻击。在你的模型中你需要考虑到所有不同动机的攻击者。所以为了能够在质量和攻击抵抗中做的更好,你需要阅读这篇论文,但是因为我还没有准备好将这篇论文公之于众,因此你需要来找我要这篇论文。而有心的你,一定会找到张韧博士的联系方式…… ...

November 29, 2018 · 2 min · jiezi

区块链商用调查

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~本文由鹅厂优文发表于云+社区专栏作者:林喜东 | 腾讯云高级工程师最近区块链有多火,已经无需过多阐述,无论你是主动了解,还是被比特币/加密猫/3点钟无眠区块链等刷屏,相信区块链概念已经在多数人心中萌芽。但区块链这么火,它能做什么?与我有什么关系?现实中有哪些应用?这些问题也困绕我许久,通过近期断断续续的关注和了解,略窥一二,分享给大家;因知识水平有限,难免存在错误,欢迎指正,一起学习,一起进步。区块链的应用五花八门,有些是来割韭菜(目前币圈中绝大部分的ICO),有些是来蹭热点的(如区块链手机、区块链手表、区块链牙刷等),经过一番调查,我觉得比较有意义的应用可能包括但不限于以下七种:备注:需要了解区块链是什么的,请出门百度/google搜索一下,有很多理解比我透彻,讲得比我好的,就不再普及了;下面直接进入各个应用场景。一、应用场景1:信息共享 – 信息对齐、提高效率这应该是区块链最简单的应用场景,就是信息互通有无。1、传统的信息共享的痛点(1)要么是统一由一个中心进行信息发布和分发,要么是彼此之间定时批量对账(典型的每天一次),对于有时效性要求的信息共享,难以达到实时共享。(2)信息共享的双方缺少一种相互信任的通信方式,难以确定收到的信息是否是对方发送的。2、区块链 + 信息共享首先,区块链本身就是需要保持各个节点的数据一致性的,可以说是自带信息共享功能;其次,实时的问题通过区块链的P2P技术可以实现;最后,利用区块链的不可篡改和共识机制,可构建其一条安全可靠的信息共享通道。也行你会有这样的疑问:解决上面的问题,不用区块链技术,我自己建个加密通道也可以搞定啊!但我想说,既然区块链技术能够解决这些问题,并且增加节点非常方便,在你没有已经建好一套安全可靠的信息共享系统之前,为什么不用区块链技术呢?3、应用案例 举下我们腾讯自己的应用–公益寻人链,借用如下一张好图,可以看到,区块链在信息共享中发挥的价值。图片来源:腾讯可信区块链二、应用场景2:版权保护 – 不可篡改、永久保存1、传统鉴证证明的痛点 (1)流程复杂:以版权保护为例,现有鉴证证明方式,登记时间长,且费用高。 (2)公信力不足:以法务存证为例,个人或中心化的机构存在篡改数据的可能,公信力难以得到保证。2、区块链 + 鉴证证明 (1)流程简化:区块链应用到鉴证证明后,无论是登记还是查询都非常方便,无需再奔走于各个部门之间, (2)安全可靠:区块链的去中心化存储,保证没有一家机构可以任意篡改数据,3、应用案例 区块链在鉴权证明领域的应用有版权保护、法务存证等,下面以版权保护为例,简单说下如何区块链如何实现版权登记和查询。 (1)电子身份证:将“申请人+发布时间+发布内容”等版权信息加密后上传,版权信息用于唯一区块链ID,相当拥有了一张电子身份证。 (2)时间戳保护:版权信息存储时,是加上时间戳信息的,如右雷同,可用于证明先后。 (3)可靠性保证:区块链的去中心化存储、私钥签名、不可篡改的特性提升了鉴权信息的可靠性。 2016年8月,由Onchain、微软(中国)、法大大等多个机构在北京成立了电子存证区块链联盟“法链”。 2017年12月,微众银行、仲裁委(广州仲裁委)、杭州亦笔科技有限公司共同推出的仲裁联盟链,用于司法场景下的存证;2018年3月,广州首个“仲裁链”判决书出炉。三、应用场景3:物流链 – 溯源防伪 商品从生产商到消费者手中,需要经历多个环节(流程可能如上图所示),跨境购物则更加复杂;中间环节经常出问题,消费者很容易购买的假货。而假货问题正是困扰着各大商家和平台,至今无解。1、传统是防伪溯源手段 以一直受假冒伪劣产品困扰的茅台酒的防伪技术为例,2000年起,其酒盖里有一个唯一的RFID标签,可通过手机等设备以NFC方式读出,然后通过茅台的APP进行校验,以此防止伪造产品。 咋一看,这种防伪效果非常可靠。但2016年还是引爆了茅台酒防伪造假,虽然通过NFC方式验证OK,但经茅台专业人士鉴定为假酒。后来,在“国酒茅台防伪溯源系统”数据库审计中发现80万条假的防伪标签记录,系防伪技术公司人员参与伪造;随后,茅台改用安全芯片防伪标签。 但这里暴露出来的痛点并没有解决,即防伪信息掌握在某个中心机构中,有权限的人可以任意修改。(备注:茅台的这种防伪方式,也衍生了旧瓶回收,旧瓶装假酒的产业,防伪道路任重而道远)。 2017年05月贵阳数博会上,小马哥就建议茅台防伪使用区块链;那么区块链和物流链的结合有什么优势呢?2、区块链+物流链 (1)、区块链没有中心化节点,各节点是平等的,掌握单个节点无法实现修改数据;需要掌控足够多的节点,才可能伪造数据,大大提高伪造数据的成本。 (2)、区块链天生的开放、透明,使得任何人都可以公开查询,伪造数据被发现的概率大增。 (3)、区块链的数据不可篡改性,也保证了已销售出去的产品信息已永久记录,无法通过简单复制防伪信息蒙混过关,实现二次销售。 (4)、物流链的所有节点上区块链后,商品从生产商到消费者手里都有迹可循,形成完整链条;商品缺失的环节越多,将暴露出其是伪劣产品概率更大。3、应用案例 目前,入局物流链的玩家较多,包括腾讯、阿里、京东、沃尔玛等。 据说,阿里的菜鸟在海淘进口应用区块链上,走在了前面,已经初步实现海外商品溯源,国际物流及进口申报溯源、境内物流溯源;下一步就是生产企业溯源了。下图是网上流传的关于阿里的菜鸟在海淘场景运用区块链的示意图。图片来源:http://baijiahao.baidu.com/s?id=1595434778790029525另据最新消息,在3月份的第三届全球物流技术大会上,腾讯与中国物流与采购联合会(简称“中物联”)正式签署战略合作协议,并发布了区块链物流平台。强强联合,想象空间很大。四、应用场景4:供应链金融 – 解决中小微企业融资难1、传统的供应链单点融资 在一般供应链贸易中,从原材料的采购、加工、组装到销售的各企业间都涉及到资金的支出和收入,而企业的资金支出和收入是有时间差的,这就形成了资金缺口,多数需要进行融资生产。我们先来看个简单的供应链(复杂的我也不了解(⊙o⊙)),如下图: 我们再来看看图中各个角色的融资情况: (1)核心企业或大企业:规模大、信用好,议价能力强,通过先拿货后付款,延长账期将资金压力传导给后续供应商;此外,其融资能力也是最强的。 (2)一级供应商:通过核心企业的债权转让,可以获得银行的融资。 (3)其他供应商(多数是中小微企业):规模小、发展不稳定、信用低,风险高,难以获得银行的贷款;也无法想核心企业一样有很长的账期;一般越小的企业其账期越短,微小企业还需要现金拿货。这样一出一入对比就像是:中小微企业无息借钱给大企业做生意。2、区块链+供应链金融 面对,上述供应链里的中小微企业融资难问题,主要原因是银行和中小企业之间缺乏一个有效的信任机制。 假如供应链所有节点上链后,通过区块链的私钥签名技术,保证了核心企业等的数据可靠性;而合同、票据等上链,是对资产的数字化,便于流通,实现了价值传递。 如上图所示,在区块链解决了数据可靠性和价值流通后,银行等金融机构面对中小企业的融资,不再是对这个企业进行单独评估;而是站在整个供应链的顶端,通过信任核心企业的付款意愿,对链条上的票据、合同等交易信息进行全方位分析和评估。即借助核心企业的信用实力以及可靠的交易链条,为中小微企业融资背书,实现从单环节融资到全链条融资的跨越,从而缓解中小微企业融资难问题。3、应用案例 比较成熟的还没看到,目前腾讯也已入局。五、应用场景5:跨境支付 – 提高效率、降低费用1、传统跨境支付 跨境支付涉及多种币种,存在汇率问题,传统跨境支付非常依赖于第三方机构,大致的简化模型如上图所示,存在着两个问题; (1)、流程繁琐,结算周期长:传统跨境支付基本都是非实时的,银行日终进行交易的批量处理,通常一笔交易需要24小时以上才能完成;某些银行的跨境支付看起来是实时的,但实际上,是收款银行基于汇款银行的信用做了一定额度的垫付,在日终再进行资金清算和对账,业务处理速度慢。 (2)、手续费高:传统跨境支付模式存在大量人工对账操作,加之依赖第三方机构,导致手续费居高不下,麦肯锡《2016全球支付》报告数据显示,通过代理行模式完成一笔跨境支付的平均成本在25美元到35美元之间。2、区块链+跨境支付 这些问题的存在,很大原因还是信息不对称,没有建立有效的信任机制。 如上图所示,区块链的引入,解决了跨境支付信息不对称的问题,并建立起一定程度的信任机制;带来了两个好处。 (1)、效率提高,费用降低:接入区块链技术后,通过公私钥技术,保证数据的可靠性,再通过加密技术和去中心,达到数据不可篡改的目的,最后,通过P2P技术,实现点对点的结算;去除了传统中心转发,提高了效率,降低了成本(也展望了普及跨境小额支付的可能性)。 (2)、可追溯,符合监管需求:传统的点对点结算不能不规模应用,除了信任问题,还有就是存在监管漏洞(点对点私下交易,存在洗黑钱的风险),而区块链的交易透明,信息公开,交易记录永久保存实现了可追溯,符合监管的需求。3、应用案例 应用现状:Ripple、Circle、招商银行等已经入局。六、应用场景6:资产数字化 – 便于资产流通1、实体资产存在的问题 (1)实体资产往往难以分割,不便于流通 (2)实体资产的流通难以监控,存在洗黑钱等风险2、区块链实现资产数字化 (1)资产数字化后,易于分割、流通方便,交易成本低 (2)用区块链技术实现资产数字化后,所有资产交易记录公开、透明、永久存储、可追溯,完全符合监管需求3、应用案例 还是以腾讯的微黄金应用为例,继续借用腾讯区块链官网(trustsql.qq.com)上的图片,可以看到,在资产数字化之后,流通更为方便了,不再依赖于发行机构;且购买0.001g黄金成为了可能,降低了参与门槛。图片来源:腾讯区块链官网https://trustsql.qq.com/七、应用场景7:代币 – 去中介、去信任 本来不像把代币加进来的,但说到区块链,始终绕不开代币;因区块链脱胎于比特币,天生具有代币的属性,目前区块链最成功的应用也正是比特币。1、传统货币存在的问题 (1)、传统的货币发行权掌握在国家手中,存在着货币滥发的风险 货币滥发案例1:元朝自1271年建立后,依然四处征战,消耗大量的钱财和粮食,为了财政问题,长期滥发货币,造成严重通货膨胀,多数百姓生活在水生火热中,导致流民四起,国家大乱,1368年,不可一世的元朝成了只有97年短命鬼,走向了灭亡。 货币滥发案例2:1980年津巴布韦独立,后因土改失败,经济崩溃,政府入不敷出,开始印钞;2001年时100津巴布韦币可兑换约1美元;2009年1月,津央行发行100万亿面值新津元(如下图)加速货币崩溃,最终津元被废弃,改用“美元化”货币政策。2017年津巴布韦发生政变,总统穆加贝被赶下台。图片来源于网络:https://zhidao.baidu.com/question/526746890.html (2)、传统的记账权掌握在一个中心化的中介机构手中,存在中介系统瘫痪、中介违约、中介欺瞒、甚至是中介耍赖等风险。 2013年3月,塞浦路斯为获得救助,对银行储户进行一次性征税约58亿欧元, 向不低于10万欧元的存款一次性征税9.9%,向低于10万欧元的一次性征税6.75%。 2017年4月,民生银行30亿假理财事件暴露,系一支行行长伪造保本保息理财产品所致,超过150名投资者被套。2、区块链如何解决这些问题 比特币解决了货币在发行和记账环节的信任问题,我们来看下比特币是如何一一破解上面的两个问题。 滥发问题:比特币的获取只能通过挖矿获得,且比特币总量为2100万个,在发行环节解决了货币滥发的问题; 账本修改问题:比特币的交易记录通过链式存储和去中心化的全球节点构成网络来解决账本修改问题。 链式存储可以简单理解为:存储记录的块是一块连着一块的,形成一个链条;除第一个块的所有区块都的记录包含了前一区块的校验信息,改变任一区块的信息,都将导致后续区块校验出错。因为这种关联性,中间也无法插入其他块,所以修改已有记录是困难的。 而去中心化节点可以简单理解为:全球的中心节点都是平等的,都拥有一模一样的账本,所以,任一节点出问题都不影响账本记录。而要修改账本,必须修改超过全球一半的节点才能完成;而这在目前看来几乎不可能。 既然账本无法修改,那要是记账的时候作弊呢? 首先,比特币的每条交易记录是有私钥签名的,别人伪造不了这个记录。你能修改的仅仅自己发起的交易记录。 其次,是关于记账权问题:比特币的记账权,通过工作量证明获得,可以简单理解为:通过算法确定同一时刻,全球只有一个节点获得了记账权,基本规律是谁拥有的计算资源越多,谁获得记账权的概率越大,只有超过全网一半的算力,才可能实现双花。 备注:比特币的模式是不可复制的,比特币已经吸引了全球绝大多数的算力,从而降低51%攻击发生等问题;其他的复制品基本无法获得相应的算力保证。 目前,比特币还存在着51%和效率低等问题有待解决,另外,关于交易本身的信任问题是个社会问题,比特币是没有解决的,也解决不了的。3、应用案例 最具代表性的当然是比特币,也不用多说了。 备注:代币这块真的不看好,比特币目前吸引了全球绝大部分的算力,有独一无二的算力资源作为支撑还稍好一点,其他的代币和传统的货币相比,其背后缺乏国家和武力为其做信用背书,且夺取了国家发币带来的各种好处(如宏观调控),仔细想想就知道有多不靠谱。八、小结 区块链应用的场景肯定还有很多,但很多都还不大明朗,暂时就先梳理以上7种场景,顺便归纳一下。九、后话区块链这么火,但实际应用的案例却少之又少;我认为,并非区块链技术目前存在的问题阻碍了其大范围的应用,也不是区块链可以应用的场景非常少,区块链商用牵扯到各方的利益,其最大的难题可能远在技术之外。【参考文章】[1] 腾讯区块链官网 https://trustsql.qq.com/[2] 三分钟看懂系列(一)—— 腾讯区块链如何落地供应链金融http://www.8n8k.com/3152.html[3] 区块链版权能保护原创吗?它的应用性到底如何?https://www.zhihu.com/questio…[4] 腾讯可信区块链——公益寻人链[5] 看菜鸟物流专家解密,物流是如何成为区块链新主场http://baijiahao.baidu.com/s?…[6] 滥发货币如何葬送一个伟大王朝https://zhuanlan.zhihu.com/p/…[7] 此处省略更多……问答区块链是什么?相关阅读区块链+物联网=?科斯定理与区块链聊聊区块链 【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识 ...

October 23, 2018 · 1 min · jiezi