资讯专栏INFORMATION COLUMN

通过7个Python函数来解释区块链

MrZONT / 2116人阅读

摘要:所以不用多说,让我们看看我们的个函数区块链的核心是函数。读取前一个区块的信息,并将其用于将其链接到新区块。这也是区块链理念的核心。以太坊开发教程,主要是针对和程序员进行区块链以太坊开发的详解。

我想对于那里的很多人来说,区块链就是这种现象,很难不让你头脑发热。我开始观看视频和阅读文章,但对我个人而言,直到我编写自己的简单区块链,我才真正理解它是什么以及它的潜在应用价值。

我对区块链的看法是它是一个公开的加密数据库。如果你是亚马逊并且你想使用该技术来跟踪库存水平,那么使用区块链是否有意义?可能没有,因为你的客户不想花费资源来验证你的区块链,因为他们只顾看着网站说Only 1 left!

我会让你考虑未来的应用。所以不用多说,让我们看看我们的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()

区块链的核心是hash函数。如果没有加密,区块链将易于操作,并且交易将能够以欺诈方式写入。

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

state是来记录谁拥有代币交易情况。例如,我有10个代币,我给1到Medium,然后状态state将是下面字典的值。

{‘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个函数。我们如何与它互动?好吧,首先我们需要用Genesis Block启动我们的区块链。这是我们的新代币(或库存等)的开始。出于本文解释说明的目的,我会说我是Tom,将从拥有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)

state更新显示谁拥有多少代币:

{"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"}]

我们创建了第一个新交易并将其插入到堆栈顶部。现在,我希望我已经激起了你的好奇心,并且有兴趣将代码复制下来并使用它。在我看来,这是学习新技术的最佳方式 ——进入它。

玩代码并制作自己的代币。如果你试图提供比目前存在的更多代币会怎么样? 如果你继续创造新的收款人,会发生什么?

你能想到区块链的未来应用吗?

======================================================================

分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:

python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。

java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。

php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。

以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。

以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。

C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。

EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。

java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。

php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。

这里是原文

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/24334.html

相关文章

  • 通过7Python函数解释区块

    摘要:所以不用多说,让我们看看我们的个函数区块链的核心是函数。读取前一个区块的信息,并将其用于将其链接到新区块。这也是区块链理念的核心。以太坊开发教程,主要是针对和程序员进行区块链以太坊开发的详解。 我想对于那里的很多人来说,区块链就是这种现象,很难不让你头脑发热。我开始观看视频和阅读文章,但对我个人而言,直到我编写自己的简单区块链,我才真正理解它是什么以及它的潜在应用价值。 我对区块链的看...

    wangzy2019 评论0 收藏0
  • 如何利用Python库Web3.py和Infura在Windows中设置托管以太坊节点

    摘要:第步启用与以太坊区块链交互从获得后。我希望本教程介绍了通过在操作系统中设置托管以太坊节点的基本步骤。这里是原文和中设置以太坊托管节点 如果你想与以太坊区块链进行交互以获取最新区块的详细信息,可以使用以太网节点、本地节点或托管节点连接到以太坊区块链的交易信息或发送交易。由于有许多第三方插件和应用程序可用于执行此操作,你可能会认为我们为什么需要一个节点。如果要部署智能合约或使用脚本自动与智...

    tuantuan 评论0 收藏0
  • 如何利用Python库Web3.py和Infura在Windows中设置托管以太坊节点

    摘要:第步启用与以太坊区块链交互从获得后。我希望本教程介绍了通过在操作系统中设置托管以太坊节点的基本步骤。这里是原文和中设置以太坊托管节点 如果你想与以太坊区块链进行交互以获取最新区块的详细信息,可以使用以太网节点、本地节点或托管节点连接到以太坊区块链的交易信息或发送交易。由于有许多第三方插件和应用程序可用于执行此操作,你可能会认为我们为什么需要一个节点。如果要部署智能合约或使用脚本自动与智...

    jaysun 评论0 收藏0
  • 如何利用Python库Web3.py和Infura在Windows中设置托管以太坊节点

    摘要:第步启用与以太坊区块链交互从获得后。我希望本教程介绍了通过在操作系统中设置托管以太坊节点的基本步骤。这里是原文和中设置以太坊托管节点 如果你想与以太坊区块链进行交互以获取最新区块的详细信息,可以使用以太网节点、本地节点或托管节点连接到以太坊区块链的交易信息或发送交易。由于有许多第三方插件和应用程序可用于执行此操作,你可能会认为我们为什么需要一个节点。如果要部署智能合约或使用脚本自动与智...

    AlphaGooo 评论0 收藏0
  • 通过Python入门区块

    摘要:通过入门区块链本文翻译自的文章原文地址区块链可能是继互联网之后最重大和最具突破性的技术。先不管对比特币和其他加密货币价格的疯狂行情,本文旨在帮助读者入门区块链技术。 通过Python入门区块链 本文翻译自 Adil Moujahid 的文章 A Practical Introduction to Blockchain with Python原文地址:http://adilmoujahi...

    andong777 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<