Py学习  »  区块链

通过7个函数解密区块链(附代码)

数据派THU • 5 年前 • 462 次点击  

翻译:张媛

校对:丁楠雅

本文约2022字,建议阅读5分钟。

本文将通过实例展示如何应用机器学习来更好地匹配学生和导师,最终在Flask图表界面中展示结果。


我想对很多人来说,区块链是一种很难理解的技术,虽然我也看了很多视频和文章,但从我个人角度来讲,直到我开始写一些简单的区块链应用,我才真正理解了它是什么以及它的潜在应用。


我对区块链的看法是,它是一个公开的加密数据库。举个例子,亚马逊也许想利用这种技术来跟踪库存水平,那么使用区块链是否有意义呢?大概率没有,因为消费者不会愿意花费资源来验证亚马逊的区块链是否可行,更别说亚马逊总是在网站上宣称商品“只剩最后一个!”。


关于区块链未来可能的应用场景留给您自己思考,废话不多说,让我们一起通过这7个函数来探索区块链吧。


def hash_function(k):

    """Hashes our transaction."""

    if type(k) is not str:

        k = json.dumps(k, sort_keys=True)

 

    return hashlib.sha256(k).hexdigest()


区块链的核心是哈希函数,如果不加密,区块链将很容易被操纵,交易将能够被欺骗性地插入到区块链中。


def update_state(transaction, state):

    state = state.copy()

 

    for key in transaction:

        if key in state.keys():

            state[key] += transaction[key]

        else:

            state[key] = transaction[key]

 

    return state


所谓的状态是交易完成后的资产分配记录。比如,我有10个币,我把其中1个币给了Medium那么当前的状态就是如下字典中的值。


{‘transaction’: {‘Tom’: 9, ‘Medium’: 1}}


值得注意的是,在这个体系中,透支是不可能存在的。如果我只有10个币,那么我不可能将11个币给别人。下面的函数将验证我们尝试进行的交易确实是有效的。而且,交易必须平衡,我不可能给了对方5个币,但他只收到4个币,否则会引起币的销毁和创建。


def valid_transaction(transaction, state):

    """A valid transaction must sum to 0."""

    if sum(transaction.values()) is not 0:

        return False

 

    for key in transaction.keys():

        if key in state.keys():

            account_balance = state[key]

        else:

            account_balance = 0

 

        if account_balance + transaction[key] < 0:

            return False

 

    return True


现在我们可以构建自己的区块了。读取上一个区块的信息,并将其链接到下一个区块,这也是区块链的核心技术之一,看起来有效交易可以被欺诈性地插入到区块链中,但是对前面所有的区块进行解密在计算上几乎是不可能的,这就保留了区块链的完整性。


def make_block(transactions, chain):

    """Make a block to go into the chain."""

    parent_hash = chain[-1]['hash']

    block_number = chain[-1]['contents']['block_number'] + 1

 

    block_contents = {

        'block_number': block_number,

        'parent_hash': parent_hash,

        'transaction_count': block_number + 1,

        'transaction': transactions

    }

 

    return {'hash': hash_function(block_contents), 'contents': block_contents}


下面是一个小小的帮助函数,用于检查前一个区块的哈希值。


def check_block_hash(block):

    expected_hash = hash_function(block['contents'])

 

    if block['hash'] is not expected_hash:

        raise

 

    return


一旦我们把所有的东西整合起来,就是时候创建自己的区块了。接下来我们将更新区块链。


def check_block_validity(block, parent, state):

    parent_number = parent['contents']['block_number']

    parent_hash = parent['hash']

    block_number = block['contents']['block_number']

 

    for transaction in block['contents']['transaction']:

        if valid_transaction(transaction, state):

            state = update_state(transaction, state)

        else:

            raise

 

    check_block_hash(block)  # Check hash integrity

 

    if block_number is not parent_number + 1:

        raise

 

    if block['contents']['parent_hash'] is not parent_hash:

        raise

 

    return state

 

在完成之前,区块链必须经过验证:


def check_chain(chain):

    """Check the chain is valid."""

    if type(chain) is str:

        try:

            chain = json.loads(chain)

            assert (type(chain) == list)

        except ValueError:

            # String passed in was not valid JSON

            return False

    elif type(chain) is not list:

        return False

 

    state = {}

 

    for transaction in chain[0]['contents']['transaction']:

        state = update_state(transaction, state)

 

    check_block_hash(chain[0])

    parent = chain[0]

 

    for block in chain[1:]:

        state = check_block_validity(block, parent, state)

        parent = block

 

    return state


最后,需要一个交易函数,将所有上述功能整合在一起:


def add_transaction_to_chain(transaction, state, chain):

    if valid_transaction(transaction, state):

        state = update_state(transaction, state)

    else:

        raise Exception('Invalid transaction.')

 

    my_block = make_block(state, chain)

    chain.append(my_block)

 

    for transaction in chain:

        check_chain(transaction)

 

    return state, chain


现在我们有了7个函数,那么怎样使用它们呢?首先,我们需要一个创世块来开始我们的区块链,这也是新币产生的开始。在这篇文章里,我将会从10个币开始。


genesis_block = {

    'hash': hash_function({

        'block_number': 0,

        'parent_hash': None,

        'transaction_count': 1,

        'transaction': [{'Tom': 10}]

    }),

    'contents': {

        'block_number': 0,

        'parent_hash': None,

        'transaction_count': 1,

        'transaction': [{'Tom': 10}]

    },

}

 

block_chain = [genesis_block]

chain_state = {'Tom': 10}

 

那么,当我将一些币给Medium之后发生了什么呢?


chain_state, block_chain = add_transaction_to_chain(transaction={'Tom': -1, 'Medium': 1}, state=chain_state, chain=block_chain)


状态的值将会被更新为当前各人拥有多少个币:


{'Medium': 1, 'Tom': 9}


然后生成的区块链会如下所示:


[{'contents': {'block_number': 0,

               'parent_hash': None,

               'transaction': [{'Tom': 10}],

               'transaction_count': 1},

  'hash': '064d0b480b3b92761f31831d30ae9f01954efaa62371b4b44f11465ec22abe93'},

 {'contents': {'block_number': 1,

               'parent_hash': '064d0b480b3b92761f31831d30ae9f01954efaa62371b4b44f11465ec22abe93',

               'transaction': {'Medium': 1, 'Tom': 9},

               'transaction_count': 2},

  'hash': 'b4ae25f0cc0ee0b0caa66b9a3473e9a108652d53b1dc22a40962fef5c8c0f08c'}]

 

至此,我们的第一个交易已经创建并被插入到堆栈的顶部。现在,我希望这些已经激起你的好奇心,并且有兴趣将代码复制下来跑一跑。在我看来,这是学习新技术的最佳途径。

请尝试运行代码去创造自己的币。思考一下,如果您想提供比现存更多的币,会发生什么情况?如果您不断创建新的收款人,会发生什么?

还有,您能想到区块链在未来会被应用到哪些场景呢?欢迎在评论中留言。

原文链接:

https://www.kdnuggets.com/2018/04/blockchain-explained-7-python-functions.html

 Blockchain Explained in 7 Python Functions


译者简介


张媛,某云计算公司不务正业服务工程师一枚。喜欢下雨天,读闲书,缺乏技术细胞,欣赏并喜欢有态度有立场的人,爱浪漫,注重仪式感,喜欢记录。最近的愿望是拥有自己的小窝,给想念的人写一封信。

翻译组招募信息

工作内容:将选取好的外文前沿文章准确地翻译成流畅的中文。如果你是数据科学/统计学/计算机专业的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友,数据派翻译组欢迎你们加入!

你能得到:提高对于数据科学前沿的认知,提高对外文新闻来源渠道的认知,海外的朋友可以和国内技术应用发展保持联系,数据派团队产学研的背景为志愿者带来好的发展机遇。

其他福利:和来自于名企的数据科学工作者,北大清华以及海外等名校学生共同合作、交流。

点击文末“阅读原文”加入数据派团队~


转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派THU ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。



点击“阅读原文”拥抱组织


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/hkBioY17qp
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/12149
 
462 次点击