【0基础】学习solidity开发智能合约-初识solidity

本篇课程开始,我们来学习一下如何使用solidity开发智能合约,由于博主对于solidity的学习,也是自学的,所以一些不足或有纰漏之处还望指出,大家共同进步,本系列课程会分很多节课讲述,从入门到进阶、实战,在课程最后,我们会通过所学知识来搭建几个不同类型的智能合约如Token合约、NFT合约等等,感兴趣的小伙伴加个关注吧。

一、什么是智能合约

这里引用一段摘自网络的话语来解释一下 

智能合约是区块链中四大核心技术之一,这个概念最开始是在1994年,由知名密码学家尼克·萨博提出的,可由于技术以及其他的一些原因一直都没有落地,哪怕到了今天,智能合约已经在互联网中很多的应用,比如自动还款,无人机售货等等,也多是局限在个人和机构之间的智能合约,个人和个人之间的智能合约几乎没有,原因就在于“信任”问题,我们会发现,只要谈起合约,大多数都是陌生人跟陌生人之间有这种需求,而且还跟钱有关系,如果在没有第三方做担保的情况下我们之间做了个约定,我把钱打给你,结果你毁约了,不承认怎么办?所以智能合约一直没办法在个人与个人之间普及,后来随着区块链的出现,人们发现,区块链与智能合约十分的契合,因为区块链的很多特点,比如去中心化,数据的不可篡改等,可以从技术的角度,去解决陌生人之间的信任问题,这才使智能合约大规模的应用成为可能,这一阶段的开始以以太坊的诞生为标志。在区块链的基础上,以太坊应用了智能合约技术。智能合约使得以太坊可以实现更多功能,智能合约是一个非常重要的应用,于是,慢慢的,智能合约就成了区块链的核心技术之一。 

总结来说,智能合约就是一个写好的程序脚本,它会在一个虚拟机上运行,且不受外界的干扰,所以能保证最大化的公平、公正、公开性。

以太坊作为区块链2.0的代表,它的设计理念和底层系统设计,让它逐渐被大众所认可,从现在开始我们就准备在以太坊上进行智能合约的开发(你可能听过bsc、trc、matic 等等区块链,它们都是基于以太坊虚拟机EVM开发的区块链网络,所以在以太坊上编写的智能合约,在这些网络上均可以使用)

二、什么是solidity

solidity是用于实现智能合约的一种面向合约的高级编程语言,solidity受到C++、Python和JavaScript的影响,被设计为可运行在以太坊虚拟机(EVM)上,所以用户无需担心代码的可移植性和跨平台等问题。solidity是一种静态类型的语言,支持继承、库引用等特性,并且用户可自定义复杂的结构类型。

 三、合约文件

一个简单的合约文件大概如下图所示:

我们来看一段示例代码,里面有一些简单的注释,可以结合着查看

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;  //solidity编译版本声明

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";  //第三方文件引入

//合约声明
contract DemoToken is ERC20 {
    address owner; //地址变量
    uint256 total = 5000000 * 10**18; //数字变量

    //构造器
    constructor() ERC20("demoToken", "DT") {
        owner = msg.sender;
        _mint(msg.sender, total);
    }

    //方法
    function getTotal() public view onlyOwner returns (uint256) {
        return total;
    }

    //修饰符
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }
}
  • 首先,第一行表示代码许可说明,可选项很多,大家可以自行查询
// SPDX-License-Identifier: MIT
  •  第二行声明了我们编译合约代码的solidity版本,其中^表示最低版本为0.8.17,当前该合约也不会被0.9.0以上版本编译
pragma solidity ^0.8.17;  //solidity编译版本声明
  • 第三行,我们引入了一个其他合约文件,solidity里允许我们引用其他的合约文件,这个暂时先不展开讲解,后面课程里我们会具体说明,大家先有个印象即可
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";  //第三方文件引入
  •  第四行,我们声明了一个合约对象,它是以 contract开头的结构 (is ERC20 表示继承了ERC20合约,后面详细讲解)
contract DemoToken is ERC20 {
  • 第五、六行,我们定义了两个变量,关于solidity的变量类型,下一章我们会仔细讲解
    address owner; //地址变量
    uint256 total = 5000000 * 10**18; //数字变量
  • 然后我们声明了一个结构体,它在合约部署的时候会调用,我们可以在里面写一些初始化逻辑,如变量赋值、方法调用等
constructor() ERC20("demoToken", "DT") {
        owner = msg.sender;
        _mint(msg.sender, total);
    }
  •  接着,我们声明了一个函数,仔细看它的声明语法有点类似JavaScript,但是后面一些地方却与JavaScript又有一些不同,它多了一些 public、view 等字段(关于这些多出来的字段,后面也会进行详细介绍)
 //方法
    function getTotal() public view onlyOwner returns (uint256) {
        return total;
    }
  •  最后,我们定义了一个修饰符,它在合约里可以说是有着举足轻重的地位,在这里大家有个印象即可,在后面的课程里都会一一介绍
  //修饰符
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

通过本节课程的学习,我们先是简单了解了智能合约的概念,接着又对一个智能合约的组成部分进行了简单的分析,让我们对智能合约有了一个基本的概念,下一节课,我们将要学习一下solidity里的变量类型有哪些

 更多web3、区块链技术和前沿资讯,请关注公众号:外柏叁布道者(web3_preacher

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
智能合约是一种在区块链上执行的自动化合约。Python是一种常用的编程语言,也可以用于编写智能合约。在Python中,可以使用一些库来编写智能合约,例如Web3.py和Solidity.py。下面是一个使用Web3.py库编写智能合约的示例: ```python from web3 import Web3 # 连接到以太坊节点 w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/your-infura-project-id')) # 加载智能合约ABI contract_abi = [ { "constant": False, "inputs": [ { "name": "x", "type": "uint256" } ], "name": "set", "outputs": [], "payable": False, "stateMutability": "nonpayable", "type": "function" }, { "constant": True, "inputs": [], "name": "get", "outputs": [ { "name": "", "type": "uint256" } ], "payable": False, "stateMutability": "view", "type": "function" } ] # 部署智能合约 contract_address = '0x1234567890abcdef1234567890abcdef12345678' contract = w3.eth.contract(address=contract_address, abi=contract_abi) # 调用智能合约方法 transaction = contract.functions.set(42).buildTransaction({ 'from': w3.eth.accounts[0], 'gas': 100000, 'gasPrice': w3.toWei('1', 'gwei'), 'nonce': w3.eth.getTransactionCount(w3.eth.accounts[0]) }) signed_transaction = w3.eth.account.signTransaction(transaction, private_key='your-private-key') transaction_hash = w3.eth.sendRawTransaction(signed_transaction.rawTransaction) transaction_receipt = w3.eth.waitForTransactionReceipt(transaction_hash) # 获取智能合约状态 result = contract.functions.get().call() print("智能合约状态:", result) ``` 请注意,上述示例中的合约ABI和地址是虚构的,您需要根据您自己的合约来替换它们。此外,您还需要替换连接到以太坊节点的URL和私钥。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

外柏叁布道者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值