智能合约学习(持续更新中)

Posted 无名函数

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了智能合约学习(持续更新中)相关的知识,希望对你有一定的参考价值。

什么是智能合约

智能合约(Smart Contract)是上世纪90年代由密码学家尼克·萨博提出的理念,由于当时缺乏可信的执行环境,智能合约没有被应用和发展,直到以太坊的出现,才让智能合约得以“复活”。

智能合约是以太坊应用程序的基石。 它们是存储在区块链上的计算机程序,让我们能够将传统合约转换成对应的数字化合约。

智能合约就是用计算机语言取代了法律语言记录条款并由程序自动执行的合约。换句话说,智能合约就是传统合约的数字化版本,跑在区块链网络上,由程序自动执行。

创造了“智能合约”这一术语的尼克·萨博于1994 年撰写了概念简介,1996 年又撰写了探索智能合约的功能

智能合约的特点

与传统的合约相比,智能合约有如下特点:
1、合约内容公开透明
2、合约内容不可篡改
3、永久运行

智能合约与传统的合约相比,有如下优势:
1、去中心化信任
2、经济、高效
3、无需第三方仲裁

但是智能合约同样存在缺陷,智能合约让区块链网络上执行的交易效率更高,同时,由于它是无法修改的,也由此要谨慎查看协议。

一个最常举的例子:自动售卖机

智能合约就好比生活中常见的自动售货机,它也是一个智能合约系统,用户选择商品,完成支付后,售货机自动吐出商品。完全不需要担心是否会存在付了钱但是商家不卖了,不需要担心是否存在不付钱就将商品带走的问题,也不需要考虑是否需要担保人,这些都是是系统自动设定好的程序

因为这个系统不信任任何东西,所以我们可以信任它

在线资源整理

在线Remix IDE:https://remix.ethereum.org
登链社区教程:https://learnblockchain.cn/docs/solidity/introduction-to-smart-contracts.html#
智能合约编程宝库:http://www.codebaoku.com/smartcontract/smartcontract-index.html
以太坊:https://ethereum.org/zh/
B站solidity教程:https://www.bilibili.com/video/BV1St411a7Pk/?spm_id_from=333.337.search-card.all.click&vd_source=5b448fe66cbde337ec04665dd9f1c19a

学习笔记

智能合约学习笔记——solidity语法(一)
智能合约学习笔记——solidity语法(二)
智能合约学习笔记——随机数攻击复现
智能合约学习笔记——solidity语法(三)
智能合约学习笔记——僵尸工厂(一)
智能合约学习笔记——自毁函数攻击复现

只有合约的所有者才能更新智能合约 - Solidity

【中文标题】只有合约的所有者才能更新智能合约 - Solidity【英文标题】:Only the owner of the contract can update the smart contract - Solidity 【发布时间】:2021-11-28 14:13:48 【问题描述】:

我正在开发一个保存用户信息的智能合约。问题是当我尝试从没有部署合约的地址更新用户信息时,请求成功但用户信息没有变化。但是,当我从部署合同的地址更改用户信息时,它会更改所有用户的用户信息。就像更改会反映在所有帐户上一样,无论帐户是否不同。

function setUserName(string memory _userName) public 
    users[msg.sender].userName = _userName;

这是我更新用户信息的函数。我相信“msg.sender”是调用合约的那个,而不是部署合约的那个。我正在为帐户使用 metamask 和 ganache。第一个帐号添加到 chrome 浏览器的 metamask,第二个帐号添加到 mozilla firefox 的 metamask。

重现用户名错误的步骤:

    打开两个不同的浏览器 启动 ganache 服务器 在浏览器中,将第一个地址的私钥添加到元掩码中 为了添加 ETH 在浏览器二中将第二个地址的私钥添加到元掩码中 为了添加 ETH 使用“truffle migrate --reset”部署合约 它将迁移 ganache 中第一个地址的合约 从浏览器两个尝试更新用户名。你会看到的 更新成功但用户名没有更新(甚至 刷新后)。 现在从浏览器一中通过转到设置来更新用户名 页。您将看到用户名已更新,并且此更改为 也反映在浏览器二上,不管地址是什么 从浏览器的改变。 当我们尝试通过交换代币获得积分时也会发生同样的情况。从浏览器一请求成功,但从浏览器二它抛出一个错误,指示“ERC20:转账金额超过余额”。甚至用户的帐户中都有令牌。

编辑

我已经找到了解决这个问题的方法。问题是数据被正确保存,但是在获取记录时,solidity 将 msg.sender 分配给合约的创建者,而不是发送交易的人。因此,为了解决这个问题,我在调用函数中从前端发送用户地址,并在各个函数中接收地址作为参数。因此,我没有使用 msg.sender,而是使用从前端收到的地址。

【问题讨论】:

您是否尝试过在 etherscan 等浏览器上查看交易? 谢谢@JacopoMosconi。我想出了一个办法来处理这个问题。问题是数据被正确保存,但是在获取记录时,solidity 将 msg.sender 分配给合约的创建者,而不是发送交易的人。因此,为了解决这个问题,我在调用函数中从前端发送用户地址,并在各个函数中接收地址作为参数。因此,我没有使用 msg.sender,而是使用从前端收到的地址。 【参考方案1】:

回答问题

我已经找到了解决这个问题的方法。问题是数据被正确保存,但是在获取记录时,solidity 将 msg.sender 分配给合约的创建者,而不是发送交易的人。因此,为了解决这个问题,我在调用函数中从前端发送用户地址,并在各个函数中接收地址作为参数。因此,我没有使用 msg.sender,而是使用从前端收到的地址。

【讨论】:

以上是关于智能合约学习(持续更新中)的主要内容,如果未能解决你的问题,请参考以下文章

解读区块链智能合约!

北大肖臻老师《区块链技术与应用》系列课程学习笔记[23]以太坊-智能合约-3

区块链Solidity智能合约语言学习笔记

北大肖臻老师《区块链技术与应用》系列课程学习笔记[25]以太坊-智能合约-5

Ubuntu20.04初步学习区块链部署简单的智能合约

区块链入门Truffle 项目实战,Solidity IDE, 智能合约部署