年轻人的第一个智能合约

年轻人,是否想拥有你的第一个智能合约?

下面,我们将一起在 Remix 上编写、部署和测试年轻人的第一个智能合约,该合约实现了一个简单的区块链通讯录,主要包括如下几个功能:

  • 添加联系人,包括姓名和手机号;
  • 查询所有联系人姓名;
  • 查询指定联系人的手机号;

合约概览

智能合约代码使用 Solidity 编写,完整的代码如下所示:

// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

contract BlockChainContactList {
    
    //“王五”,“13598534006”
    mapping(string => string) private nameToPhone;
    // 用于存储所有的名字
    string[] private names; 

    function addContact(string calldata _name, string calldata _phone) public {
        // 如果是新联系人,则添加到数组中
        if(bytes(nameToPhone[_name]).length == 0) { 
            names.push(_name);
        }
        nameToPhone[_name] = _phone;
    }

    function getContact(string calldata _name) public view returns (string memory) {
        return nameToPhone[_name];
    }

    function getAllContactNames() public view returns (string[] memory) {
        return names;
    }
}

Solidity 代码详解

下面我们来详细看一下上述代码的各个组成部分

许可声明

// SPDX-License-Identifier: MIT

这行代码是一个 SPDX 许可证标识符注释,用于明确指定智能合约源代码的许可证类型。上面的代码表明该智能合约遵循 MIT 许可,属于非常宽松的一种许可,允许人们几乎无任何限制地使用、复制、修改和分发软件,唯一的要求是在软件的所有副本和重要的文档内容中都必须包含版权声明和许可声明。

Solidity 版本声明

pragma solidity 0.8.24;

这行代码是Solidity语言中的一个编译指令,用于指定智能合约的编译器版本。这行代码告诉Solidity编译器,该合约是为Solidity版本0.8.24编写的,因此编译这个合约时应该使用版本0.8.24的编译器。除了上述指定版本的写法,还可以通过如下方式,指定版本的范围:


pragma solidity ^0.8.0; //表示合约兼容Solidity 0.8.0及以上的版本,但小于0.9.0(不包含0.9.0)。
pragma solidity >=0.8.0 <0.9.0; //具有相同的意义,表示合约兼容的版本范围是从0.8.0(包含)到0.9.0(不包含)

智能合约定义

contract BlockChainContactList {
    ............
}

上面的代码在 Solidity 中定义了一个名为 BlockChainContactList 的智能合约。在Solidity语言中,contract关键字用于声明一个新的智能合约,类似于许多面向对象编程语言中的 class 关键字。智能合约是区块链上的一个程序,它包含了一组规则以及这些规则的自动执行逻辑。一旦部署到区块链上,智能合约在交易触发时按照编写的逻辑自动执行操作。

合约变量定义

    //“王五”,“13598534006”
    mapping(string => string) private nameToPhone;
    // 用于存储所有的名字
    string[] private names; 

上面的代码定义了两个private变量,只能够被合约内部的函数访问。其中一个是map类型的变量,一个是array类型的变量。

合约函数定义

    function addContact(string calldata _name, string calldata _phone) public {
        // 如果是新联系人,则添加到数组中
        if(bytes(nameToPhone[_name]).length == 0) { 
            names.push(_name);
        }
        nameToPhone[_name] = _phone;
    }

    function getContact(string calldata _name) public view returns (string memory) {
        return nameToPhone[_name];
    }

    function getAllContactNames() public view returns (string[] memory) {
        return names;
    }

上面的代码,定义了三个智能合约函数,public 意味着函数可以被智能合约外部访问。

  • addContact 接收两个参数,没有返回值,用于添加通讯录信息;
  • getContact 接收一个参数,返回一个参数,用于查询指定联系人的手机号;
  • getAllContactNames 没有参数,返回一个参数,用于查询通讯录中的所有联系人姓名;

上面的代码中,可以看到参数和返回值有calldatamemory两个关键字,它们是用来指定数据的存储位置和可变性。

calldata是一个不可修改的temporary存储区域。当函数有外部参数时,这些参数是完全存储在calldata区域中。对calldata区域的数据访问不会产生任何副本,因为它只是直接从调用数据中读取。由于calldata区域是不可修改的,所以在函数内部不能修改通过calldata传入的参数。

memory是一个可变的临时存储区域,用于存储可变数据。每次函数调用时,都会为memory分配新的空间。从memory中分配新的对象时会创建对象的一个全新副本。通过值传递方式在函数中修改memory中的变量不会影响外部变量。

编译、部署和测试

上述智能合约的编译、部署和测试均在Remix中进行。Remix是一个强大的开源Web和桌面应用程序,专为以太坊智能合约的开发、测试、部署和调试而设计。它支持Solidity语言,是以太坊开发者社区中广泛使用的一个工具。Remix提供了一个用户友好的界面,使得无论是经验丰富的开发者还是刚入门的新手都能轻松上手。

编译

将代码贴到Remix中之后,点击左侧的编译图标。

file

选择对应版本的编译器,点击编译按钮。

file

部署

编译完成后,点击部署图标。

file

选择部署的环境(Remix虚拟环境)、账户(Remix提供的测试账户),点击部署按钮。部署成功后,左下角即出现部署好的智能合约可以被调用的函数。

file

部署成功后,在控制台可以看到该笔交易的详情(对区块链做的任何修改的操作,实质上都是发起了交易)。其中的input,就是编译后的智能合约的内容。

file

测试

部署完智能合约之后,就可以调用合约的函数来进行测试。

调用addContact函数

file

调用getAllContactNames函数

file

调用getContact函数

file

本文由博客一文多发平台 OpenWrite 发布!

  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,但是PHP并不是用来编写智能合约的语言。智能合约通常使用Solidity语言编写,然后在以太坊平台上部署和执行。如果你想了解如何使用PHP与智能合约进行交互,我可以为你提供一些相关信息。 在与智能合约进行交互时,你可以使用以太坊的Web3.js库。Web3.js是一个JavaScript库,它允许你与以太坊网络进行交互,并与智能合约进行通信。 以下是一个使用PHP与Web3.js库进行智能合约交互的示例: ```php <?php require_once 'vendor/autoload.php'; use Web3\Web3; use Web3\Contract; use Web3\Utils; $web3 = new Web3('http://localhost:8545'); // 这里的URL是你以太坊节点的RPC地址 $contractAddress = '0x1234567890abcdef'; // 智能合约地址 $contractABI = '[{"constant":true,"inputs":[],"name":"getCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"setCount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]'; // 智能合约ABI $contract = new Contract($web3->provider, $contractABI); $contract->at($contractAddress); // 调用智能合约的方法 $result = $contract->call('getCount'); $count = Utils::toDec($result); echo "当前计数:$count"; // 发送交易调用智能合约的方法 $account = '0xabcdef1234567890'; // 发送交易的账户地址 $privateKey = '0xabcdef1234567890'; // 发送交易的账户私钥 $web3->personal->unlockAccount($account, 'password', 60); // 解锁账户 $transaction = $contract->send('setCount', [42], $account, [ 'gas' => 300000, 'gasPrice' => 20e9, 'nonce' => $web3->eth->getTransactionCount($account), 'from' => $account, 'value' => 0, 'chainId' => 1, 'privateKey' => $privateKey, ]); echo "交易哈希:{$transaction->hash}"; ?> ``` 请注意,上述示例中的代码是使用PHP的Web3.php库与智能合约进行交互的基本示例。你需要根据你的具体情况进行适当的修改和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值