美文网首页blockstackblockstack-Trans
naming-Clarity Smart Contracts-P

naming-Clarity Smart Contracts-P

作者: 空乱木 | 来源:发表于2019-08-02 07:31 被阅读2次

    FROM : https://docs.blockstack.org/core/smart/principals.html

    Principals是表示支出实体的Clarity本机类型。本节讨论Principals以及如何在Clarity中使用它们。

    Principals and tx-sender

    主体由公钥哈希或多签名栈地址表示。Clarity中的资产和Stacks区块链由主体类型的对象“拥有”;换句话说,主体对象类型可能拥有资产。

    给定的主体通过在Stacks区块链上发出已签名的事务对其资产进行操作。Clarity合约可以使用全局定义的tx-sender变量来获取当前主体。

    下面的用户定义函数在两个主体之间传输一个资产,在本例中是令牌:

    (define (transfer! (sender principal) (recipient principal) (amount int))
    (if (and
    (not (eq? sender recipient))
    (debit-balance! sender amount)
    (credit-balance! recipient amount))
    'true
    'false))

    主体的签名不是由智能合约来检查的,而是由虚拟机来检查的。

    智能合约作为主体

    智能合约本身是主体,由智能合约的标识符表示。在启动合约时创建标识符,例如,这里的合约标识符是hanomine。

    clarity-cli launch hanomine /data/hano.clar /data/db

    智能合约可以使用特殊的变量合约名称来引用它自己的主体。

    为了允许智能合约对其拥有的资产进行操作,智能合约可以使用特殊(as-contract expr)功能。这个函数执行表达式(作为参数传递),将tx-sender设置为合约的主体,而不是当前的发送方。as-contract函数返回所提供表达式的值。

    例如,实现类似于“token faucet”的智能合约可以这样实现:

    (define-public (claim-from-faucet)
    (if (is-none? (fetch-entry claimed-before (tuple (sender tx-sender))))
    (let ((requester tx-sender)) ;; set a local variable requester = tx-sender
    (begin
    (insert-entry! claimed-before (tuple (sender requester)) (tuple (claimed 'true)))
    (as-contract (stacks-transfer! requester 1)))))
    (err 1))

    在这个例子中,public函数claim-from-faucet:

    • 检查发送人是否曾向水龙头索取
    • 将tx发送方分配给请求方变量。
    • 向跟踪映射添加一个条目。
    • 使用as-contract发送一个微堆栈

    合约撰写者可以使用原始函数is合同吗?确定给定的主体是否对应于智能合约。

    与其他主体不同,没有与智能合约关联的私钥。由于缺少私钥,Clarity智能合约不能在区块链上广播已签署的事务。

    相关文章

      网友评论

        本文标题:naming-Clarity Smart Contracts-P

        本文链接:https://www.haomeiwen.com/subject/wruhdctx.html