Kehaw

B2B上的区块链


到目前为止,整个世界都在忽略区块链技术的重要性,以及其在各种业务场景中能够提供的解决方案,似乎整个世界只将区块链技术局限在加密的虚拟货币上,但是我们通过区块链的维基百科可以发现,虚拟货币只是区块链技术的一个最大应用,同时也是将区块链发挥最完美的应用,目前突尼斯的e-Dinar和塞内加尔的eCFA都是当地政府认可的数字货币,而e-Dinar更是全世界第一个国家数字货币。

虽然大家都在轻视区块链本身的技术架构,而更加重视虚拟货币,但是只要我们简单的了解一下区块链技术本身就能够想象出其能够在业务中提供不同寻常的解决方案。在B2B业务中使用区块链技术可以简单的提高企业的安全性和盈利能力。

什么是区块链

老生常谈,我们再一次的回顾一下什么是区块链?

在我们开始讨论区块链在 B2B 中能够提供什么解决方案之前,对区块链 —— Blockchain 有一个基本概念非常重要。当然,如果在座各位已经精通这项技术,可以直接跳过本小节进入正篇

对于初学者来说,区块链是一个去中心化的记录或账簿,也可以更偏向技术一点的去描述 —— 它是一个分布式共享的数据库。基于区块链架构的框架不需要中央服务器或中间件来进行数据信息交换。

什么是去中心化?

先看看什么是中心化,回忆一下你在网上购买一本书的流程:

  • 第一步,你下单并把钱打给支付宝;
  • 第二步,支付宝收款后通知卖家可以发货了;
  • 第三步,卖家收到支付宝通知之后给你发货;
  • 第四步,你收到书之后,觉得满意,在支付宝上选择确认收货;
  • 第五步,支付宝收到通知,把款项打给卖家。流程结束。

而去中心化则是:

  • 第一步,你下单并把钱打给卖家;
  • 第二步,你将这条转账信息记录在自己账本上;
  • 第三步,你将这条转账信息广播出去;
  • 第四步,卖家和支付宝在收到你的转账信息之后,在他们自己的账本上分别记录;
  • 第五步,卖家发货,同时将发货的事实记录在自己的账本上;
  • 第六步,卖家把这条事实记录广播出去;
  • 第七步,你和支付宝收到这条事实记录,在自己的账本上分别记录;
  • 第八步,你收到书籍。至此,交易流程走完。

以上比喻摘自 https://www.zhihu.com/question/37290469/answer/293890531

简而言之,就是人人都是记录员,当数据发生变动的时候,所有“数据块”都会记录这一次变动。举一个简单的例子就是:在现实场景中,当我们的金融服务向某个会员借出一百万的时候,所有的会员都会得知我们向某个会员借出了一百万,这个业务不以某个人的权威而发生改变,它对所有人都是透明可见的。

我们可以看到,其实所谓的“钱”在整个模型中并不重要。我们在区块链中,可以将这一百万替换成任何一种大家都认可的“东西”,比如信用凭证、学历、一吨螺纹钢甚至是一种毫无意义的东西。

但是钱是一个大家最容易理解的抽象概念,货币本身就是对实物的抽象,如果用信用、学历去描述区块链,难免会过早的陷入到业务场景中去而忽略了区块链本身的价值。因此,用钱来描述区块链是比较容易的一种方式,所以大家才会觉得“虚拟货币”是了解区块链绕不过去的一个话题。

什么是链?

我们通过上面的描述,可以知道,只要我声明我有某种东西,并且大家都认可,你就可以让这种东西流通起来,我们还是以钱作为例子。

在创建区块链的时候,你声称自己拥有一千万(创世区块),所有想参与的数据块都承认你有这一千万(在自己的账本上记录XX有一千万),那么这一千万在你的区块链中就真实存在了 —— 大家根本不用去核实你是否真的有一千万现金,因为大家都认可了,所以对于区块链中的所有数据块(吃瓜群众们)来讲,你就是有一千万。

一个熟悉的身影浮现出来 —— 比特币

在过了一段时间之后,大家都开始基于你创造的一千万开始愉快的玩耍起来,其中有个小伙伴动起了歪脑筋:我难道就不可以向大家宣布我也有一千万吗?于是他大声叫起来:“我有一千万”,此时所有的小伙伴们该肿么办?难道在自己的小账本上记录他有一千万吗?这样大家还万个毛啊。

为了防止这种现象,你需要在创造这一千万的时候,给你创造这一千万的动作打上一个标记,比如标记为【000000】,而在整个区块链记录中会记录一条:“黄老板在某年某月创造了一千万,这个动作被标记为000000”,以后在将其中的一百万交易给下一个小伙伴的时候,同时向所有的小伙伴宣布:“我将给老王一百万,这个一百万是来自于标记为000000的那一千万,而这个一百万的标记是【000001】”。

这样,因为每一笔钱都有源可溯,就避免了Bad boy伪造货币的问题,而每一笔交易都记录了这里的钱来自哪里,就形成了数据链(技术的同学可以想象一下拉链表的设计)。

好,我们将上面的话抽象一下,就可以看到整个链条是这样的:

而真实的场景中,所有的记录链条关系的数据将会被加密。

为什么我要帮你记账?

重头戏来了,就是为什么我要帮你记账?难道我的服务器带宽电费都不要钱吗?

天下熙熙皆为利来,天下攘攘皆为利往。

当有一个新的区块被释放出来之后,所有已经存在的节点将会争先恐后的去第一个记录他,而第一个成功记录他的节点将会得到一份奖赏,而随着越来越多的区块被释放出来,计算复杂度也会越来越高 —— 这就是所谓的挖矿。

而其他没有竞争上的落榜选手们则不得不放弃一切工作,来将这个最新的信息追加到账本上去 —— 比特币的账本目前已经有200多G了。

在实际的虚拟币运行过程中,会有更复杂的校验、加密机制,在此不细细讨论,更多可以参考百度或者Google。

最后

我总结了区块链的四个重要特征:

  1. 去中心化,打破极权垄断。
  2. 通过HASH加密,保证交易隐私。
  3. 记录一个抽象事物整个流转过程,保证数据可追溯不可伪造。
  4. 通过记账奖赏来鼓励所有人参与记账。

区块链如何改善B2B业务

对于那些创建某个产品并通过该产品向其他公司提供服务的公司而言,区块链可以是某种新型的银行。利用区块链技术,人们可以无缝地处理现金的发送和接收,签订合同,接受存款等等的业务过程。但是,不要将区块链与新一代在线银行混淆,因为后者仍由中央机构控制,而区块链仍是纯粹的去中心化。

所以,资本交易可能是区块链最可行和最清晰的用例。但是,这并不能表示区块链技术只能应用于如此。

区块链和加密货币下存在许多可以增强B2B运营的机会。我们来详细了解一下B2B中的区块链。

供应链和物流中的区块链

注意,这里的供应链就是供应链,不是什么供应链金融。在供应链体系中,利用区块链的可追溯性,能够对一件产品进行完整的追溯 —— 甚至可以包括原材料从哪一个矿坑被采掘出来。

同时,基于区块链的分布式记账功能,所有的节点都能实时的获取到整个供应链生态中的细微变化,极大的降低了人为操作或中心化操作造成的误差。它有助于在快速迭代的市场环境中发现问题,与传统供应链不同的是,企业无需投入大量的资源即可达到最终目的,减少大量的流程性资源消耗!

并且,分散的数据存储极大的提高了合作伙伴之间的信任,区块网络不受任何节点篡改数据的影响。

必和必拓和沃尔玛是供应链业务中,实施区块链的一些优秀典型,这两家集团都是世界上数一数二的巨头,他们已在其工作中实施了区块链技术。必和必拓已在其采矿过程中使用了区块链技术创新,而沃尔玛已实施了区块链应用系统,以跟踪其来自中国的产品在美国售卖。

所以,在供应链体系中,区块链可以被看做是物联网的补充,甚至是替代。

销售

借助区块链技术,与业务伙伴之间建立信任变得更加简单,我们可以使用该技术极大的降低风险控制成本。

Never Stop Marketing(一家以营销和广告为主的公司)的Jeremy Epstein指出,大约50%的B2B公司正在对商业伙伴进行监测,以避免商业风险。

在传统的销售模式中,确保合作伙伴的安全性并不容易,并且无法保证商品质量是否靠谱,但是对于区块链技术来讲,这两种担心将会变得毫无意义。

所以,基于区块链的销售模式将会在未来改变数字风控的整体风险控制模式。

智能合约

智能合约的概念最初是为以太坊网络设计的,目的是促进和鼓励以太坊应用程序开发人员之间的交易。但是,今天,智能合约已经超越了其最初的工作角色,并为商业公司及其内部流程铺平了道路。

智能合约的前提还有一个预先定义好的规则集,通过整个区块链中包含的数据信息,可以套用该预先定义好的规则集,从而形成一个市场共识 —— 让交易、履约更加透明、公正。

新一代的货币兑换

正如我们之前所提到的,区块链技术的使用,在业务场景的有利优势是货币兑换。区块链技术是去中心化的,它完全消除了对银行和支付处理商等中介机构进行交易的需求。区块链可以立即以较低的费用进行货币兑换,这意味着参与区块链网络的各方都会大大的降低兑换成本。

Visa最近推出了B2B Connect系统,以在其数字身份方面带来质的改进。

数字货币

加密的数字货币是区块链的生母,而加密的数字货币在交易中的优势非常明显。基于区块链的特性,跨国的交易将会变得更加简单。

简而言之,区块链可以充当B2B公司的虚拟银行,以高效,盈利地开展运营。与传统的业务模式不同,区块链可帮助商业公司完全消除中央银行在处理业务交易中的作用(GOV:NMMP!)。

技术实现

比较成熟的项目包括:

  1. Status
  2. Cosmos
  3. Storj
  4. Aragon
  5. Augur

等等等等,如果感兴趣,徒手撸一个也是可以的,起手式:

import java.util.Date;

/**
 * 定义数据块
 */
public class Block {

    public String hash;
    public String previousHash;
    private String data; //our data will be a simple message.
    private long timeStamp; //as number of milliseconds since 1/1/1970.

    //Block Constructor.
    public Block(String data,String previousHash ) {
        this.data = data;
        this.previousHash = previousHash;
        this.timeStamp = new Date().getTime();
    }
}

创建数字签名

import java.security.MessageDigest;

public class StringUtil {
    //Applies Sha256 to a string and returns the result. 
    public static String applySha256(String input){     
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");            
            //Applies sha256 to our input, 
            byte[] hash = digest.digest(input.getBytes("UTF-8"));           
            StringBuffer hexString = new StringBuffer(); // This will contain hash as hexidecimal
            for (int i = 0; i < hash.length; i++) {
                String hex = Integer.toHexString(0xff & hash[i]);
                if(hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }
            return hexString.toString();
        }
        catch(Exception e) {
            throw new RuntimeException(e);
        }
    }   
}

检查完整性

public static Boolean isChainValid() {
    Block currentBlock; 
    Block previousBlock;

    //loop through blockchain to check hashes:
    for(int i=1; i < blockchain.size(); i++) {
        currentBlock = blockchain.get(i);
        previousBlock = blockchain.get(i-1);
        //compare registered hash and calculated hash:
        if(!currentBlock.hash.equals(currentBlock.calculateHash()) ){
            System.out.println("Current Hashes not equal");         
            return false;
        }
        //compare previous hash and registered previous hash
        if(!previousBlock.hash.equals(currentBlock.previousHash) ) {
            System.out.println("Previous Hashes not equal");
            return false;
        }
    }
    return true;
}

然后我们可以开始挖矿(竞争记录区块信息)

import java.util.Date;

public class Block {

    public String hash;
    public String previousHash; 
    private String data; //our data will be a simple message.
    private long timeStamp; //as number of milliseconds since 1/1/1970.
    private int nonce;

    //Block Constructor.  
    public Block(String data,String previousHash ) {
        this.data = data;
        this.previousHash = previousHash;
        this.timeStamp = new Date().getTime();

        this.hash = calculateHash(); //Making sure we do this after we set the other values.
    }

    //Calculate new hash based on blocks contents
    public String calculateHash() {
        String calculatedhash = StringUtil.applySha256( 
                previousHash +
                Long.toString(timeStamp) +
                Integer.toString(nonce) + 
                data 
                );
        return calculatedhash;
    }

    public void mineBlock(int difficulty) {
        String target = new String(new char[difficulty]).replace('\0', '0'); //Create a string with difficulty * "0" 
        while(!hash.substring( 0, difficulty).equals(target)) {
            nonce ++;
            hash = calculateHash();
        }
        System.out.println("Block Mined!!! : " + hash);
    }
}

上面的代码只是描述原理,实际开发还需要考虑更多更多。

真·最后

目前,区块链更多的服务于金融与银行业,未来能否在B2B领域大放异彩,还需要业内有一个共识,只有大家形成共识了,才能将区块链技术真正的服务好所有参与者。

Enjoy it!

Kehaw

👨‍💻Ke Haw 🇨🇳👨‍👩‍👧‍👦

风吹云散去,夜色好观星
Java | 前端 | 大数据

专注于 Spring Cloud 微服务架构与数据处理,研究一切与Java相关的开发技术,包括一部分前端技术。

目前的工作主要是关于B2B大宗商品在线交易领域的数据处理。如果对本站的部分内容感兴趣,请通过邮件、Twitter联系我🤝。

Fork me on Gitee
基于Spring Security + OAuth2 + JWT 的权限认证(一) Java-Stream学习第四步:数据处理 Java-Stream学习第三步:终端操作 Java-Stream学习第二步:处理流 Java-Stream学习第一步:创建流 Electron使用串口通信 Electron下调用DLL文件 国外SaaS服务供应商都是干什么的:Part1 为什么Kafka会丢失消息 Spring Boot中使用JSR380验证框架
Description lists
Kehaw's blog
Site description
人初做事,如鸡伏卵,不舍而生气渐充;如燕营巢,不息而结构渐牢;如滋培之木,不见其长,有时而大;如有本之泉,不舍昼夜,盈科而后进,放乎四海。
Copyright
© 2014 Copyright Kehaw | All rights reserved.