方格精選

深入了解區塊鏈(二) - 如何使用Python來和區塊鏈進行互動

閱讀時間約 61 分鐘

前言

上一篇文章中,有和您分享了使用Ganache模擬了一個以太坊主網。想必您已經迫不及待的想對它進行更深入的了解了。本篇預計會使用Python來和您建立好的模擬網路進行互動。在開發套件的細節上我們並不會很深入的地為您進行解釋,而會透過一些簡單的例子來引導一個學習的方向。
本篇會需要您先準備好:
  1. Python 3環境 (有Jupyter環境更佳)
  2. 啟動上一篇所設定好的Ganache服務
  3. 安裝 web3.py 套件
PS. 若您是Node.js開發者,您也可以選用web3.js來進行開發,依您的開發習慣為主,web3.py和web3.js應都可以找到對應的方法使用。

讓我們開始吧

在上一篇的文章中,各位是否還記得我們使用了Metamask到Uniswap進行了Token交易?我們是否可以不使用Metamask,直接透過我們自己開發的程式(DApp)來和區塊鏈互動?接下來我們就會使用web3.py來一步一步達成這項功能。
  • (CLI) 啟動Ganache
ganache --fork.network mainnet --chain.networkId 1 --accounts 10 \
--wallet.seed 1337 --port 8545
  • (CLI) 安裝web3.py
pip install web3
以上就準備好基本環境了,首先我們先要知道我們在Uniswap交易使用的智能合約的地址為何?我們可以從Uniswap提供的文件得知這個地址
我們可以到etherscan.io中找到這個合約的資訊,它是一個Uniswap Router合約 (這個合約會根據我們的交易目的決定要跟那些下游合約作互動)
PS. 剛剛開啟的etherscan.io頁面建議保留著,等等還會用到
我們的目標是使用ETH換得1000個USDT,這筆交易的流程將會是以下:
  1. 將價值1000USDT的ETH換成WETH (將ETH封裝成ERC20 Token)
  2. 將這些等價的WETH換成1000 USDT (ERC20 Token pair互換)
  • 首先,開始一些Python的初始化工作
from web3 import HTTPProvider, Web3
import json
import time
#連線到剛啟動的Ganache RPC Server
web3 = Web3(HTTPProvider('http://127.0.0.1:8545'))
block = web3.eth.get_block('latest')
#可以看到目前的區塊高度等資訊
print(block)
  • 將一些關鍵的地址寫在變數中待用
#userAcc和userKey是此範例中區塊鍊新手的錢包地址和私鑰
#!IMPORTANT! 若和您生成的不一致時請自行修改
userAcc = web3.toChecksumAddress('0xC459cc3AC9f8462Be2EF00aAD02fAc7af2e97b14')
userKey = '0xda09f8cdec20b7c8334ce05b27e6797bef01c1ad79c59381666467552c5012e3'
#此為Uniswap router的合約地址,可以用來做Token的交換
UNI_ROUTER_ADDR = web3.toChecksumAddress('0x7a250d5630b4cf539739df2c5dacb4c659f2488d')
#此為封裝以太(WETH)的合約地址
WETH_ADDR = web3.toChecksumAddress('0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2')
#此為USDT的合約地址
USDT_ADDR = web3.toChecksumAddress('0xdac17f958d2ee523a2206206994597c13d831ec7')
  • 可以檢查一下目前錢包的餘額
balance_eth = web3.eth.get_balance(userAcc)
print('ETH:', balance_eth, 'wei')
ETH: 1000000000000000000000 wei
接下來,我們就要正式來跟合約互動了。首先我們必須取得Uniswap Router合約的ABI,它是智能合約的介面,讓其他應用可以對這些定義好的介面進行存取。您可以將它簡單的想像成它是智能合約各個Function的定義表,告訴您這個合約有哪些Function可以用,要傳入那些參數...等等。
您可以在剛剛開啟的etherscan.io頁面中找到這項資訊
在Contract → Code中可以找到合約相關資訊
您可以使用此按鈕來複製ABI內容
  • 找到ABI後,複製它的內容,並將它貼到Python的程式中,並以JSON格式讀取
    (您也可以將它寫到一個檔案中方便未來管理)
#首先我們需要先設定Uniswap Router的合約
#ABI介面可以從Etherscan得知: https://etherscan.io/address/0x7a250d5630b4cf539739df2c5dacb4c659f2488d#code
#將ABI字串貼到abi_txt變數裡
abi_txt = '''[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]'''
#以JSON格式讀取
abi = json.loads(abi_txt)
  • 接著我們可以使用web3.eth.contract()來實例化這個合約物件
uni_contract = web3.eth.contract(address=UNI_ROUTER_ADDR, abi=abi)
  • 在Uniswap Router合約中,有一個名為swapETHForExactTokens的function,它可以協助我們換取指定的Token
swap = uni_contract.functions.swapETHForExactTokens(
    1000 * 1000000, #想要購買的Token數量,1USDT=1,000,000單位
    [WETH_ADDR, USDT_ADDR], #交易的過程是 ETH → WETH → USDT,可以接受兩種以上的Token交換
    userAcc, #購買者地址
    (int(time.time()) + 10000) #交易等待的最長時間
)
  • 建立交易內容,nonce需要根據交易次數+1
    (實務上要根據token/gas時價進行精確計算,不過是模擬環境就先隨意設定)
#建立TXN內容
txn = swap.buildTransaction({
    'from': web3.toChecksumAddress(userAcc),
    'value': web3.toWei(1,'ether'), #因為要用ETH買ERC20幣,所以要發送足夠的ETH
    'gasPrice': web3.toWei('30','gwei'),
    "gas": 3000000,
    'nonce': web3.eth.get_transaction_count(userAcc), #User的歷史交易次數,從0開始遞增
})
  • 用私鑰簽屬該筆交易後,即可送出交易。Ganache預設會立即處理這筆交易,立即出一個新Block
#用私鑰簽屬交易並送出交易,Ganache預設會立即出塊
signed_txn = web3.eth.account.sign_transaction(txn, private_key=userKey)
tx_token = web3.eth.send_raw_transaction(signed_txn.rawTransaction)
print(web3.toHex(tx_token))
  • 交易成功,我們可以回到Metamask中察看交易結果是不是符合預期呢?
成功換到了1000USDT

後記

在這篇文章中,和大家分享了透過其他語言來和智能合約互動的方式。若您是初次接觸這種互動方式,也恭喜您跨出了DApp開發的第一步。透過Ganache模擬出來的網路,可以放心的做任何嘗試,不用擔心成本問題。未來若有機會開發Solidity智能合約,您也可以將合約上到Ganache中來進行測試,比使用testnet來得快速許多。
感謝您閱讀了這系列第二篇的文章,後續仍會進一步探討Ganache還能做那些有趣的功能,以及那些資料的分析。期待與您的再次相見。

作者Steve目前任職於趨勢科技區塊鏈安全研究小組,專注於區塊鏈合約安全與與相關技術,如果喜歡我的文章,或是想獲得更多區塊鏈詐騙事件懶人包,歡迎關注我的帳號
另外,我已經加入由趨勢科技防詐達人所成立的方格子專題-《區塊鏈生存守則》,在那裡我會跟其他優質的創作者一起帶大家深入瞭解區塊鏈,並隨時向大家更新區塊鏈資安事件
> 追蹤《區塊鏈生存守則》學習如何在區塊鏈的世界保護自己
> 關注防詐達人獲得其他最新詐騙情報
32會員
176內容數
我們整理了web3相關的熱門資安問題,包含加密貨幣投資詐騙、盜版NFT、空投釣魚和區塊鏈重大資安事件懶人包等等,並提供最完整的辨識方法教學,讓大家從0到1學習如何保護自己
留言0
查看全部
發表第一個留言支持創作者!
防詐達人的沙龍 的其他內容
詐騙加密貨幣交易平台BitVex利用Deepfake影片,在YouTube冒用馬斯克、幣安執行長趙長鵬以及方舟投資執行長Cathie Wood製造假影片宣傳BitVex,並宣稱可以獲得11%的獲利,事實上BitVex根本是加密貨幣釣魚網站,企圖詐騙民眾金錢、個人隱私資料及帳號密碼
所以礦工的挖礦能力和以太坊區塊難度的增減就造成生成區塊的時間跟預期結果不一樣的狀況,不過很少有人會去理會這種狀況,偶爾有幾個區塊就是會延遲發生,本文想知道他延遲發生的分配如何?
近期藝人、網紅們和幣圈資深玩家的虛擬貨幣錢包被盜,裡面的NFT或虛擬貨幣被轉走的案件頻傳,動輒損失幾千萬,擔心自己成為下一個受害者?趕快跟著防詐達人了解MetaMask小狐狸錢包是什麼?它如何運作?以及詐騙集團是用什麼手法把你的錢包騙到手的?看完這個MetaMask懶人包再也不擔心錢包被盜
關於乙太坊上的交易,通常我們都會到etherscan.io這個網站來進行確認。但初入區塊鏈的朋友們往往看到裡面一大堆的資訊,除了from和to外可能都是一頭霧水。想多了解些相關知識又不知如何下手才好,因此動念寫下一些本人初學區塊鏈時可能用來切入的一些工具,來和各位同好分享。
想打入幣圈獲得交流與學習,但要小心!詐騙集團其實就在你左右,有時甚至會在社群假裝客服,推出「幣安五週年回饋用戶BNB限時活動」,你以為你是客服選中的幸運兒,你正受到資產被洗劫的風險
全球疫情持續延燒,經濟下滑,導致很多人收入銳減,開始在積極尋找打工兼職補貼收入,但網路上其實夾雜許多詐騙集團製造的假工作,稱只需要幫忙領貨、領錢、跑跑腿就可以賺高薪,實則是騙你成為不法份子的車手、運毒犯…最後甚至落得被檢察官起訴的下場 疫情期間許多店家紛紛倒閉,物價也一直漲,就只有薪水沒有漲,有房貸
詐騙加密貨幣交易平台BitVex利用Deepfake影片,在YouTube冒用馬斯克、幣安執行長趙長鵬以及方舟投資執行長Cathie Wood製造假影片宣傳BitVex,並宣稱可以獲得11%的獲利,事實上BitVex根本是加密貨幣釣魚網站,企圖詐騙民眾金錢、個人隱私資料及帳號密碼
所以礦工的挖礦能力和以太坊區塊難度的增減就造成生成區塊的時間跟預期結果不一樣的狀況,不過很少有人會去理會這種狀況,偶爾有幾個區塊就是會延遲發生,本文想知道他延遲發生的分配如何?
近期藝人、網紅們和幣圈資深玩家的虛擬貨幣錢包被盜,裡面的NFT或虛擬貨幣被轉走的案件頻傳,動輒損失幾千萬,擔心自己成為下一個受害者?趕快跟著防詐達人了解MetaMask小狐狸錢包是什麼?它如何運作?以及詐騙集團是用什麼手法把你的錢包騙到手的?看完這個MetaMask懶人包再也不擔心錢包被盜
關於乙太坊上的交易,通常我們都會到etherscan.io這個網站來進行確認。但初入區塊鏈的朋友們往往看到裡面一大堆的資訊,除了from和to外可能都是一頭霧水。想多了解些相關知識又不知如何下手才好,因此動念寫下一些本人初學區塊鏈時可能用來切入的一些工具,來和各位同好分享。
想打入幣圈獲得交流與學習,但要小心!詐騙集團其實就在你左右,有時甚至會在社群假裝客服,推出「幣安五週年回饋用戶BNB限時活動」,你以為你是客服選中的幸運兒,你正受到資產被洗劫的風險
全球疫情持續延燒,經濟下滑,導致很多人收入銳減,開始在積極尋找打工兼職補貼收入,但網路上其實夾雜許多詐騙集團製造的假工作,稱只需要幫忙領貨、領錢、跑跑腿就可以賺高薪,實則是騙你成為不法份子的車手、運毒犯…最後甚至落得被檢察官起訴的下場 疫情期間許多店家紛紛倒閉,物價也一直漲,就只有薪水沒有漲,有房貸
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
在現今充斥著智慧型手機的世界裡,孩子對手機成癮的風險正在增加。一項臺灣大型研究指出,有近40%的高中生具有手機成癮風險,此問題同樣發生在國中和國小生當中。此外,該研究也發現青少年和兒童成癮者有些共同特徵,當學生出現這些特徵時,家長和教師就要留心了!
Thumbnail
「空白」的伊斯蘭史?真正空白的是我們貧乏的腦袋 本書講伊斯蘭發展史,是從創始者穆罕莫德的崛起談起,經歷了麥加、麥地那的戰鬥,與歷代哈里發(伊斯蘭的宗教及世俗的最高統治者)的擴張與轉型,打敗了拜占庭帝國和薩珊波斯帝國之後,取得了敘利亞、伊拉克、埃及、北非、伊比利半島,最後成為定都巴格達的伊斯蘭帝國…
Thumbnail
生成式AI(Generative AI)是近年來人工智慧領域中備受矚目的技術之一。它以機器學習為基礎,通過學習大量數據中的模式和關係,能夠生成各種新的內容,涵蓋文字、圖像、音訊等多個領域。本文將深入探討生成式AI的原理、優缺點以及應用範疇。
Thumbnail
什麼是慶餘年代儲? 在當今充滿刺激的手機遊戲世界中,慶餘年已經成為了眾多玩家的心頭好。然而,遊戲充值和購買虛擬貨幣等遊戲內物品有時可能讓玩家感到煩惱。為了讓遊戲變得更有趣且輕鬆,石頭手遊代儲網提供了慶餘年代儲服務。 為什麼選擇慶餘年代儲? 現在,您可能會想知道為什麼要選擇慶餘年代儲服務。以下是
Thumbnail
黃金作為投資資產的重要地位 黃金作為投資資產在金融市場中佔有重要地位,被廣泛用來達到多種投資目標,黃金具有以下的特性: 避險資產: 黃金被認為是一種避險資產,當其他市場(如股票、債券)波動性增加時,投資者可能轉向黃金以保值和分散風險。在經濟不穩定時期,投資者傾向於尋求相對較安全的投資選擇。 通
Thumbnail
讓我們來聊聊驅動行為的三大本能 §自保本能的一型人 §社會本能的一型人 §性本能的一型人 §總括來說
Thumbnail
當你覺察到自己有某項側翼的特質,你應當開心, 因為,與世界連結的方式又增加了另一種可能性。 § 側翼 § 具有四型側翼的五型人 § 具有六型側翼的五型人
Thumbnail
當你覺察到自己有某項側翼的特質,你應當開心, 因為,與世界連結的方式又增加了另一種可能性。 § 側翼 § 具有三型側翼的四型人 § 具有五型側翼的四型人
Thumbnail
當你覺察到自己有某項側翼的特質,你應當開心, 因為,與世界連結的方式又增加了另一種可能性。 § 側翼 § 具有二型側翼的三型人 § 具有四型側翼的三型人
Thumbnail
當你覺察到自己有某項側翼的特質,你應當開心, 因為,與世界連結的方式又增加了另一種可能性。 § 側翼 § 具有一型側翼的二型人 § 具有三型側翼的二型人
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
在現今充斥著智慧型手機的世界裡,孩子對手機成癮的風險正在增加。一項臺灣大型研究指出,有近40%的高中生具有手機成癮風險,此問題同樣發生在國中和國小生當中。此外,該研究也發現青少年和兒童成癮者有些共同特徵,當學生出現這些特徵時,家長和教師就要留心了!
Thumbnail
「空白」的伊斯蘭史?真正空白的是我們貧乏的腦袋 本書講伊斯蘭發展史,是從創始者穆罕莫德的崛起談起,經歷了麥加、麥地那的戰鬥,與歷代哈里發(伊斯蘭的宗教及世俗的最高統治者)的擴張與轉型,打敗了拜占庭帝國和薩珊波斯帝國之後,取得了敘利亞、伊拉克、埃及、北非、伊比利半島,最後成為定都巴格達的伊斯蘭帝國…
Thumbnail
生成式AI(Generative AI)是近年來人工智慧領域中備受矚目的技術之一。它以機器學習為基礎,通過學習大量數據中的模式和關係,能夠生成各種新的內容,涵蓋文字、圖像、音訊等多個領域。本文將深入探討生成式AI的原理、優缺點以及應用範疇。
Thumbnail
什麼是慶餘年代儲? 在當今充滿刺激的手機遊戲世界中,慶餘年已經成為了眾多玩家的心頭好。然而,遊戲充值和購買虛擬貨幣等遊戲內物品有時可能讓玩家感到煩惱。為了讓遊戲變得更有趣且輕鬆,石頭手遊代儲網提供了慶餘年代儲服務。 為什麼選擇慶餘年代儲? 現在,您可能會想知道為什麼要選擇慶餘年代儲服務。以下是
Thumbnail
黃金作為投資資產的重要地位 黃金作為投資資產在金融市場中佔有重要地位,被廣泛用來達到多種投資目標,黃金具有以下的特性: 避險資產: 黃金被認為是一種避險資產,當其他市場(如股票、債券)波動性增加時,投資者可能轉向黃金以保值和分散風險。在經濟不穩定時期,投資者傾向於尋求相對較安全的投資選擇。 通
Thumbnail
讓我們來聊聊驅動行為的三大本能 §自保本能的一型人 §社會本能的一型人 §性本能的一型人 §總括來說
Thumbnail
當你覺察到自己有某項側翼的特質,你應當開心, 因為,與世界連結的方式又增加了另一種可能性。 § 側翼 § 具有四型側翼的五型人 § 具有六型側翼的五型人
Thumbnail
當你覺察到自己有某項側翼的特質,你應當開心, 因為,與世界連結的方式又增加了另一種可能性。 § 側翼 § 具有三型側翼的四型人 § 具有五型側翼的四型人
Thumbnail
當你覺察到自己有某項側翼的特質,你應當開心, 因為,與世界連結的方式又增加了另一種可能性。 § 側翼 § 具有二型側翼的三型人 § 具有四型側翼的三型人
Thumbnail
當你覺察到自己有某項側翼的特質,你應當開心, 因為,與世界連結的方式又增加了另一種可能性。 § 側翼 § 具有一型側翼的二型人 § 具有三型側翼的二型人